在解决方案之间共享核心 docker 容器

Sharing a core docker container between solutions

我正在构建几个微服务,它们将通过 rabbitmq 和 ocelot 相互通信。每个微服务的代码库都在一个单独的 git 存储库中,代码仅通过内部 nuget 服务器共享,每个解决方案都构建了 nuget(公开的 DTO 和每个 API 的示例 .NET 客户端)。我想要做的是设置它,以便所有微服务都可以启动,并且从 visual studio 2019 年起 运行 进行最少的调整——并且所有微服务都试图使用单个 rabbitmq 容器.

注意:这是 rabbitmq 的事实是偶然的。我可以将其与任何其他类型的 public 容器互换,结果相同。

我想做的是能够在作为每个解决方案一部分的 docker-compose 文件中指定命名的 rabbitmq 容器;如果 rabbitmq 容器存在,我希望 VS 实例只使用它,而不是尝试创建一个新容器。

在创建了 docker-compose 并添加了 rabbitmq 实例之后,我发现如果我尝试调试到解决方案中,一个(要构建的第二个)将无法构建或 运行 因为命名的 rabbitmq 实例已经存在 - 所以我不能 运行 这两种解决方案,这使我无法通过 rabbit 实例测试它们之间的交互...等等

我只是像这样声明兔子实例:

mycompany.mydomain.rabbitmq: 端口: - “15672:15672” - “5672:5672”

所以预期的结果是我可以只使用 rabbitmq 实例。一种解决方案是从命令行或其他任何方式简单地 运行 容器,我只是希望有一种简单的即插即用方法。有什么想法吗,docker 大神们?我还没有使用 kubernetes,但打算使用 docker 组合成 bootstrap.

我的建议是在所有不同的项目中使用包装服务来控制只使用一个相同的 rabbitmq 实例。示例如下:

文件结构:

shubuntu1@shubuntu1:~/mic$ tree
.
├── prj1
│   └── docker-compose.yaml
├── prj2
│   └── docker-compose.yaml
└── wrapper
    ├── docker-entrypoint.sh
    └── Dockerfile

3 directories, 4 files

wrapper/Dockerfile:

FROM alpine

# install docker client in wrapper container
RUN wget https://download.docker.com/linux/static/stable/x86_64/docker-19.03.0.tgz && \
    tar zxvf docker-19.03.0.tgz && \
    cp -rf docker/docker /bin && \
    rm -fr docker-19.03.0.tgz docker

COPY . /
RUN chmod +x /docker-entrypoint.sh

CMD ["shared-rabbitmq"]
ENTRYPOINT ["/docker-entrypoint.sh"]

wrapper/docker-entrypoint.sh:

#!/bin/sh
shared_rabbitmq_name=

docker inspect $shared_rabbitmq_name > /dev/null 2>&1
if [ $? -ne 0 ]; then
    docker run -d --name $shared_rabbitmq_name rabbitmq
fi

prj1/docker-compose.yaml:

version: '3'

services:
  rabbitmq_wrapper:
    build: ../wrapper
    image: rabbitmq_wrapper
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

  nginx:
    image: nginx

prj2/docker-compose.yaml:

version: '3'

services:
  rabbitmq_wrapper:
    build: ../wrapper
    image: rabbitmq_wrapper
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

  nginx:
    image: nginx

如上,在任何项目文件夹中,prj1prj2执行docker-compose up -d,它会启动2个不同的nginx容器(这模拟了你不同的applications/solutions) .但是他们只会启动一个名为 shared-rabbitmq 的 rabbitmq 容器,如果 prj1 已经启动了这个容器,prj2 将只使用这个容器而不是启动一个新容器,因为它已经进行了检测在docker-entrypoint.sh查看一个rabbitmq容器是否已经启动,唯一的rabbitmq容器只有在没有可用时才启动。

最终示例输出:

shubuntu1@shubuntu1:~/mic/prj1$ docker-compose up -d
Creating prj1_nginx_1            ... done
Creating prj1_rabbitmq_wrapper_1 ... done
shubuntu1@shubuntu1:~/mic/prj1$ cd ..
shubuntu1@shubuntu1:~/mic$ cd prj2
shubuntu1@shubuntu1:~/mic/prj2$ docker-compose up -d
Creating prj2_rabbitmq_wrapper_1 ... done
Creating prj2_nginx_1            ... done
shubuntu1@shubuntu1:~/mic/prj2$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                NAMES
fb8739a4fe4d        nginx               "nginx -g 'daemon of…"   6 seconds ago       Up 2 seconds        80/tcp                               prj2_nginx_1
a98346ecb6f2        rabbitmq            "docker-entrypoint.s…"   14 seconds ago      Up 11 seconds       4369/tcp, 5671-5672/tcp, 25672/tcp   shared-rabbitmq
238973fd85f1        nginx               "nginx -g 'daemon of…"   17 seconds ago      Up 12 seconds       80/tcp                               prj1_nginx_1