当前位置: 首页 > 面试题库 >

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

焦苏燕
2023-03-14
问题内容

我是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)相比,您最终拥有很多图像,而a)它的可移植性更高。

希望能有所帮助



 类似资料:
  • 问题内容: 我创建了一个本地docker注册表,然后从docker hub提取了一些docker镜像,然后将其推送到本地注册表。现在,我要删除本地图像。但是这里的问题是图像相同,我无法删除它们。我搜索了解决方案,但找不到解决方案。 如您所见,两个图片都相同。如何删除它们? 编辑 我的泊坞窗版本: 输出: 来自守护程序的错误响应:冲突,无法删除图像810001cb03af,因为它已在多个存储库中标记

  • 我有一个依赖于多个docker容器的应用程序。我使用docker撰写,以便所有容器都在同一个网络中进行容器间通信。但是,我的两个容器在各自的容器中监听相同的端口8080,但是映射到主机上的不同端口: 8072,8073。对于集装箱间的通信,因为我们使用集装箱的端口,这会引起问题吗? 限制条件: 我需要两个容器才能运行我的应用程序。因此,我无法将具有相同内部端口的其他容器隔离到不同的网络 所有容器都

  • 当我在 2 台 Debian 服务器上运行 Docker 雄猫管理器时,我有以下 2 个显示器: Tomcat1:https://i.stack.imgur.com/kucJQ.png Tomcat2:https://i.stack.imgur.com/ygOCh.png Tomcat状态内存池以不同的名称列出,如“PS 两个容器以相同的方式运行: 使用相同的参数 xml 文件: 和 两台服务器的

  • 问题内容: 我了解您可以使用scale命令来使用docker-compose来旋转多个容器。但是,它们都将具有相同的配置。 是否可以在同一主机上以同一配置(不同文件)启动容器的容器? 使用以下命令: 只有容器会运行,这不是我想要的。 - 编辑 - 当我尝试运行两个命令时,将发生以下情况。 我和这个样子的: 问题答案: 您需要做的就是更改项目名称。默认情况下,compose使用基于当前目录命名的项目

  • 我正在使用wurstmeister的docker-kafka项目在容器中运行kafka/zoomaster。我使用docker-comup将容器localhost作为变量。 我已经编写了一个Java应用程序,它使用flink连接并使用这个Kafka容器的一个主题。如果我导出一个可运行的罐子,并从我的机器上运行它,它绝对可以正常工作。当我创建下面的图像以从另一个docker容器运行jar时,我在线程

  • 问题内容: 我在连接使用docker-compose启动的mysql docker容器时遇到一些问题。这是一篇很长的帖子(对不起!)。 这是我的docker-compose.yml文件: 然后: OK,所以现在我有一个正在运行的Docker容器运行器mysql:5.7。大!还是?在django应用中进行测试时,出现操作错误,提示不允许用户连接数据库。好吧,那么也许是我的django吗? 好的,也许