Docker服务互通故障排除

时间:2019-07-12 14:18:46

标签: mysql symfony docker pdo docker-compose

尝试对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:

以下是我为上述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问题之后,几个小时后,我才知道我做错了什么……

2 个答案:

答案 0 :(得分:0)

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

这样,就像您已经看到的那样,它对于来自外部docker的连接停止工作(曾经使用过Symfony控制台,但是我认为它不在docker之外)。要解决此问题,您至少有两种方法:

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

开发机器可接受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