Docker-compose端口转发

15

我的网站托管在生产环境的共享主机上。该网站使用 localhost 在代码中连接数据库。在我的docker-compose文件中,我有一个php:5.6-apachemysql:5.6实例。

有没有办法告诉docker-compose将web容器的端口3306转发到db容器的3306端口,以便当web容器尝试在3306上连接本地主机时,它会被发送到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://dev59.com/u1cO5IYBdhLWcg3wpjMz#45458460
#    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 服务无法创建容器:端口发布和容器类型的网络模式选项冲突

1个回答

14

是的,这是可能的。你需要使用 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服务都在base服务的网络上启动。所有端口映射都需要在base服务上执行。


似乎标志与端口不兼容。我想这样做,但同时也希望 Web 容器端口 80 可以被全世界访问。我在阅读文档时遇到了理解上的困难,不太清楚 network_mode:service 的作用。 - Justin Dearing
更新了关于端口的更多细节,详见更新。 - Tarun Lalwani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接