![](/img/trans.png)
[英]Docker, PHP PDO and the Single MySQL Container (cannot connect by container name)
[英]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
为您提供几个解决方案
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.