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

lin*_*ina 1 mongodb docker docker-compose

这是docker-compose.yml 版本:“ 3”

services:
    web:
        build: ./rqiim
        command: curl "127.0.0.1:27017"
        volumes:
        - ./rqiim:/app
        - /app/node_modules/
        environment:
        - MONGO_HOSTNAME=127.0.0.1
        ports:
        - "8080:8080"
        networks:
        - host
    mongodb:
        image: mongo:3.4.18-jessie
        container_name: mongodb
        volumes:
        - /data/db:/data/db
        - ./mongo:/etc/mongo
        command: --config /etc/mongo/mongod.conf
        hostname: mongod1
        ports:
        - "27017:27017"
        networks:
        - host
    networks:
      host:
Run Code Online (Sandbox Code Playgroud)

当我运行时,docker-compose up我得到的Failed to connect to 127.0.0.1 port 27017: Connection refused
似乎是问题所在,它们在同一网络上,再加上我从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
Run Code Online (Sandbox Code Playgroud)

Dav*_*aze 5

与Docker中的其他地方一样,127.0.0.1通常表示“此容器”。各种提到的host在你的docker-compose.yml文件实际上创建一个桥型NAT网络碰巧被命名为“主”; 它不启用主机联网模式。话虽这么说,主机联网模式通常是不必要的,所以让我们做对吧:

首先,Docker Compose会自动为每个单独的docker-compose.yml文件创建一个专用的桥式网络,因此这里根本不需要任何networks:块。由于这样做,服务的名称将被阻止,web并且mongodb将成为一个容器到达另一个容器的有效主机名。

在web:服务中,您正在用命令替换其curl命令。该命令完成后,服务将退出,几乎可以肯定这不是您想要的。您还没有包含相关的代码Dockerfile,但是我猜它以这样的行结尾,该行CMD ["npm", "start"]给出了更有用的默认命令。卷的声明也有点奇怪:拥有卷来保存代码不是典型的用例,通常您将COPY(构建的)应用程序树放入图像中Dockerfile。(使用卷来保存持久性数据和注入配置文件,就像使用该mongodb:服务一样,是非常合理的。)

您也不需要显式设置单个容器的container_name:或hostname:,除非在非常特殊的情况下。

删除并固定主机名,我们应该得到:

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"
Run Code Online (Sandbox Code Playgroud)