gpt4 book ai didi

mysql - Docker服务互通问题排查

转载 作者:行者123 更新时间:2023-11-29 15:46:16 25 4
gpt4 key购买 nike

尝试对 Symfony 3.1 应用程序进行 dockerize,我运行 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:

以下是我针对上述 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(网络浏览器中的 http://localhost)与应用程序交互时,通过 docker 服务 nginx,我得到一个 SQLSTATE[HY000] [2002] 连接被拒绝

因此,我将 parameters.yml 中的 parameters:database_host 条目从 127.0.0.1 更改为 172.31.0.1 code> (这是 mariadb 容器的当前 IP 地址),这次我可以通过 HTTP 与应用程序交互,访问数据库没有任何问题,但相反,我得到了SQLSTATE[HY000] [2002] 尝试通过 Symfony 控制台访问数据库时。

我怀疑 Docker Compose 配置错误,但在检查并重新检查 Docker 文档、教程、示例 GitHub 存储库和类似的 SE 问题几个小时后,我不明白我做错了什么......

最佳答案

正如 @DavidMaze 在评论中所说,从 docker-compose 文件中删除 links 并使用服务名称而不是地址(mariadb 而不是 127.0.0.1)。这样它将适用于来自 docker 内部的连接。

这样,正如您已经看到的,它停止对来自 docker 外部的连接进行工作(从未使用过 Symfony 控制台,但我假设它在 docker 外部)。要解决这个问题,您至少有两种方法:

  1. 快速而肮脏地,在主机文件中添加一行(在 Windows 上,该文件应位于 C:\Windows\System32\Drivers\etc),例如this: 127.0.0.1 mariadb,这将指示 Windows 进行解析mariadb127.0.0.1
  2. 将您的项目配置为使用不同的配置文件,具体取决于您是从 Docker 内部还是外部连接(无法告诉您具体如何,这实际上取决于您的项目结构)

恕我直言,选项 1 对于开发机器来说是可以接受的。

关于mysql - Docker服务互通问题排查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57008872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com