Docker组成端口转发

我有一个网站托pipe共享主机上的生产。 该网站通过代码中的localhost连接到数据库。 在我的docker,撰写我有一个php:5.6-apachemysql:5.6实例。

是否有任何告诉docker组成的端口3306上的Web容器端口转发到数据库容器上的3306,以便当Web容器绑定连接到3306上的本地主机时,它被发送到数据库上3306,也共享端口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 

当前错误:

错误:对于Web无法为服务Web创build容器:冲突选项:端口发布和容器typesnetworking模式

对的,这是可能的。 您需要使用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服务它自己的专用networking。 而是让它joindb服务的networking。 所以你需要做的任何端口映射都需要在db服务本身上进行。

我通常使用的方式是不同的,我创build一个运行无限循环的base服务,并且dbapp服务都在基本服务networking上启动。 所有端口映射都需要在基本服务中进行。