【问题标题】:Docker service intercommunication troubleshootDocker服务互通故障排除
【发布时间】: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


【解决方案1】:

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

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

  1. 又快又脏,在你的hosts文件中添加一行(在windows上,文件应该在C:\Windows\System32\Drivers\etc)就像 这个:127.0.0.1 mariadb,这将指示 Windows 解决 mariadb127.0.0.1
  2. 根据您是从 docker 内部还是外部连接,配置您的项目以使用不同的配置文件(无法告诉您 具体如何,这真的取决于你的项目结构)

恕我直言,选项 1 可用于开发机器。

【讨论】:

  • 你让我感到困惑,谢谢。稍微纠正一下,C:\Windows\System32\Drivers\etc\hosts 文件条目的结构是这样的:127.0.0.1 mariadb
【解决方案2】:

您不能在 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 2021-11-14
    • 2010-10-20
    相关资源
    最近更新 更多