docker compose: невозможно подключить контейнер узла к контейнеру Монго, используя ту же сеть - PullRequest
0 голосов
/ 24 декабря 2018

это 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: 

когда я запускаю docker-compose up, я получаю Failed to connect to 127.0.0.1 port 27017: Connection refused
что, похоже, проблема, они находятся в одной сетиплюс я подключаюсь к контейнеру 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

1 Ответ

0 голосов
/ 24 декабря 2018

Как и везде в Docker, 127.0.0.1 обычно означает «этот контейнер».Различные упоминания host в вашем файле docker-compose.yml фактически создают NAT-сеть мостового типа, которая называется «host»;он не включает сетевой режим хоста.При этом режим сетевого хоста обычно не нужен, поэтому давайте сделаем это правильно:

Прежде всего, 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"
...