docker连接mysql数据库不一致

kkbh8khc  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(447)

版本

操作系统: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

最后,奇怪的是,以前使用过这种精确的配置,甚至在过去修复了相同的问题。我通过重新启动vagrant vm和docker守护进程来修复它。但现在这样做并没有解决问题。
这个问题的根源是什么?

编辑

我换了衣服 WORDPRESS_*MYSQL_*docker-compose 文件。终端的输出表明它在工作。但是,当转到localhost和相应的文件时,加载会花费很长时间,当它最终到达时,我会得到输出“error building a database connection”的页面。
我也不确定出了什么问题。我可以使用我的sql客户端(sequel pro)以相同的凭据登录数据库,一切正常。这让我认为 docker-compose 文件本身。

编辑2

进入跑步形象 docker exec -t [image name] bash 然后ping数据库ip显示它没有返回任何东西,但在我自己的终端中,它返回的数据包很好。所以这似乎是一个内部网络问题?
将数据库的详细信息更改为livesqlserver意味着一切都能按预期工作,所以现在,我必须坚持这一点,只是要小心。我仍然想找出什么问题,虽然与我的docker图像无法连接到本地数据库的内部网络。

yk9xbfzb

yk9xbfzb1#

默认情况下,docker容器在桥接网络模式下运行时无法访问主机。当您的容器尝试连接到localhost时,它正在连接到自己的容器,而不是主机mysql示例。
最好的办法是运行一个mysql容器,这对于dockercompose来说相当简单。
一个新的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,因此docker compose会根据服务的命名方式为您设置这些主机名。
或者,因为您运行的是docker for mac,所以您可以使用 docker.for.mac.localhost 作为主机名。

相关问题