Модифицированный Докером контейнер узла не подключается или не видит контейнер mongo db в оверлейной сети docker swarm

#node.js #mongodb #docker #docker-swarm #docker-networking

#node.js #mongodb #docker #docker-swarm #докер-сеть

Вопрос:

У меня есть служба docker swarm, которая использует mongodb, mongo-express и пользовательский образ узла. Я создал простой файл 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 отображает все контейнеры в сети.
Я вижу, что серверная часть подключена с использованием localhost: 2222, а mongo-express — с использованием localhost: 8081.

Моя проблема в том, что серверная часть не подключается и даже не может видеть базу данных mongo. Я попытался подключиться по ssh к контейнеру mongo-express, успешно проверил localhost: 27017, затем успешно проверил localhost: 2222.

Однако попытка выполнить пинг / curl mongo-express или mongodb из внутреннего контейнера ничего не дает, похоже, что порты даже не видны. (localhost: 2222 работает, но localhost: 8081 или localhost: 27017 — нет).

РЕДАКТИРОВАТЬ: я снова подключился по ssh к серверному контейнеру после копирования ip-адреса mongo из docker inspect network, после чего смог успешно выполнить curl 10.0.5.8: 27017. Почему его нет на локальном хостинге?

Ответ №1:

У каждого контейнера есть свой собственный IP-адрес. Это подразумевает, что внутри контейнера docker localhost ссылается на самого себя. Вот почему вы не можете ожидать получения IP-адреса контейнера mongo из контейнера mongo-express с помощью localhost .

Docker compose и swarm предоставляют нам удобный способ обращаться к контейнерам по их имени службы, как определено в файле docker-compose.yml.

Итак, из контейнера mongo-express подключитесь к mongo с помощью mongo:27017 .