尝试通过托管在 docker 容器中的 phpmyadmin 访问 MariaDB 数据库

Trying to access MariaDB databse through phpmyadmin hosted within a docker container

我正在尝试使用 docker-compose 设置一个基本的 LAMP 堆栈,但是当容器 运行.

为了尝试解决这个问题,我将 docker-compose.yaml 文件剥离到:

version: '3.2'                       

services:
   db:
      image: mariadb
      container_name: appsDB
      restart: always
      ports:
       - '6603:3306'
      environment:
        MYSQL_ROOT_PASSWORD: secret

   app:
      depends_on:
       - db
      image: phpmyadmin/phpmyadmin
      container_name: phpmyadmin
      restart: always
      ports:
       - '8080:80'
      environment:
        PMA_HOST: db

当我 运行 容器时,我可以导航到 phpmyadmin 页面,但是当我进入 root/secret username/password 时,我得到一个错误:

 Cannot log in to the MySQL server
 mysqli::real_connect(): (HY000/2002): php_network_getaddresses: getaddrinfo failed: Name or service not known

为了确保这不是我电脑的问题,我还 运行 docker-compose up 将数据库图像更改为 mysql 并保持所有其他细节相同。那时没有问题:phpmyadmin 工作正常,我可以使用上一张图片中使用的相同 root/secret 凭据正常登录。

谁能告诉我为什么 mariadb 会这样,有什么方法可以通过 docker 容器中的 phpmyadmin 访问它吗?

编辑

按照检查容器之间连接的建议,mariadb 容器数据库似乎无法启动。 docker 日志的结果是:

2020-07-01  9:32:22 0 [Warning] 'default-authentication-plugin' is MySQL 5.6 / 5.7 compatible option. To be implemented in later versions.
2020-07-01  9:32:22 0 [Note] mysqld (mysqld 10.4.8-MariaDB-1:10.4.8+maria~bionic) starting as process 1 ...
2020-07-01  9:32:22 0 [Note] InnoDB: Using Linux native AIO
2020-07-01  9:32:22 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2020-07-01  9:32:22 0 [Note] InnoDB: Uses event mutexes
2020-07-01  9:32:22 0 [Note] InnoDB: Compressed tables use zlib 1.2.11
2020-07-01  9:32:22 0 [Note] InnoDB: Number of pools: 1
2020-07-01  9:32:22 0 [Note] InnoDB: Using SSE2 crc32 instructions
2020-07-01  9:32:22 0 [Note] mysqld: O_TMPFILE is not supported on /tmp (disabling future attempts)
2020-07-01  9:32:22 0 [Note] InnoDB: Initializing buffer pool, total size = 256M, instances = 1, chunk size = 128M
2020-07-01  9:32:22 0 [Note] InnoDB: Completed initialization of buffer pool
2020-07-01  9:32:22 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority().
2020-07-01  9:32:22 0 [ERROR] InnoDB: Invalid flags 0x4800 in ./ibdata1
2020-07-01  9:32:22 0 [ERROR] InnoDB: Plugin initialization aborted with error Data structure corruption
2020-07-01  9:32:23 0 [Note] InnoDB: Starting shutdown...
2020-07-01  9:32:23 0 [ERROR] Plugin 'InnoDB' init function returned error.
2020-07-01  9:32:23 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2020-07-01  9:32:23 0 [Note] Plugin 'FEEDBACK' is disabled.
2020-07-01  9:32:23 0 [ERROR] Could not open mysql.plugin table. Some plugins may be not loaded
2020-07-01  9:32:23 0 [ERROR] Unknown/unsupported storage engine: InnoDB
2020-07-01  9:32:23 0 [ERROR] Aborting

谁能告诉我如何在 docker 内解决这个问题?

进一步编辑

为了保持最新,我发现我可以毫无问题地从 CLI 启动数据库容器 - 数据库启动并准备好连接:

docker run --name mariadbtest -e MYSQL_ROOT_PASSWORD=mypass -d mariadb

您是否正在使用 images/containers 的过时版本?你的 docker-compose.yml 对我来说很好(我的 Docker 版本是 19.03.8,我认为这不重要)。

我会先尝试强制它重新创建整个堆栈,docker-compose up --force-recreate。我注意到您将此文件称为 docker-compose.yaml 但正确的默认扩展名应该是 .yml;如果您曾经使用 .yml 文件创建过它(或者通过将文件名直接指定给 docker-compose),我可以想象 Docker 会默默地(或至少不明显地)失败重建新文件,因此还要仔细检查文件名。

如果这不起作用,我建议进入 phpMyAdmin 容器的 shell 并尝试一些网络命令以查看是否可以直接连接;例如安装 mariadb-client 包并尝试 mysql -u root -h db -p.