2017-08-02 112 views
1

我有一个网站托管在生产共享主机上。该网站通过代码中的localhost连接到数据库。在我的docker-compose中,我有一个php:5.6-apachemysql:5.6实例。Docker-compose端口转发

有无论如何告诉docker-compose将Web容器端口上的端口3306转发给db容器上的3306,以便当web容器连接到3306上的localhost时,它将被发送到3306上的db,将Web容器上的端口80共享给外部世界?

当前泊坞窗,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

回答

2

是的,它是可能的。您需要使用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指示码头工人不分配app服务它自己的专用网络。反而让它加入db服务的网络。因此,您需要执行的任何端口映射都需要在db服务本身上发生。

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

+0

看来这个标志与端口不兼容。我想这样做,但也有Web容器端口80可访问世界。我无法准确理解network_mode:service如何从文档中执行操作。 –

+0

更新了有关端口的更多详细信息。见upate –