【发布时间】:2019-07-12 14:18:46
【问题描述】:
尝试对 Symfony 3.1 应用程序进行 docker 化,我运行 Docker for Windows:
- Docker 桌面版本:2.0.0.3
- 引擎版本:18.09.2
- 撰写版本:1.23.2
这是我目前的docker-compose.yaml:
version: "3.6"
services:
nginx:
build:
context: ./../..
dockerfile: ./docker/dev/nginx/Dockerfile
volumes:
- ./../..:/app
ports:
- 80:80
links:
- mariadb:mariadb
- php:php
php:
build:
context: ./../..
dockerfile: ./docker/dev/php/Dockerfile
volumes:
- ./../..:/app
links:
- mariadb:mariadb
mariadb:
build:
context: ./../..
dockerfile: ./docker/dev/mariadb/Dockerfile
volumes:
- database:/var/lib/mysql
ports:
- 3306:3306
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=todo_list
- MYSQL_USER=todo_list
- MYSQL_PASSWORD=todo_list
volumes:
database:
以下是我的Dockerfiles,用于上述 3 项服务中的每一项:
nginx:
FROM nginx:1.16.0-alpine
COPY docker/dev/nginx/config/nginx.conf /etc/nginx/conf.d/default.conf
COPY . /app
php:
FROM php:7.3.6-fpm-alpine3.10
RUN docker-php-ext-install -j$(nproc) pdo_mysql
COPY docker/dev/php/config/php.conf ${PHP_INI_DIR}/conf.d/default.ini
COPY . /app
mariadb:
FROM mariadb:10.3
COPY docker/dev/mariadb/config/mariadb.conf /etc/mysql/conf.d/default.cnf
RUN chmod 0444 /etc/mysql/conf.d/default.cnf
运行docker-compose up,一切正常,服务日志中未检测到不一致或错误/警告...
其中定义了数据库访问和凭据的 Symfony parameters.yml 如下所示:
parameters:
database_host: 127.0.0.1
database_port: 3306
database_name: todo_list
database_user: todo_list
database_password: todo_list
通过这个配置,我可以成功运行 Symfony 控制台命令:
php bin/console doctrine:schema:update
php bin/console doctrine:fixtures:load
这意味着在这种情况下,应用可以访问数据库。
但是当我通过 HTTP(网络浏览器中的http://localhost)与应用程序交互时,通过 docker 服务nginx,我得到一个SQLSTATE[HY000] [2002] Connection refused。
所以我将parameters.yml 中的parameters:database_host 条目从127.0.0.1 更改为172.31.0.1(这是mariadb 容器的当前IP 地址),这一次我可以通过HTTP 与应用程序交互,它访问数据库没有任何问题,但是当我尝试通过 Symfony 控制台访问数据库时,我得到了一个SQLSTATE[HY000] [2002]。
我怀疑 Docker Compose 配置错误,但在检查并重新检查 Docker 文档、教程、示例 GitHub 存储库和类似的 SE 问题后,几个小时后,我不明白自己做错了什么……
【问题讨论】:
-
需要使用数据库服务的Docker Compose服务名(
mariadb)作为主机名; Docker 中的localhost总是意味着“这个容器”。links:是不必要的,可能会导致问题。 -
mariadb解析为172.31.0.1,因此使用mariadb作为parameters:database_host条目的值会导致我已经用这个参数试验过的结果。
标签: mysql symfony docker pdo docker-compose