docker-compose 可以在具有离散端口的服务之间共享一个 ip 吗?
Can docker-compose share an ip between services with discrete ports?
我们目前有 docker 个使用 supervisord 进行复杂构建的容器,这样我们就可以将服务组合在一起。比如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
...其中 public
是预定义的 docker macvlan 网络。
当我尝试这样做时,出现错误:
ERROR: for ssh Cannot start service ssh: Address already in use
我知道另一种解决方案是引入第三种服务作为代理。但是,我认为这是一个足够简单的案例,不需要它。
是否可以配置docker-compose/docker-networking按端口路由,让不同的容器使用同一个IP地址?
Is it possible to configure docker-compose/docker-networking to route by the port to allow the same IP address to be used for different containers?
是的,我们可以(熟悉吗?-_-!)。 Docker提供了一个网络模式选项,叫做service:service-name
。
当我们执行docker run
时,我们可以添加--network=service:service-name
标志。这意味着当前容器使用 service:service-name
相同的网络命名空间。 More information 参考这里。
尝试下面的撰写文件。我已经测试过了,效果很好。
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
我们目前有 docker 个使用 supervisord 进行复杂构建的容器,这样我们就可以将服务组合在一起。比如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
...其中 public
是预定义的 docker macvlan 网络。
当我尝试这样做时,出现错误:
ERROR: for ssh Cannot start service ssh: Address already in use
我知道另一种解决方案是引入第三种服务作为代理。但是,我认为这是一个足够简单的案例,不需要它。
是否可以配置docker-compose/docker-networking按端口路由,让不同的容器使用同一个IP地址?
Is it possible to configure docker-compose/docker-networking to route by the port to allow the same IP address to be used for different containers?
是的,我们可以(熟悉吗?-_-!)。 Docker提供了一个网络模式选项,叫做service:service-name
。
当我们执行docker run
时,我们可以添加--network=service:service-name
标志。这意味着当前容器使用 service:service-name
相同的网络命名空间。 More information 参考这里。
尝试下面的撰写文件。我已经测试过了,效果很好。
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