我在生产的共享托管上托管了一个网站。该网站通过代码中的localhost
连接到数据库。在我的docker-compose中,我有php:5.6-apache
和mysql:5.6
个实例。
有没有告诉docker-compose将Web容器端口上的端口3306转发到db容器上的3306,这样当web容器连接到3306上的localhost时,它将被发送到3306上的db并且还共享Web容器上的端口80到外部世界?
当前的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
当前错误:
错误:for web无法为服务Web创建容器:冲突选项:端口发布和容器类型网络模式
答案 0 :(得分:5)
是的,这是可能的。您需要使用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
服务都在基本服务网络上启动。所有端口映射都需要在基本服务上进行。