mysql - 使用docker连接MySQL数据库不一致

标签 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

最后,奇怪的是,它以前曾使用这个确切的配置工作过一次,甚至在过去修复了同样的问题。我通过重新启动 vagrant VM 并重新启动 docker 守护进程来修复它。现在做同样的事情并没有解决问题。

这个问题的根源可能是什么?

编辑

我在 docker-compose 文件中将 WORDPRESS_* 更改为 MYSQL_*。终端的输出表明它正在工作。然而,当转到 localhost 和适当的时,它需要永远加载,当它最终到达时,我得到页面输出“建立数据库连接时出错”。

再次不确定出了什么问题。我可以使用我的 SQL 客户端(sequel pro)使用相同的凭据登录数据库,一切正常,一切正常。这让我假设 docker-compose 文件本身有问题。

编辑 2

使用 docker exec -t [image name] bash 进入正在运行的图像,然后 ping 数据库 IP 显示它没有返回任何东西,但在我自己的终端中它返回数据包正常。所以这似乎是一个内部网络问题?

将数据库的详细信息更改为实时 SQL 服务器意味着一切都按预期工作,所以现在,我必须坚持下去,并且要小心。尽管我的 docker 镜像的内部网络无法连接到本地数据库,但我仍然想找出问题所在。

最佳答案

在桥接网络模式下运行时,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。

关于mysql - 使用docker连接MySQL数据库不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51630011/

相关文章:

php - jquery将html写入变量

mysql - Magento 数据库同步

ruby - Docker Ruby Rack Redis 队列

docker - 适用于 Windows 的 Docker 上的 Kubernetes -> AKS/EKS

elasticsearch - 在 Docker 运行期间在 Elasticsearch 中设置映射

docker - 错误: readlink/var/lib/docker/overlay2: invalid argument

php - 如何在数据库中正确插入浮点变量

mysql - JOOQ动态表名

amazon-web-services - 使用 AWS EC2 Golang GO 端点在 Docker 部署上获取 JSON 时出现问题

docker - 使用 “no such file or directory”将无人机8.5构建到容器中失败