我有一个使用mongodb,mongo-express和自定义节点映像的docker swarm服务。我创建了一个简单的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网络显示了网络中的所有容器。 我可以看到使用localhost:2222连接的后端和使用localhost:8081的mongo-express。
我的问题是后端未连接,甚至看不到mongo数据库。 我尝试将ssh-ing放入mongo-express容器,成功ping通localhost:27017,然后成功ping通localhost:2222。
但是,尝试从后端容器ping / curl mongo-express或mongodb没有任何作用,就像端口arent甚至可见。 (localhost:2222有效,但localhost:8081或localhost:27017无效)。
编辑:在从docker inspect网络复制mongo的ip地址后,我再次ssh进入了后端容器,然后能够成功卷曲10.0.5.8:27017。 为什么不在本地主机上?
答案 0 :(得分:1)
每个容器都有其自己的IP地址。这意味着在docker容器中,localhost
指向自身。这就是为什么您不能期望使用localhost
从mongo-express容器访问mongo容器IP地址的原因。
Docker compose and swarm通过docker-compose.yml文件中定义的服务名称为我们提供了一种方便的方式来处理容器。
因此,从 mongo-express 容器中,使用mongo:27017
连接到mongo。