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

Ant*_*Ant 26 containers docker

我是Docker的新手,所以感谢您的耐心等待.

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

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

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

谢谢!

Eug*_*yer 12

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

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

要生成配置,您可以:


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
Run Code Online (Sandbox Code Playgroud)

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

希望有所帮助


Dim*_*Dak 9

只需根据需要从同一图像运行多次.将创建新容器,然后可以启动它们并停止每个容器保存自己的配置.为方便起见,最好为每个容器命名为"--name".

网络连接:

docker run --name MyContainer1 <same image id>
docker run --name MyContainer2 <same image id>
docker run --name MyContainer3 <same image id>
Run Code Online (Sandbox Code Playgroud)

而已.

$ 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
Run Code Online (Sandbox Code Playgroud)

之后,您可以永久地创建容器,您可以像VM一样启动和停止它们.

docker start MyContainer1
Run Code Online (Sandbox Code Playgroud)

  • 这是如何解决“我需要向每个人传递不同的配置(文件)”的问题的呢? (2认同)

BMi*_*tch 6

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

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