MariaDB Docker 容器使用数据卷 - 错误 2002,无法通过套接字连接
MariaDB Docker container using data volume - Error 2002, can't connect through socket
我已经在 Docker 容器中安装了 MariaDB,它工作得很好。我想将数据目录移动到外部卷以将数据库与容器生命周期分开。我遵循了说明 here,但是当我现在尝试连接到引擎时,我得到:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/www/databases/mysqld/mysqld.sock' (2)
"/var/www/" 是外部卷的挂载点。我想知道这是否是权限问题,所以我将 MariaDB 容器中数据库文件夹的所有者设置为 'myqsl',即 MySQL 帐户的名称。
drwxr-xr-x 3 mysql mysql 4096 Jan 15 16:38 databases
drwxr-xr-x 3 1000 1000 4096 Jan 15 13:59 files
drwxr-xr-x 2 1000 1000 4096 Jan 15 15:20 html
drwxr-xr-x 3 1000 1000 4096 Jan 15 13:59 src
注意:在主机文件系统中,所有者被列为 999:docker。这有关系吗??
drwxr-xr-x 3 999 docker 4096 Jan 15 16:38 databases
我缺少什么允许我将我的数据库存储在卷中?
这是我的 /etc/MySQL/my.cnf 文件的部分转储(定义各种文件夹的位):
[client]
port = 3306
#socket = /var/run/mysqld/mysqld.sock
socket = /var/www/databases/mysqld/mysqld.sock
# Here is entries for some specific programs
# The following values assume you have at least 32M ram
# This was formally known as [safe_mysqld]. Both versions are currently parsed.
[mysqld_safe]
#socket = /var/run/mysqld/mysqld.sock
socket = /var/www/databases/mysqld/mysqld.sock
nice = 0
[mysqld]
#
# * Basic Settings
#
#user = mysql
pid-file = /var/run/mysqld/mysqld.pid
#socket = /var/run/mysqld/mysqld.sock
socket = /var/www/databases/mysqld/mysqld.sock
port = 3306
basedir = /usr
#datadir = /var/lib/mysql
datadir = /var/www/databases
tmpdir = /tmp
lc_messages_dir = /usr/share/mysql
lc_messages = en_US
skip-external-locking
docker-compose.yml:
这是我的 yml 文件的内容。我是这个东西的初学者,所以它可能充满了漏洞。请善待。 :)
version: '3.2'
volumes:
mwApache2Data:
external: true
webContent:
external: true
networks:
frontend:
backend:
services:
php:
build: './php7.1/'
image: php7.1.26-fpm:1.0
restart: always
container_name: php7.1.26-fpm
networks:
- backend
# volumes:
# - mwApache2Data:/app
web:
build: ./apache2/
image: apache2:1.0
restart: always
container_name: AOW_apache2Server
depends_on:
- php
- mariadb
networks:
- frontend
- backend
expose:
- "80"
- "81"
- "443"
- "8083"
ports:
- "80:80"
- "81:81"
- "443:443"
- "8083:8083"
volumes:
- mwApache2Data:/app
- webContent:/var/www
mariadb:
build: ./mariaDB/
image: mariadb_10.4.0
container_name: mariaDB_10.4.0
restart: always
networks:
- backend
environment:
- MYSQL_DATABASE=lg_wiki_db
- MYSQL_USER=wikiuser
- MYSQL_PASSWORD=****
- MYSQL_ROOT_PASSWORD=****
volumes:
- webContent:/var/www
mediawiki:
image: mediawiki:1.31.1
container_name: mediawiki_1.31.1
restart: always
depends_on:
- web
networks:
- backend
# ports:
# - 8080:80
links:
- mariadb
volumes:
- webContent:/var/www/
# After initial setup, download LocalSettings.php to the same directory as
# this yaml and uncomment the following line and use compose to restart
# the mediawiki service
# - ./LocalSettings.php:/var/www/html/LocalSettings.php
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: phpmyadmin
restart: always
depends_on:
- web
expose:
- 80
networks:
- frontend
- backend
ports:
- 8080:80
links:
- mariadb
您是否尝试过在 docker-compose 中安装卷 /var/www/databases?
按照您链接的示例,我应该建议:
...
mysql:
image: mysql:5.6.40
networks:
- backend
environment:
- MYSQL_ROOT_PASSWORD=rootpassword
volumes:
- ./your_persistent_db_data_dir:/var/www/databases
另外要考虑的是网络问题。在那种情况下,我应该尝试在所有这些人之间共享 docker 网络,将 network_mode: host
添加到您想要在 them.here`
之间进行通信的每个服务
最后,如果这些都对您没有帮助,我会尝试的另一件事是尝试在您的主机中安装 MariaDB 并将文件 /var/www/databases/mysqld/mysqld.sock 作为卷装载。这不是推荐的,不是很优雅,而且我知道,目标是在 docker 中有 DB,在外部有持久数据。
谢谢大家的指教。最后,我在这方面找到了一些内部支持。
诀窍是将默认数据库文件夹挂载为外部卷:
volumes:
- databases:/var/lib/mysql
这主要是即时有效的。唯一需要注意的是,我的撰写文件定义了 MySQL root 凭据。这些在挂载时被覆盖,所以我不得不在第一次启动容器时手动重置 root 密码。实际上这现在应该得到修复,因为数据目录现在位于卷的外部,因此新映像应该使用相同的 root 密码。应该能够将此更改编写到安装文件中。
我已经在 Docker 容器中安装了 MariaDB,它工作得很好。我想将数据目录移动到外部卷以将数据库与容器生命周期分开。我遵循了说明 here,但是当我现在尝试连接到引擎时,我得到:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/www/databases/mysqld/mysqld.sock' (2)
"/var/www/" 是外部卷的挂载点。我想知道这是否是权限问题,所以我将 MariaDB 容器中数据库文件夹的所有者设置为 'myqsl',即 MySQL 帐户的名称。
drwxr-xr-x 3 mysql mysql 4096 Jan 15 16:38 databases
drwxr-xr-x 3 1000 1000 4096 Jan 15 13:59 files
drwxr-xr-x 2 1000 1000 4096 Jan 15 15:20 html
drwxr-xr-x 3 1000 1000 4096 Jan 15 13:59 src
注意:在主机文件系统中,所有者被列为 999:docker。这有关系吗??
drwxr-xr-x 3 999 docker 4096 Jan 15 16:38 databases
我缺少什么允许我将我的数据库存储在卷中?
这是我的 /etc/MySQL/my.cnf 文件的部分转储(定义各种文件夹的位):
[client]
port = 3306
#socket = /var/run/mysqld/mysqld.sock
socket = /var/www/databases/mysqld/mysqld.sock
# Here is entries for some specific programs
# The following values assume you have at least 32M ram
# This was formally known as [safe_mysqld]. Both versions are currently parsed.
[mysqld_safe]
#socket = /var/run/mysqld/mysqld.sock
socket = /var/www/databases/mysqld/mysqld.sock
nice = 0
[mysqld]
#
# * Basic Settings
#
#user = mysql
pid-file = /var/run/mysqld/mysqld.pid
#socket = /var/run/mysqld/mysqld.sock
socket = /var/www/databases/mysqld/mysqld.sock
port = 3306
basedir = /usr
#datadir = /var/lib/mysql
datadir = /var/www/databases
tmpdir = /tmp
lc_messages_dir = /usr/share/mysql
lc_messages = en_US
skip-external-locking
docker-compose.yml:
这是我的 yml 文件的内容。我是这个东西的初学者,所以它可能充满了漏洞。请善待。 :)
version: '3.2'
volumes:
mwApache2Data:
external: true
webContent:
external: true
networks:
frontend:
backend:
services:
php:
build: './php7.1/'
image: php7.1.26-fpm:1.0
restart: always
container_name: php7.1.26-fpm
networks:
- backend
# volumes:
# - mwApache2Data:/app
web:
build: ./apache2/
image: apache2:1.0
restart: always
container_name: AOW_apache2Server
depends_on:
- php
- mariadb
networks:
- frontend
- backend
expose:
- "80"
- "81"
- "443"
- "8083"
ports:
- "80:80"
- "81:81"
- "443:443"
- "8083:8083"
volumes:
- mwApache2Data:/app
- webContent:/var/www
mariadb:
build: ./mariaDB/
image: mariadb_10.4.0
container_name: mariaDB_10.4.0
restart: always
networks:
- backend
environment:
- MYSQL_DATABASE=lg_wiki_db
- MYSQL_USER=wikiuser
- MYSQL_PASSWORD=****
- MYSQL_ROOT_PASSWORD=****
volumes:
- webContent:/var/www
mediawiki:
image: mediawiki:1.31.1
container_name: mediawiki_1.31.1
restart: always
depends_on:
- web
networks:
- backend
# ports:
# - 8080:80
links:
- mariadb
volumes:
- webContent:/var/www/
# After initial setup, download LocalSettings.php to the same directory as
# this yaml and uncomment the following line and use compose to restart
# the mediawiki service
# - ./LocalSettings.php:/var/www/html/LocalSettings.php
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: phpmyadmin
restart: always
depends_on:
- web
expose:
- 80
networks:
- frontend
- backend
ports:
- 8080:80
links:
- mariadb
您是否尝试过在 docker-compose 中安装卷 /var/www/databases? 按照您链接的示例,我应该建议:
...
mysql:
image: mysql:5.6.40
networks:
- backend
environment:
- MYSQL_ROOT_PASSWORD=rootpassword
volumes:
- ./your_persistent_db_data_dir:/var/www/databases
另外要考虑的是网络问题。在那种情况下,我应该尝试在所有这些人之间共享 docker 网络,将 network_mode: host
添加到您想要在 them.here`
最后,如果这些都对您没有帮助,我会尝试的另一件事是尝试在您的主机中安装 MariaDB 并将文件 /var/www/databases/mysqld/mysqld.sock 作为卷装载。这不是推荐的,不是很优雅,而且我知道,目标是在 docker 中有 DB,在外部有持久数据。
谢谢大家的指教。最后,我在这方面找到了一些内部支持。
诀窍是将默认数据库文件夹挂载为外部卷:
volumes:
- databases:/var/lib/mysql
这主要是即时有效的。唯一需要注意的是,我的撰写文件定义了 MySQL root 凭据。这些在挂载时被覆盖,所以我不得不在第一次启动容器时手动重置 root 密码。实际上这现在应该得到修复,因为数据目录现在位于卷的外部,因此新映像应该使用相同的 root 密码。应该能够将此更改编写到安装文件中。