尝试对Symfony 3.1应用程序进行docker化,我运行Docker for Windows:
这是我当前的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:
以下是我为上述3项服务分别提供的Dockerfile
:
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(Web浏览器中的http://localhost
)与应用程序交互时,因此通过docker服务nginx
,我得到了SQLSTATE[HY000] [2002] Connection refused
。
因此,我将parameters:database_host
中的parameters.yml
项从127.0.0.1
更改为172.31.0.1
(这是mariadb
容器的当前IP地址),我可以通过HTTP与该应用进行交互,它访问数据库没有任何问题,但是,当尝试通过Symfony控制台访问数据库时,却得到了SQLSTATE[HY000] [2002]
。
我怀疑Docker Compose配置错误,但是在检查并重新检查了Docker文档,教程,示例GitHub存储库和类似的SE问题之后,几个小时后,我才知道我做错了什么……
答案 0 :(得分:0)
正如@DavidMaze在评论中所说,从docker-compose文件中删除links
并使用服务名称代替地址(mariadb
代替127.0.0.1
)。这样,它将适用于来自docker内部的连接。
这样,就像您已经看到的那样,它对于来自外部docker的连接停止工作(曾经使用过Symfony控制台,但是我认为它不在docker之外)。要解决此问题,您至少有两种方法:
C:\Windows\System32\Drivers\etc
处)
此:127.0.0.1 mariadb
,这将指示Windows解决
mariadb
为127.0.0.1
开发机器可接受IMHO选项1。
答案 1 :(得分:0)
您不能在parameter.yml中使用127.0.0.1,但是可以使用“ mariadb”代替,因为您是在链接部分中定义的。 现在,链接已被描述为已弃用,因此它可以正常工作,但您可能需要使用网络。
version: "3.6"
services:
nginx:
build:
context: ./../..
dockerfile: ./docker/dev/nginx/Dockerfile
networks:
- frontend
- backend
volumes:
- ./../..:/app
ports:
- 80:80
php:
build:
context: ./../..
dockerfile: ./docker/dev/php/Dockerfile
networks:
- frontend
- backend
volumes:
- ./../..:/app
mariadb:
build:
context: ./../..
dockerfile: ./docker/dev/mariadb/Dockerfile
networks:
- backend
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:
networks:
frontend:
driver: bridge
name: frontend #or whatever custom name since 3.5
backend:
driver: bridge
name: backend #or whatever custom name since 3.5