【问题标题】:Multiple Docker containers, same image, different config多个 Docker 容器,相同的镜像,不同的配置
【发布时间】:2016-12-23 03:53:18
【问题描述】:

我对 Docker 完全陌生,因此感谢您的耐心等待。

我正在寻找一种方法来部署具有相同映像的多个容器,但是我需要向每个容器传递不同的配置(文件)?

现在,我的理解是,一旦构建了映像,就会部署它,但对我来说,问题是我没有看到构建同一应用程序的多个映像的意义,因为它只是配置容器之间的差异。

如果这是常态,那么我将不得不处理它,但是如果有其他方法,那么请让我摆脱痛苦! :)

谢谢!

【问题讨论】:

  • 可以在运行时动态挂载配置文件。

标签: docker containers


【解决方案1】:

我认为查看易于理解的示例可以为您提供最好的图片。

您想要做的是完全有效的,图像应该是您需要运行的任何东西,无需配置。

要生成配置,您可以:


a) 卷安装

在容器启动docker run -v my.ini:/etc/mysql/my.ini percona(与docker-compose 类似)期间使用卷并挂载文件。 请注意,您可以根据需要多次重复此操作,因此将多个配置装入您的 容器 (即镜像的运行时版本)。 您将在运行容器之前在主机上创建这些配置,并且需要将这些文件与容器一起传送,这是这种方法的缺点(可移植性)

b) 基于入口点的配置(生成)

大多数高级 docker 镜像确实提供了一个复杂的所谓入口点,它使用您在启动镜像时传递的 ENV 变量,为您创建配置,例如 https://github.com/docker-library/percona/blob/master/5.7/docker-entrypoint.sh

因此,当您运行此映像时,您可以执行docker run -e MYSQL_DATABASE=myapp percona,这将启动 percona 并为您创建数据库 percona。 这都是由

完成的
  1. 在此处添加入口点脚本https://github.com/docker-library/percona/blob/master/5.7/Dockerfile#L65
  2. 在镜像构建过程中不要忘记复制脚本https://github.com/docker-library/percona/blob/master/5.7/Dockerfile#L63
  3. 然后在映像启动期间,您的 ENV 变量将导致此触发:https://github.com/docker-library/percona/blob/master/5.7/docker-entrypoint.sh#L91

当然,你可以用它做任何你喜欢的事情。例如,这配置了一个通用的 portus 图像:https://github.com/EugenMayer/docker-rancher-extra-catalogs/blob/master/templates/registry-slim/11/docker-compose.yml 其中有这个入口点https://github.com/EugenMayer/docker-image-portus/blob/master/build/startup.sh

所以你看,入口点策略非常常见而且非常强大,我想只要有可能就走这条路。

c) 派生图像

也许是为了“完整性”,图像派生策略,所以你有一个名为“myapp”的基础图像,并且你为安装 X 创建一个新图像

from myapp
COPY my.ini /etc/mysql/my.ini
COPY application.yml /var/app/config/application.yml

并将此图像称为 myapp:x - 显而易见的问题是,另一方面,您最终会拥有大量图像,而 a) 它更便携。

希望有帮助

【讨论】:

    【解决方案2】:

    只需根据需要从同一个图像运行多次。将创建新容器,然后可以启动和停止它们,每个容器都保存自己的配置。为方便起见,最好给每个容器起一个带有“--name”的名称。

    F.i:

    docker run --name MyContainer1 <same image id>
    docker run --name MyContainer2 <same image id>
    docker run --name MyContainer3 <same image id>
    

    就是这样。

    $ docker ps
    CONTAINER ID        IMAGE            CREATED          STATUS               NAMES
    a7e789711e62        67759a80360c   12 hours ago     Up 2 minutes         MyContainer1
    87ae9c5c3f84        67759a80360c   12 hours ago     Up About a minute    MyContainer2
    c1524520d864        67759a80360c   12 hours ago     Up About a minute    MyContainer3
    

    之后,您将永久创建容器,并且可以像 VM 一样启动和停止它们。

    docker start MyContainer1
    

    【讨论】:

    • 这如何解决“我需要向每个人传递不同的配置(文件)”,这是问题的核心?
    • 每个容器可以有不同的配置。更改保持不变。
    • OP 想从同一个镜像部署多个容器,这比配置文件更核心。 @DimiDak 回答了这个问题。
    【解决方案3】:

    每个容器都使用相同的 RO 映像运行,但具有 RW 容器特定的文件系统层。结果是每个容器都可以拥有自己的文件,这些文件与其他容器不同。

    您可以在 CLI 上传递配置、作为环境变量或作为唯一卷挂载。这是 Docker 的一个非常标准的用例。

    【讨论】:

    • 太棒了,谢谢 :) 但是自动化这个配置可行吗?例如,如果我要添加一堆不同的容器,它们都使用相同的 Nginx 映像,但每个容器都有不同的 .conf,我该如何设置将与它一起部署的 .conf。
    • 您可以将 conf 文件作为一个卷共享到每个容器中。卷可以是目录或单个文件。
    猜你喜欢
    • 2019-11-06
    • 2022-11-27
    • 2022-01-19
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    相关资源
    最近更新 更多