Mysql 位于它自己的 docker-compose.yml 中,因为我想要一个 mysql 服务器启动并运行,任何其他 php 应用程序都可以连接到。所以我在同一个 docker-compose.yml 中没有 php 和 mysql。如果我通过查找 mysql 容器的网关 IP 地址,然后将其硬编码到 php 应用程序中,则可以从 php 应用程序连接到 mysql。docker inspect mysql-db
。但是每次 mysql 重新启动时,docker 都会更改 172...ip 地址,因此这对于开发来说并不理想。
我可以通过连接到mysqlmysql -h 127.0.0.1
没问题,但是从 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 撰写文件中配置默认网络,以便您可以预测地控制其名称以方便以后使用(否则它将根据您的撰写项目名称计算,如果您重命名包含的文件夹,该名称可能会更改... ):
重要的提示:要使下面的工作正常,您需要使用撰写文件版本 >= 3.5
---
version: '3.7'
#...
networks:
default:
name: shared_mysql
你现在可以使用它shared_mysql
网络作为external
来自任何其他 compose 项目。
version: '3.7'
services:
nginx:
#...
networks:
- myapp
php:
#...
networks:
- myapp
- database
networks:
myapp:
database:
external: true
name: shared_mysql
然后你可以从你的数据库连接到mysqlphp
使用服务名称的容器mysql
(e.g. mysql -h mysql -u user -p
)
参考:https://docs.docker.com/compose/networking/ https://docs.docker.com/compose/networking/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)