我在Ubuntu Linux 16.04上使用Docker版本18.03.1-ce运行Docker容器。在这台特定的计算机上,与在Ubuntu 18.04上的Docker 17.12.1-ce笔记本上的安装相比,我注意到了行为上的差异。 当我启动相同的docker-compose部署,该部署在使用docker v18的主机上的docker v17本地无问题运行时,我无法访问我的暴露端口和转发端口。
部署由2个容器组成,这些容器在后端网络上进行通信。其中一个容器还暴露了一个Web端口(在4000上),我希望可以从外部对其进行访问。我认为这是一个相当普通的设置。
在v18安装中,我需要显式运行docker network connect bridge <containername>
才能访问我的公开端口。这会将我的容器与暴露的端口连接到默认的网桥网络,然后才可以访问端口4000。
我注意到的另一个区别是,在v17安装中,我可以ping后端网络中的ip地址,例如ping 172.20.0.2可以正常工作。在v18安装上,此操作无效。我只能ping桥接网络上的主机。
在阅读了许多文档之后,我不太确定这实际上是所需的行为,因为隔离后端网络实际上是一个功能。
另一方面,我还没有找到自动将容器连接到网桥网络和后端网络的方法。实现这一目标的docker-compose语法是什么?
撰写文件如下:
version: '3'
services:
mqttweb:
restart: always
container_name: mqttsock
image: mqsocksrv
depends_on:
- rabbitmq
build:
context: .
ports:
- "4000:4000"
- "4001:4001"
networks:
- backend
volumes:
- logs:/root/.pm2/logs/
rabbitmq:
restart: always
container_name: rabbitmq
image: mqttweb_rabbit
build:
context: .
dockerfile: Dockerfile.rabbitmq
hostname: rabbitmq
environment:
- RABBITMQ_DEFAULT_USER=rabbit
- RABBITMQ_DEFAULT_PASS=secret
networks:
- backend
networks:
backend:
driver: bridge
volumes:
logs: