docker-compose 可以在具有离散端口的服务之间共享 ip 吗?

tu-*_*duh 6 docker docker-compose docker-networking

我们目前有使用 supervisord 构建复杂构建的 docker 容器,以便我们可以将服务组合在一起。例如,nginx 和 ssh。

我正在尝试使用由共享卷链接的更多服务驱动隔离来重建这些。但是,如果不将 IP 映射到主机,即使端口可能是离散的,我似乎也找不到允许共享 IP 地址的方法。

我想要做的是这样的:

version: '2'
services:
  web:
    image: nginx
    volumes:
    - /data/web:/var/www
    networks:
      public:
        ipv4_address: 10.0.0.1
    ports:
    - "10.0.0.1:80:80"
  ssh:
    image: alpine-sshd
    volumes:
    - /data/web:/var/www
    networks:
      public:
        ipv4_address: 10.0.0.1
    ports:
    - "10.0.0.1:22:22"
networks:
  public:
    external: true
Run Code Online (Sandbox Code Playgroud)

...public预定义的 docker macvlan 网络在哪里。

当我尝试这个时,我收到错误:

ERROR: for ssh  Cannot start service ssh: Address already in use
Run Code Online (Sandbox Code Playgroud)

我知道另一个解决方案是引入第三个服务作为代理。但是,我认为这将是一个足够简单的案例,不需要它。

是否可以将 docker-compose/docker-networking 配置为通过端口路由以允许相同的 IP 地址用于不同的容器?

Lig*_*t.G 7

是否可以将 docker-compose/docker-networking 配置为通过端口路由以允许相同的 IP 地址用于不同的容器?

是的,我们可以(熟悉?-_-!)。Docker 提供了一个网络模式选项,称为service:service-name.

当我们执行时docker run,我们可以添加--network=service:service-name标志。这意味着当前容器使用相同的网络命名空间service:service-name. 更多信息参考这里。

尝试下面的撰写文件。我已经测试过了,效果很好。

version: '2'
services:
  web:
    image: nginx
    networks:
      public:
        ipv4_address: 10.0.0.2
    ports:
      - "8880:80"
      - "2220:22"

  ssh:
    image: panubo/sshd
    network_mode: "service:web"
    depends_on:
      - web
networks:
  public:
    external: true
Run Code Online (Sandbox Code Playgroud)