我有一个网站托管在生产共享主机上。该网站通过 localhost 连接到数据库在代码中。在我的 docker-compose 中,我有一个 php:5.6-apache和 mysql:5.6实例。
无论如何告诉docker-compose将Web容器端口上的端口3306转发到db容器上的3306,以便当Web容器连接到3306上的本地主机时,它会被发送到3306上的db并共享端口80 Web 容器到外部世界?
当前 docker-compose.yml:
version: "3"
services:
web:
build: .
#image: php:5.6-apache
ports:
- "8080:80"
environment:
- "APP_LOG=php://stderr"
- "LOG_LEVEL=debug"
volumes:
- .:/var/www/html
network_mode: service:db # See https://stackoverflow.com/a/45458460/95195
# networks:
# - internal
working_dir: /var/www
db:
image: mysql:5.6
ports:
- "3306:3306"
environment:
- "MYSQL_XXXXX=*****"
volumes:
- ./provision/mysql/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
# networks:
# - internal
networks:
internal:
driver: bridge
当前错误:
ERROR: for web Cannot create container for service web: conflicting options: port publishing and the container type network mode
请您参考如下方法:
对的,这是可能的。您需要使用 network_mode选项。看下面的例子
version: '2'
services:
db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: root
ports:
- "80:80"
- "3306:3306"
app:
image: ubuntu:16.04
command: bash -c "apt update && apt install -y telnet && sleep 10 && telnet localhost 3306"
network_mode: service:db
产出
app_1 | Trying 127.0.0.1...
app_1 | Connected to localhost.
app_1 | Escape character is '^]'.
app_1 | Connection closed by foreign host.
network_mode: service:db指示 docker 不分配
app服务它自己的专用网络。而是让它加入
db的网络服务。因此,您需要执行的任何端口映射都需要在
db 上进行。服务本身。
我平时使用的方式不同,我创建了一个
base运行无限循环的服务和
db和
app服务都在基础服务网络上启动。所有端口映射都需要在基本服务中进行。




