我正在学习 Docker 并通过安装 Drupal 进行实验。该过程是创建 2 个容器,其中一个运行 Apache,另一个运行 MySQL。
我有以下docker-compose.yml文件:
version: '3'
services:
d8:
container_name: d8
image: drupal
build: .
ports:
- "8585:80"
links:
- d8mysql:mysql
d8mysql:
container_name: d8mysql
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_PASSWORD: password
MYSQL_DATABASE: drupal
MYSQL_USER: user
ports:
- "3306:3306"
还有这个Dockerfile:
FROM drupal:latest
FROM mysql:latest
WORKDIR /var/www/html
当我运行docker-compose up时,我的两个容器都已成功创建,我可以登录并与它们交互。
问题是 drupal 站点未连接到数据库。在设置过程中,我提供了 d8mysql 部分中标识的数据库名称、用户和密码。我确认数据库和用户位于容器中但 drupal 无法连接。截图如下:
查看d8部分,我包含了带有mysql容器参数的链接 - 这是我的research表示应该可以解决问题,但没有。
我还检查了 Apache 容器的 /etc/hosts 文件,但它没有 MySQL 容器的条目,显然应该在那里以促进所需的连接。
最佳答案
由于您尚未为mysql
定义标签,因此默认使用latest
,暂时为8.0.18
。
Mysql 8 更改了密码验证方法,这似乎会导致与 drupal 镜像不兼容的问题。请参阅github issue .
一种选择是按照上述 github 问题的建议安装 mysql_native_password
插件。不过我还没有测试过。
我已验证其有效的其他选项是对 mysql 镜像使用较旧的 docker 标记,例如 mysql:5.7.28
工作docker-compose
:
version: '3'
services:
d8:
container_name: d8
image: drupal
ports:
- "8585:80"
d8mysql:
container_name: d8mysql
restart: always
image: mysql:5.7.28
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_PASSWORD: password
MYSQL_DATABASE: drupal
MYSQL_USER: user
# This is obsolete if you don't plan to connect to this db server from another machine outside docker network
# ports:
# - "3306:3306"
注释:
- 我没有使用您的
Dockerfile
,所以我删除了构建部分 - 您的
Dockerfile
没有做任何特殊的事情。当定义多个FROM
指令时,只有后者有效。 - 我删除了链接部分,因为它是 not required 。 Docker-compose 默认情况下会创建一个隔离网络,在堆栈启动时将容器添加到其中。在此网络中,声明的服务名称(对于您的情况,
d8
、d8mysql
)充当域名。因此一个容器可以通过该名称访问另一个容器。
关于mysql - Drupal 环境的 Docker 容器未链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59392169/