挂载卷时无法运行 mariadb

2024-04-28

使用以下 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 有两个选项让容器在主机中存储文件,以便即使容器停止后文件也能保留:卷和绑定挂载。如果您在 Linux 上运行 Docker,您还可以使用 tmpfs 挂载。

您尝试使用的是绑定安装,它不适用于 MariaDB。所以我们可以使用 docker Volume 来实现。

创建卷时,它存储在 Docker 主机上的目录中。当您将卷装载到容器中时,该目录就是装载到容器中的目录。这与绑定挂载的工作方式类似,只不过卷由 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 创建的卷。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

挂载卷时无法运行 mariadb 的相关文章

随机推荐