使用docker连接到MySQL数据库的不一致

时间:2018-08-01 09:38:31

标签: mysql docker docker-compose vagrant

版本

  • 操作系统:macOS High Sierra:10.13.6
  • Docker:18.06.0-ce-mac70(26399)
  • 撰写:1.22.0

我有一个要包含的现有Wordpress网站。为了进行测试,其数据库在本地Vagrant VM上运行,最终该数据库将托管在AWS上。最终,在测试完成后,我将创建一个Dockerfile,但现在在测试期间,我正在使用docker-compose

version: '3.3'

services:
   wordpress:
     image: wordpress:latest
     volumes:
        - ./wordpress/:/var/www/html
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: ${DB_HOST_IP}
       WORDPRESS_DB_NAME: ${DB_NAME}
       WORDPRESS_DB_USER: ${DB_USER}
       WORDPRESS_DB_PASSWORD: ${DB_PASS}

您会看到.env中使用了一些环境变量。运行docker-compose config表示信息已正确加载,这不是问题。

输出

docker-compose up

[website name]_wordpress_1 is up-to-date
Attaching to [website name]_wordpress_1
wordpress_1  |
wordpress_1  | MySQL Connection Error: (2002) Connection timed out
wordpress_1  |
wordpress_1  | Warning: mysqli::__construct(): (HY000/2002): Connection timed out in Standard input code on line 22
wordpress_1  |
wordpress_1  | Warning: mysqli::__construct(): (HY000/2002): Connection timed out in Standard input code on line 22
wordpress_1  |
wordpress_1  | MySQL Connection Error: (2002) Connection timed out
wordpress_1  |
wordpress_1  | Warning: mysqli::__construct(): (HY000/2002): Connection timed out in Standard input code on line 22
wordpress_1  |
wordpress_1  | MySQL Connection Error: (2002) Connection timed out

最后,奇怪的是,在使用此精确配置之前,它曾经工作过一次,甚至在过去解决了同一问题。我通过重新启动无业游民的VM和重新启动docker守护程序来修复它。现在做同样的事情虽然还没有解决问题。

此问题的根源可能是什么?

编辑

我将WORDPRESS_*文件中的MYSQL_*更改为docker-compose。终端的输出表明它正在工作。但是,当进入本地主机并且适当时,它需要永久加载,直到最终到达时,我的页面输出“建立数据库连接时出错”。

再次不确定发生了什么问题。我可以使用SQL客户端(续集专业版)以相同的凭据登录数据库,一切正常。这使我假设docker-compose文件本身中有错误。

编辑2

使用docker exec -t [image name] bash进入正在运行的映像,然后对数据库IP进行ping操作,发现它没有返回任何内容,但是在我自己的终端中它可以很好地返回数据包。看来这是内部网络问题?

将数据库的详细信息更改为实时SQL Server意味着它们都可以按预期工作,因此,现在,我必须坚持这一点,并且要小心。我仍然想找出问题所在,但我的Docker映像的内部网络无法连接到本地数据库。

1 个答案:

答案 0 :(得分:3)

在桥接网络模式下运行时,默认情况下,Docker容器无法访问主机。当您的容器尝试连接到本地主机时,它是在连接到自己的容器-而不是主机MySQL实例。

您最好的选择是运行一个MySQL容器,并与docker-compose一起非常简单。

一个新的docker compose文件应该看起来像这样:

version: '3.3'

services:
  wordpress:
    image: wordpress:latest
    volumes:
      - ./wordpress/:/var/www/html
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: mysql
      WORDPRESS_DB_NAME: ${DB_NAME}
      WORDPRESS_DB_USER: ${DB_USER}
      WORDPRESS_DB_PASSWORD: ${DB_PASS}
  mysql:
    image: mysql:5.7
    ports: 
      - "3306:3306"
    volumes:
      - db_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASS}
      MYSQL_DATABASE: ${DB_NAME}
      MYSQL_USER: ${DB_USER}
      MYSQL_PASSWORD: ${DB_PASS}
volumes:
  db_data:

我在主容器配置中使用mysql作为主机名的原因是docker-compose根据您为服务命名的方式为您设置了这些主机名。

或者,由于您正在运行Mac的Docker-您可以通过使用docker.for.mac.localhost作为主机名来访问MySQL主机。