IT干货网

Docker-compose 端口转发

EasonJim 2025年05月04日 编程设计 78 0

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

无论如何告诉docker-compose将Web容器端口上的端口3306转发到db容器上的3306,以便当Web容器连接到3306上的本地主机时,它会被发送到3306上的db并共享端口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 

当前错误:

ERROR: for web Cannot create container for service web: conflicting options: port publishing and the container type network mode

请您参考如下方法:

对的,这是可能的。您需要使用 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服务都在基础服务网络上启动。所有端口映射都需要在基本服务中进行。


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!