docker swarm 上的服务未被与 vpc 对等的 atlas 集群列入白名单

services on docker swarm are not whitelisted by atlas cluster that is peered with the vpc

环境概览:

  1. Mongodb Atlas 上与 vpc 对等的集群
  2. VPC
  3. 中的EC2实例运行
  4. docker EC2 实例中的集群。

我遇到了什么:

  1. 我可以使用来自 EC2 实例的 mongo cli 连接到 mongo
  2. 我的所有容器都无法连接到 mongodb,即使它们在这个 EC2 实例上 运行
  3. 只要我将 EC2 实例的 public ip 列入白名单,他们就可以连接 - 但这很奇怪,我希望他们能够连接,因为他们是 运行 on 无需任何特殊白名单即可连接。

我使用的swarm初始化命令:

docker swarm --init --advertise-addr <private ip of the EC2>

当我尝试使用 public ip 时它不起作用,当我没有将 --advertise-addr 添加到 swarm init 时它也不起作用。

其他有用信息:

Docker 文件:

FROM node:12-alpine as builder

ENV TZ=Europe/London
RUN npm i npm@latest -g
RUN mkdir /app && chown node:node /app
WORKDIR /app

RUN apk add --no-cache python3 make g++ tini \
    && apk add --update tzdata

USER node
COPY package*.json ./
RUN npm install --no-optional && 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"]



我不知道为什么会这样,我该如何解决?

您的 swarm 容器 运行 在您的 EC2 上的单独网络上。

here 所述,docker 在初始化 swarm 时创建了一个特殊的 'ingress' 网络。

为了允许它们连接,您可能需要重新配置 docker 设置的默认设置,或者将 docker 的入口网络使用的特定网络接口列入白名单。

在与高级 DevOps 工程师会面后,我们终于找到了问题所在。 原来容器 运行 所在的网络的 CIDR 块与 VPC 的 CIDR 重叠。我们所做的是将以下内容添加到 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