#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
.