Mongodb Docker compose:无法使用同一网络将节点容器连接到Mongo容器
这是docker compose.yml 版本:“3” 当我运行Mongodb Docker compose:无法使用同一网络将节点容器连接到Mongo容器,mongodb,docker,docker-compose,Mongodb,Docker,Docker Compose,这是docker compose.yml 版本:“3” 当我运行docker compose up时,我发现无法连接到127.0.0.1端口27017:连接被拒绝 问题是,他们在同一个网络上,加上我从docker本地外部连接到MongoDB容器,一切正常 以下是/etc/mongo/mongod.conf storage: dbPath: /data/db journal: enabled: true systemLog: destinat
docker compose up
时,我发现无法连接到127.0.0.1端口27017:连接被拒绝
问题是,他们在同一个网络上,加上我从docker本地外部连接到MongoDB容器,一切正常
以下是/etc/mongo/mongod.conf
storage:
dbPath: /data/db
journal:
enabled: true
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
# network interfaces
net:
port: 27017
replication:
replSetName: rs0
与Docker中的其他地方一样,127.0.0.1通常表示“此容器”。您的docker compose.yml
文件中对host
的各种提及实际上创建了一个名为“host”的网桥型NAT网络;它不启用主机网络模式。话虽如此,主机联网模式通常是不必要的,所以让我们正确认识这一点:
首先,Docker Compose会自动为每个单独的Docker Compose.yml
文件创建一个专用网桥类型的网络,因此您根本不需要任何网络:
块。由于这样做,服务块web
和mongodb
的名称将是一个容器到达另一个容器的有效主机名
在web:
服务中,您将其命令替换为curl
命令。一旦该命令完成,服务将退出,这几乎肯定不是您想要的。您没有包括相关的Dockerfile
,但我猜它以类似CMD[“npm”,“start”]
的行结尾,该行提供了一个更有用的默认命令。卷声明也有点奇怪:有卷来保存代码不是一个典型的用例,您通常会将(构建的)应用程序树复制到Dockerfile
中的映像中。(使用卷来保存持久数据和注入配置文件,就像您为mongodb:
服务所做的那样,是非常合理的。)
您也不需要显式设置单个容器的容器名称:
或主机名:
,除非在非常特殊的情况下
将其剥离并修复主机名,我们应该得到:
version: '3'
services:
web:
build: ./rqiim
environment:
- MONGO_HOSTNAME=mongodb
ports:
- "8080:8080"
mongodb:
image: mongo:3.4.18-jessie
volumes:
- /data/db:/data/db
- ./mongo:/etc/mongo
command: --config /etc/mongo/mongod.conf
ports:
- "27017:27017"
与Docker中的其他地方一样,127.0.0.1通常表示“此容器”。您的docker compose.yml
文件中对host
的各种提及实际上创建了一个名为“host”的网桥型NAT网络;它不启用主机网络模式。话虽如此,主机联网模式通常是不必要的,所以让我们正确认识这一点:
首先,Docker Compose会自动为每个单独的Docker Compose.yml
文件创建一个专用网桥类型的网络,因此您根本不需要任何网络:
块。由于这样做,服务块web
和mongodb
的名称将是一个容器到达另一个容器的有效主机名
在web:
服务中,您将其命令替换为curl
命令。一旦该命令完成,服务将退出,这几乎肯定不是您想要的。您没有包括相关的Dockerfile
,但我猜它以类似CMD[“npm”,“start”]
的行结尾,该行提供了一个更有用的默认命令。卷声明也有点奇怪:有卷来保存代码不是一个典型的用例,您通常会将(构建的)应用程序树复制到Dockerfile
中的映像中。(使用卷来保存持久数据和注入配置文件,就像您为mongodb:
服务所做的那样,是非常合理的。)
您也不需要显式设置单个容器的容器名称:
或主机名:
,除非在非常特殊的情况下
将其剥离并修复主机名,我们应该得到:
version: '3'
services:
web:
build: ./rqiim
environment:
- MONGO_HOSTNAME=mongodb
ports:
- "8080:8080"
mongodb:
image: mongo:3.4.18-jessie
volumes:
- /data/db:/data/db
- ./mongo:/etc/mongo
command: --config /etc/mongo/mongod.conf
ports:
- "27017:27017"
您使用主机
作为网络,目的是将这些容器放在主机的网络堆栈中吗?因为你所拥有的不是正确的语法。如果没有,那么127.0.0.1只是试图联系web
容器的环回,而不是mongodb
正在监听的任何地方。我假设是前者,在这种情况下,您需要网络模式:“主机”
。将127.0.0.1
替换为mongodb
,即服务名称。由于您在同一网络上,docker将通过服务名称识别它。您是否使用主机
作为网络,并打算将这些容器放在主机的网络堆栈中?因为你所拥有的不是正确的语法。如果没有,那么127.0.0.1只是试图联系web
容器的环回,而不是mongodb
正在监听的任何地方。我假设是前者,在这种情况下,您需要网络模式:“主机”
。将127.0.0.1
替换为mongodb
,即服务名称。由于您在同一网络上,docker将通过服务名称识别它