Mongodb Docker compose:无法使用同一网络将节点容器连接到Mongo容器

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.yml 版本:“3”

当我运行
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将通过服务名称识别它