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

2024-03-29 02:07:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Docker完全是新手,所以我感谢你的耐心

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

现在,我的理解是,一旦构建了一个映像,这就是部署的内容,但我的问题是,当容器之间的配置不同时,我不认为构建同一应用程序的多个映像有什么意义

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

谢谢


Tags: 文件方法docker应用程序内容部署容器意义
3条回答

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

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

我认为看一些容易理解的例子可以给你最好的印象

您想要做的是完全有效的,映像应该是您需要运行的任何东西,而不需要配置

要生成配置,您可以:


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

当然,你可以用这个做任何你喜欢的事情。例如,这将配置一个通用端口映像: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)相比,它更便于携带

希望有帮助

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

之后,您将永久创建容器,您可以像虚拟机一样启动和停止它们

docker start MyContainer1

相关问题 更多 >