Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用docker连接MySQL数据库不一致 版本 OS:macOS High Sierra:10.13.6 码头工人:18.06.0-ce-mac70(26399) 撰写:1.22.0_Mysql_Docker_Docker Compose_Vagrant - Fatal编程技术网

使用docker连接MySQL数据库不一致 版本 OS:macOS High Sierra:10.13.6 码头工人:18.06.0-ce-mac70(26399) 撰写:1.22.0

使用docker连接MySQL数据库不一致 版本 OS:macOS High Sierra:10.13.6 码头工人:18.06.0-ce-mac70(26399) 撰写:1.22.0,mysql,docker,docker-compose,vagrant,Mysql,Docker,Docker Compose,Vagrant,我有一个现有的Wordpress网站,我想增加。为了测试,数据库运行在本地的Vagrant VM上,最终数据库将托管在AWS上。最终在测试完成后,我将创建一个Dockerfile,但目前在测试时,我使用的是dockercompose version: '3.3' services: wordpress: image: wordpress:latest volumes: - ./wordpress/:/var/www/html ports:

我有一个现有的Wordpress网站,我想增加。为了测试,数据库运行在本地的Vagrant VM上,最终数据库将托管在AWS上。最终在测试完成后,我将创建一个
Dockerfile
,但目前在测试时,我使用的是
dockercompose

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}
如您所见,my
.env
中使用了一些环境变量。运行
docker compose config
表明信息已正确加载,因此这不是问题所在

输出 最后,奇怪的是,我们以前曾经使用过这种精确的配置,甚至在过去修复过同样的问题。我通过重新启动vagrant VM和docker守护进程修复了它。但现在这样做并没有解决问题

这个问题的根源是什么

编辑 我在
docker compose
文件中将
WORDPRESS\u*
更改为
MYSQL\u*
。终端的输出表明它正在工作。然而,当转到localhost和相应的服务器时,加载会花费很长时间,当它最终到达时,我会看到页面输出“建立数据库连接时出错”

我也不知道出了什么问题。我可以使用我的SQL客户端(sequel pro)以相同的凭据登录数据库,一切正常。这导致我假设
docker compose
文件本身存在错误

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


将数据库的详细信息更改为live SQL server意味着一切都能按预期工作,因此目前,我必须坚持这一点,只是要小心。我仍然想找出docker映像的内部网络无法连接到本地数据库的问题所在。

docker容器在桥接网络模式下运行时,默认情况下无法访问主机。当您的容器尝试连接到localhost时,它正在连接到自己的容器,而不是主机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根据您对服务的命名方式为您设置这些主机名


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

我对Docker还是相当陌生,因此如果有人在撰写文件建议中发现任何错误或不必要的详细信息,请随意编辑。我的假设是,因为它在虚拟机中运行,所以它会将其视为一台不同的机器。例如,IP地址类似于192.x.x.x。而不是127.0.0。1@shmink啊,这是很有可能的,尽管我认为虚拟机本身可能有它自己的桥梁和复杂性。。。因为Docker本身就是在虚拟机中运行的,所以您可能需要跨越许多网络障碍才能使该设置正常工作。
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: