gpt4 book ai didi

docker - 挂载卷时无法运行 mariadb

转载 作者:行者123 更新时间:2023-12-02 03:08:52 32 4
gpt4 key购买 nike

使用以下 docker-compose.yml 文件

version: '2'

services:

wordpress:
image: wordpress
ports:
- 8080:80
environment:
WORDPRESS_DB_NAME: my_db
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: password
volumes:
- ./src:/var/www/html

mysql:
image: mariadb
environment:
MYSQL_ROOT_PASSWORD: password
volumes:
- ./data_dir:/var/lib/mysql

当运行 docker-compose up 命令时,出现以下错误

Starting wp_mysql_1
Starting wp_wordpress_1
Attaching to wp_mysql_1, wp_wordpress_1
wordpress_1 |
wordpress_1 | Warning: mysqli::mysqli(): (HY000/2002): Connection refused in - on line 19
wordpress_1 |
wordpress_1 | MySQL Connection Error: (2002) Connection refused
mysql_1 | 2016-11-28 15:47:02 139858949081024 [Note] mysqld (mysqld 10.1.19-MariaDB-1~jessie) starting as process 1
...
mysql_1 | 2016-11-28 15:47:03 139858949081024 [Note] InnoDB: Using mutexes to ref count buffer pool pages
mysql_1 | 2016-11-28 15:47:03 139858949081024 [Note] InnoDB: The InnoDB memory heap is disabled
mysql_1 | 2016-11-28 15:47:03 139858949081024 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
mysql_1 | 2016-11-28 15:47:03 139858949081024 [Note] InnoDB: GCC builtin __atomic_thread_fence() is used for memory
barrier
mysql_1 | 2016-11-28 15:47:03 139858949081024 [Note] InnoDB: Compressed tables use zlib 1.2.8
mysql_1 | 2016-11-28 15:47:03 139858949081024 [Note] InnoDB: Using Linux native AIO
mysql_1 | 2016-11-28 15:47:03 139858949081024 [Note] InnoDB: Using SSE crc32 instructions
mysql_1 | 2016-11-28 15:47:03 139858949081024 [Note] InnoDB: Initializing buffer pool, size = 256.0M
mysql_1 | 2016-11-28 15:47:03 139858949081024 [Note] InnoDB: Completed initialization of buffer pool
mysql_1 | 2016-11-28 15:47:03 139858949081024 [ERROR] InnoDB: auto-extending data file ./ibdata1 is of a different
size 0 pages (rounded down to MB) than specified in the .cnf file: initial 768 pages, max 0 (relevant if non-zero) pages
!
mysql_1 | 2016-11-28 15:47:03 139858949081024 [ERROR] InnoDB: Could not open or create the system tablespace. If yo
u tried to add new data files to the system tablespace, and it failed here, you should now edit innodb_data_file_path in
my.cnf back to what it was, and remove the new ibdata files InnoDB created in this failed attempt. InnoDB only wrote th
ose files full of zeros, but did not yet use them in any way. But be careful: do not remove old data files which contain
your precious data!
mysql_1 | 2016-11-28 15:47:03 139858949081024 [ERROR] Plugin 'InnoDB' init function returned error.
mysql_1 | 2016-11-28 15:47:03 139858949081024 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
mysql_1 | 2016-11-28 15:47:03 139858949081024 [Note] Plugin 'FEEDBACK' is disabled.
mysql_1 | 2016-11-28 15:47:03 139858949081024 [ERROR] Could not open mysql.plugin table. Some plugins may be not lo
aded
mysql_1 | 2016-11-28 15:47:03 139858949081024 [ERROR] Unknown/unsupported storage engine: InnoDB
mysql_1 | 2016-11-28 15:47:03 139858949081024 [ERROR] Aborting
mysql_1 |
wp_mysql_1 exited with code 1
wordpress_1 |
wordpress_1 | Warning: mysqli::mysqli(): php_network_getaddresses: getaddrinfo failed: Name or service not known in - o
n line 19
wordpress_1 |
wordpress_1 | Warning: mysqli::mysqli(): (HY000/2002): php_network_getaddresses: getaddrinfo failed: Name or service no
t known in - on line 19
wordpress_1 |
wordpress_1 | MySQL Connection Error: (2002) php_network_getaddresses: getaddrinfo failed: Name or service not known

但是如果我从 mysql 镜像中删除了卷,那么它就可以正常工作了!当我需要持久保存数据时,如何安装卷。

最佳答案

其实是MariaDB的问题。您不能使用 Docker 将 MariaDB 的文件夹挂载到主机,因为它将共享文件/文件夹权限呈现给数据库容器,作为 root 拥有且只能由 root 写入。解决方案是使用 docker-compose 命名卷。如 docker 文档中所述:
Docker 有两个选项供容器在主机中存储文件,以便即使在容器停止后文件也能持久保存:卷和绑定(bind)挂载。如果您在 Linux 上运行 Docker,您还可以使用 tmpfs 挂载。

您尝试使用的是不适用于 MariaDB 的绑定(bind)安装。所以我们可以为此使用 docker volume。

当您创建一个卷时,它会存储在 Docker 主机上的一个目录中。当您将卷装载到容器中时,此目录就是装载到容器中的目录。这类似于绑定(bind)挂载的工作方式,只是卷由 Docker 管理并且与主机的核心功能隔离。卷存储在由 Docker 管理的主机文件系统的一部分中(在 Linux 上为/var/lib/docker/volumes/)。因此,将您的 docker-compose 文件更改为:-

version: '2'

services:

wordpress:
image: wordpress
ports:
- 8080:80
environment:
WORDPRESS_DB_NAME: my_db
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: password
volumes:
- ./src:/var/www/html

mysql:
image: mariadb
environment:
MYSQL_ROOT_PASSWORD: password
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:

即在 mysql 服务下使用命名卷并在顶级卷键中声明它。这将告诉 docker-compose 创建一个 Docker 管理的卷,并且您的 MariaDB 数据被备份/保存在主机上的/var/lib/docker/volumes/_db_data/_data 目录中。

同样在运行 docker-compose up 命令之后,如果你这样做 docker 卷 ls然后你可以看到 docker-compose 创建的卷。

关于docker - 挂载卷时无法运行 mariadb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40971034/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com