多个Docker容器,相同的图像,不同的配置

时间:2016-08-16 16:57:45

标签: docker containers

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

我正在寻找一种使用相同图像部署多个容器的方法,但是我需要将不同的配置(文件)传递给每个容器?

现在,我的理解是,一旦你构建了一个图像,这就是部署的内容,但对我来说问题是我在构建同一应用程序的多个图像时没有看到这一点。它只是容器之间不同的配置。

如果这是常态,那么我将不得不处理它,但如果有另一种方式,那么请让我摆脱我的痛苦! :)

谢谢!

3 个答案:

答案 0 :(得分:11)

根据需要从同一图像中多次运行。将创建新容器,然后可以启动它们并停止每个容器保存自己的配置。为方便起见,最好为每个容器命名为“--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

答案 1 :(得分:7)

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

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

要生成配置,您可以:

a)卷安装

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

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

大多数高级泊坞窗图像确实提供了一个复杂的所谓入口点,它消耗你在启动图像时传递的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. 期间复制脚本
  4. 然后在图像启动期间,您的ENV变量将导致此触发:https://github.com/docker-library/percona/blob/master/5.7/docker-entrypoint.sh#L91
  5. 当然,你可以做任何你喜欢的事情。例如,这会配置一般的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)派生图像

    也许是为了#34;完整性&#34;,图像派生策略,所以你有基础图像称为&#34; myapp&#34;对于安装X,您可以创建一个新图像

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

    并将此图像称为myapp:x - 显而易见的问题是,相比之下,你最终会拥有大量图像,而a)便携性更强。

    希望有所帮助

答案 2 :(得分:3)

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

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