首页 > 解决方案 > 使用多个具有相同名称的 docker

问题描述

我正在使用 keepalived 构建高可用性设置,其中每台服务器都有自己的一组 docker,这些 docker 将根据它是在 BACKUP 还是 MASTER 中得到适当的处理。但是,出于测试目的,我没有 2 个可以为此打开和关闭的盒子。那么,有没有一种好的(最好是轻量级的)方法可以在同一台机器上设置多个同名的 docker?

本质上,它希望它看起来像这样:

 Physical Server A
 ----------------------------------------- 
|  Virtual Server A                       |
|  -------------------------------------- |
| | keepalived - htmld - accessd - mysql  |
|  -------------------------------------- |
|      ^                                  |
|      |                                  |
|      v                                  |
|  Virtual Server B                       |
|  -------------------------------------- |
| | keepalived - htmld - accessd - mysql  |
|  -------------------------------------- |
 -----------------------------------------

谢谢

标签: dockerhigh-availabilitykeepalived

解决方案


您不能拥有多个具有完全相同名称的容器,但您可以使用docker-composefile 来拥有多个具有相同名称的目录和容器(但有一些差异,我将在下面解释)。

您可以在Docker Docs中阅读有关我以下解释的更多信息。

让我们假设你的:

 Physical Server A
 ----------------------------------------- 
|  Virtual Server A                       |
|  -------------------------------------- |
| | keepalived - htmld - accessd - mysql  |
|  -------------------------------------- |
|      ^                                  |
|      |                                  |
|      v                                  |
|  Virtual Server B                       |
|  -------------------------------------- |
| | keepalived - htmld - accessd - mysql  |
|  -------------------------------------- |
 -----------------------------------------

在您的情况下,我将创建两个目录:vsbvsb. 现在让我们进入这两个目录。

我们有这些文件(至少,但您可以根据您的要求拥有更多文件):

 ----------------------------------------- 
|  /home/vsa/docker-compose.yml           |
|  /home/vsa/keepalived/Dockerfile        |
|  /home/vsa/htmld/Dockerfile             |
|  /home/vsa/accessd/Dockerfile           |
|  /home/vsa/mysql/Dockerfile             |
|  -------------------------------------- |
|      ^                                  |
|      |                                  |
|      v                                  |
|  /home/vsb/docker-compose.yml           |
|  /home/vsb/keepalived/Dockerfile        |
|  /home/vsb/htmld/Dockerfile             |
|  /home/vsb/accessd/Dockerfile           |
|  /home/vsb/mysql/Dockerfile             |
|  -------------------------------------- |
 -----------------------------------------

请准确记下文件名,Dockerfile以大写 D 开头。

让我们看看docker-compose.yml

version: '3.9'

services:
    keepalived:
        build: ./keepalived
        restart: always
    htmld:
        build: ./htmld
        restart: always
    accessd:
        build: ./accessd
        restart: always
    mysql:
        build: ./mysql
        restart: always

networks:
  default:
    external:
      name: some_network
volumes:
    some_name: {}

让我们首先深入研究docker-compose.yml

Version部分定义要使用的版本。Services部分启动您要创建和运行的服务和容器。

我使用过类似keepalivedunder 的名称services。您可以在那里使用任何您想要的名称,因为这是您的选择。

在 下keepalived,关键字build指定Dockerfile存在于哪个路径,所以当路径被调用/home/vsa/keepalived时,所以我们.在这里使用 which 的意思,然后它进入keepalived目录,搜索Dockerfile(在docker-compose.ymlfor 中vsb,它在 中搜索这个文件/home/vsb/keepalived)。

networkspart 指定了external这些容器使用的网络,这样当我们来自 docker-compose 的所有容器都在运行时,它们就在同一个 docker 网络中,所以它们可以看到并相互交谈。name零件具有some_network您可以选择之前创建的任何名称的名称。

如何创建一个名为的网络some_network是,如果你在 Linux 中,你应该docker network create some_network在运行 docker-compose 文件之前运行。

volumes部分指定这些服务的卷的名称。

这是keepalived目录中名为的文件的示例Dockerfile

FROM ubuntu:latest # see [Dockerfile Docs][2] for more info
# after FROM command, you can use
# other available commands to reach
# your own goal

现在让我们去Dockerfile

FROM命令指定要使用的操作系统基础。在这种情况下,我们想使用ubuntu例如,以便我们基于ubuntu.

还有其他命令,您可以在上面的链接中看到它们。

Dockerfile使用您自己的命令和关键字完成这两个docker-compose.yml文件后,您可以通过以下命令运行和创建它们:

docker-compose -f /home/vsa/docker-compose.yml up -d
docker-compose -f /home/vsb/docker-compose.yml up -d

现在我们将有八个容器调用它们(docker 自动调用它们,否则您将自己显式命名它们):

vsa_keepalived
vsa_htmld
vsa_accessd
vsa_mysql
vsb_keepalived
vsb_htmld
vsb_accessd
vsb_mysql

推荐阅读