Docker组成端口转发

时间:2017-08-02 10:19:06

标签: docker docker-compose

我在生产的共享托管上托管了一个网站。该网站通过代码中的localhost连接到数据库。在我的docker-compose中,我有php:5.6-apachemysql: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创建容器:冲突选项:端口发布和容器类型网络模式

1 个答案:

答案 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服务,dbapp服务都在基本服务网络上启动。所有端口映射都需要在基本服务上进行。