我有一个docker swarm服务,它使用mongodb,mongo-express和自定义节点映像。我创建了一个简单的docker yaml文件来一起启动它们。
version: '3.1'
services:
mongo:
image: mongo:4.0.6-xenial
environment:
MONGO_INITDB_ROOT_USERNAME:
MONGO_INITDB_ROOT_PASSWORD:
mongo-express:
image: mongo-express
environment:
MONGO_INITDB_ROOT_USERNAME:
MONGO_INITDB_ROOT_PASSWORD:
ports:
- "8081:8081"
backend:
image: backend
ports:
- "2222:2222"
现在我知道docker swarm会自动在所有节点之间创建一个默认的覆盖网络。我的docker inspect network显示网络中的所有容器。我可以看到后端使用localhost:2222和mongo-express使用localhost:8081连接。
我的问题是后端没有连接,甚至也看不到mongo数据库。我尝试ssh进入mongo-express容器,成功ping通localhost:27017,然后成功ping通localhost:2222。
但是,尝试从后端容器ping / curl mongo-express或mongodb什么都不用,就像端口甚至看不见一样。 (localhost:2222有效,但localhost:8081或localhost:27017不可用)。
编辑:我从docker inspect network复制mongo的ip地址后再次进入后端容器,然后能够成功卷曲10.0.5.8:27017。为什么不在localhost上?
每个容器都有自己的IP地址。这意味着在docker容器中,localhost
指的是它自己。这就是为什么你不能期望使用localhost
从mongo-express容器到达mongo容器IP地址。
Docker compose和swarm为我们提供了一种方便的方法来按照docker-compose.yml文件中定义的服务名称来处理容器。
所以从mongo-express容器,使用mongo:27017
连接到mongo。