繁体   English   中英

PHP 应用程序无法连接到 127.0.0.1 处的 docker mysql 容器

[英]PHP app cannot connect to docker mysql container at 127.0.0.1

Mysql 在它自己的 docker-compose.yml 中,因为我想要一个 mysql 服务器启动并运行,任何其他 php 应用程序都可以连接到它。 所以我在同一个 docker-compose.yml 中没有 php 和 mysql。 从php应用程序中,如果我使用mysql容器的网关ip地址查找它然后将其硬编码到php应用程序中,我可以连接到mysql。 docker inspect mysql-db 但是每次 mysql 重新启动时,docker 都会更改 172... ip 地址,因此这对于开发来说并不理想。

我可以通过mysql -h 127.0.0.1连接到 mysql 没问题,但是从 php 应用程序如果我尝试使用 127.0.0.1 我连接被拒绝。 如果我使用 172... 网关 IP 地址,我只能连接。

如何让 mysql 容器侦听从主机到 127.0.0.1 的连接?

用于 mysql 的 docker-compose.yml

version: "3"

services:
  mysql:
    container_name: mysql-db
    image: mysql
    build:
      dockerfile: Dockerfile
      context: ./server/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=admin
    volumes:
      - ./data/mysql:/var/lib/mysql
    ports:
      - 3306:3306

用于 php 的 docker-compose.yml

version: "3"

services:
  nginx:
    container_name: nginx_myapp
    image: nginx
    build:
      dockerfile: Dockerfile
      context: ./server/nginx
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./app:/var/www/html
    networks:
      - myapp
  php:
    container_name: php_myapp
    image: php:7.3-fpm
    build:
      dockerfile: Dockerfile
      context: ./server/php-fpm
    environment:
      CI_ENV: development
    volumes:
      - ./app:/var/www/html
    networks:
      - myapp

networks:
  myapp:

127.0.0.1 是环回地址。 它指向本地主机。 在 docker 的上下文中,localhost 是容器本身。 您的 php 容器上没有运行数据库,因此连接永远不会成功。

您需要做的是在您的 mysql compose 文件中配置默认​​网络,以便您可以预测地控制其名称以方便以后使用(否则它将根据您的 compose 项目名称计算得出,如果您重命名包含文件夹,该名称可能会更改... ):

重要说明要使以下内容正常工作,您需要使用 compose 文件版本 >= 3.5

---
version: '3.7'
#...
networks:
  default:
    name: shared_mysql

您现在可以将该shared_mysql网络用作任何其他撰写项目的external网络。

version: '3.7'

services:
  nginx:
    #...
    networks:
      - myapp
  php:
    #...
    networks:
      - myapp
      - database

networks:
  myapp:
  database:
    external: true
    name: shared_mysql

然后,您可以使用服务名称mysql (例如mysql -h mysql -u user -p )从您的php容器连接到 mysql

参考: https : //docs.docker.com/compose/networking/

为您提供几个解决方案

1)您可以使用相同的卷路径在每个文件中复制 mysql 部分,在这种情况下,当您启动项目时,您将拥有相同的数据库

project1
version: "3.2"
services:
  mysql:
    volumes:
      - /var/mysql:/var/lib/mysql
  php:
    build:
      context: './php/'

project2
version: "3.2"
services:
  mysql:
    volumes:
      - /var/mysql:/var/lib/mysql
  php:
    build:
      context: './php/'

2) 您可以使用 host.docker.internal 或 macos (docker.for.mac.localhost) 直接连接到您的主机更多信息在这里从 Docker 容器内部,我如何连接到机器的 localhost?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM