#mongodb #docker #amazon-ec2 #docker-swarm
#mongodb #docker #amazon-ec2 #docker-swarm
Вопрос:
обзор среды:
- Кластер Mongodb в Atlas, который просматривается с помощью vpc
- Экземпляр Ec2, запущенный в VPC
- docker swarm внутри экземпляра EC2.
Что я испытываю:
- Я могу подключиться к mongo с помощью командной строки mongo из экземпляра EC2
- все мои контейнеры не могут подключиться к mongodb, даже если они работают на этом экземпляре EC2
- как только я внесу в белый список общедоступный IP-адрес экземпляра EC2, они смогут подключиться, но это странно, я хочу, чтобы они могли подключаться, потому что экземпляр, на котором они запущены, может подключаться без какого-либо специального белого списка.
я использовал команду инициализации swarm:
docker swarm --init --advertise-addr <private ip of the EC2>
Это не сработало, когда я попытался использовать общедоступный ip, и это также не работает, когда я не добавляю --advertise-addr
в swarm init.
дополнительная полезная информация:
Dockerfile:
FROM node:12-alpine as builder
ENV TZ=Europe/London
RUN npm i npm@latest -g
RUN mkdir /app amp;amp; chown node:node /app
WORKDIR /app
RUN apk add --no-cache python3 make g tini
amp;amp; apk add --update tzdata
USER node
COPY package*.json ./
RUN npm install --no-optional amp;amp; npm cache clean --force
ENV PATH /app/node_modules/.bin:$PATH
COPY . .
EXPOSE 8080
FROM builder as dev
USER node
CMD ["nodemon", "src/services/server/server.js"]
FROM builder as prod
USER node
HEALTHCHECK --interval=30s CMD node healthcheck.js
ENTRYPOINT ["/sbin/tini", "--"]
CMD ["node", "--max-old-space-size=2048" ,"src/services/server/server.js"]
Я понятия не имею, почему он так себя ведет, как я могу это исправить?
Комментарии:
1. Указано ли в документации atlas, что белый список не требуется для пиринга vpc?
2. И я предполагаю, что вы подключаетесь к разным вещам из экземпляров и контейнеров. Используйте URI и используйте идентичные URI.
3. пиринг vpc предназначен для того, чтобы кластер atlas включил в белый список весь VPC. в этом вся идея. каким-то образом он думает, что контейнер имеет другой частный IP-адрес или даже не имеет того же частного IP-адреса, что и экземпляр EC2, на котором он запущен
Ответ №1:
После встречи со старшим инженером DevOps мы, наконец, нашли проблему. оказывается, блок CIDR сети, в которой работали контейнеры, перекрывался с CIDR VPC. что мы сделали, так это добавили следующее в docker-compose
networks:
wm-net:
driver: overlay
ipam:
driver: default
config:
- subnet: 172.28.0.0/16 #this CIDR doesn't overlap with the VPC
Ответ №2:
Ваши контейнеры swarm работают в отдельной сети на вашем EC2.
Как объясняется здесь, специальная входная сеть создается docker при инициализации swarm.
Чтобы разрешить им подключение, вам может потребоваться перенастроить настройки по умолчанию, установленные docker, или внести в белый список конкретный сетевой интерфейс, который используется входной сетью docker.
Комментарии:
1. не могли бы вы уточнить? пошаговое решение будет приятным.
2. кроме того, на компьютере запущена сеть docker, так почему же кластер atlas не распознает, что трафик поступает с компьютера в vpc?