是否可以将 docker 容器 A 上的端口 XXXX 绑定到 docker 容器 B 上的端口 XXXX 或 YYYY

Is it possible to bind port XXXX on a docker container A to port XXXX or YYYY on docker container B

假设我有一个 docker-compose 文件如下:

version: '2'
services:

  # The php-fpm container
  app:
    build:
      context: ./
      dockerfile: app.dev.dockerfile
    working_dir: /var/www
    volumes:
      - ./:/var/www

    expose:
      - 8003

  # The Web Server
  web:
    build:
      context: ./
      dockerfile: web.dockerfile
    working_dir: /var/www
    volumes_from:
      - app
    links:
       - app:app

    ports:
      - 80:80
      - 8004:8003

所以我喜欢从 Web 容器中的端口 8004 为 App 容器上的端口 8003 提供服务。 但我无法得到结果。 所以我的猜测是 Web 容器上 8004:8003 的 Web 端口映射仅限于 Web 容器。 或者它实际上映射到应用程序容器上暴露的 8003 端口?

如果是,我如何测试 Web 端口 8004 实际上映射到 App 容器上的端口 8003?

有没有办法创建单向绑定(或更好的双向绑定)或将 App 容器上的端口 8003 映射到 Web 容器上的端口 8004?

如果我的主机是 运行 一些 App 和 docker 服务(包括这两个容器),并且 App 正在尝试侦听 Web 容器中的端口 8004 他实际上正在与 App 通信容器。

容器旨在使每个进程保持独立。每个 process/container 都有自己独立的网络堆栈

您描述的从一个容器到另一个容器的唯一方法 "mapping" 是如果有一个用户 space 进程转发请求。就像 Apache http 或 Nginx 将 HTTP 请求转发到 FastCGI PHP 进程一样。

对于调试,将端口直接映射到 app 容器。如果您无法连接,可能是 app 容器中的调试设置有问题。

  # The php-fpm container
  app:
    build:
      context: ./
      dockerfile: app.dev.dockerfile
    working_dir: /var/www
    volumes:
      - './:/var/www'
    ports:
      - '8003:8003'

  # The Web Server
  web:
    build:
      context: ./
      dockerfile: web.dockerfile
    working_dir: /var/www
    volumes_from:
      - app    
    ports:
      - 80:80

顺便说一下,links 不需要版本 2+ 连接。默认情况下,Compose 将创建一个用户定义的网络,允许您的容器之间进行访问。