如何在单个主机上运行Docker容器池,在重新启动时保留其IP地址?

上下文

我想并行执行大量的testing套件。 为了确保给定testing套件的结果不会受到之前testing套件的副作用的影响,我希望每个testing套件都能够在干净的新近初始化的环境中运行。

每个testing套件之间的环境初始化过于昂贵。 因此,我正在考虑创build一个包含已初始化系统的Docker镜像,并在该镜像中启动一个新的Docker容器中运行每个testing套件。 由于testing套件数量巨大,我想在同一主机上并行运行多个容器(即testing套件)。

不幸的是,在我的情况下,系统初始化步骤会产生一些应用程序特定的configuration文件,这些文件引用容器的当前IP地址。 通过后续的docker run命令执行一个testing套件将会失败,因为testing套件将看到与应用程序configuration文件中包含的不同的IP地址(容器的IP地址在每次重新启动时被碰撞)。

  • 我如何以编程方式在单个主机上运行多个Docker容器,确保每个容器在重新启动时保留自己的IP地址?
  • 在并行运行时,多个容器可以共享“相同的”IP地址,这样我只能初始化系统一次?

我想你不能覆盖重新启动容器重新定义的IP地址。 我们有类似的麻烦:我们的dockerized应用程序已经configuration了ip名称是硬编码的,所以每次重启后我们都有很多痛苦。 这是某种服务发现问题。

作为一个快速修复,你可以把简单的重新configuration脚本,在你的configuration更新IP地址,并在每个testing会话之前运行它。

但在我看来,您的解决scheme的体系结构不符合Docker原则。 所有的不可变对象(二进制文件,configuration等)应该被合并在一个Docker镜像中。 任何额外的初始化应该在ENTRYPOINT (例如在运行开始时)。 如果这对你来说太贵了,你也可以把初始化放在图像中,但是你必须在运行时对它们进行破解。

据我所知,没有办法使docker容器的IP对应于正在构build映像的容器的IP。