0

假设我正在使用一组 CLI docker run 命令来创建容器、网络(在我的例子中为桥接类型)的整个环境并将容器连接到特定网络。

直到我只想在一台机器上拥有一个这样的环境之前,一切都运行良好。

但是,如果我想在同一台机器上拥有与我刚刚创建的环境相似的环境,但出于不同的目的(测试),我会遇到名称冲突问题,因为我无法创建和启动容器和网络同名。

到目前为止,我尝试以与第一个环境相同的方式启动第二个环境,但为所有容器和网络名称添加前缀。
这行得通,但有一个缺陷:在运行对 URI 的所有请求的应用程序中,由于它们有一个结构,所以它们被破坏了

<scheme>://<container-name>:<port-number>

并且应用程序无法访问<prefix-container-name>

我想要实现的是在与我可以用来执行应用程序测试等的第二个环境相同的机器上运行第一个环境的精确副本。

  1. 在 Docker 中是否有命名空间的概念或类似的概念?
    我可以在所有用于创建环境的 docker run etc 命令之前使用的命令,并且只有两个 bash 脚本,它们仅在开头的命名空间命令不同?
  2. 可以使用虚拟机,即 Oracle Virtualbox 来解决我的问题吗?为第二个环境创建虚拟机?这不是矫枉过正吗,会增加额外的麻烦吗?
  3. 也许有一种--hostnamefordocker run命令允许使用此名称从其他容器访问容器?Unlucky--hostname只能通过这个名称从容器本身访问容器,而不是从任何其他容器。也许有一个选项或命令可以创建别名、虚拟主机或任何我可以放入应用程序 URI 的神奇通用名称,<scheme>://<magic-name>:<port-number>因此只要magic-name在环境网络中可用,创建具有不同容器和网络名称的第二个环境就不会出现问题
  4. 我需要环境的精确副本是因为我想运行测试并检查它们是否也在依赖级别上失败,我认为这是来自持续集成过程的非常简单的场景。对于我想要实现的目标,是否有任何专门的开源解决方案?我不使用 docker composer,而是使用带有所有 docker cli 命令的 bash 脚本来启动和运行整个环境。

感谢您的帮助。

4

1 回答 1

0

在 Docker 中是否有命名空间的概念或类似的概念?

不是真的,不是(但请继续阅读)。

使用虚拟机 [...] 可以解决我的问题吗?……这不是矫枉过正吗,会不会又添麻烦?

这是一个相当合理的解决方案。如果您想进一步自动化部署,则尤其如此:您应该能够模拟启动一个干净的 VM,然后在其上运行您的配置脚本,然后将其移植到您的真实生产环境中。 Vagrant是一个非常典型的尝试工具。最大的问题将是到达各个虚拟机的网络连接,这没什么大不了的。

也许有一种--hostnamefordocker run命令允许使用此名称从其他容器访问容器?

docker run --network-aliasdocker run文档中非常简要地提到并具有此效果。 docker network connect --alias 记录的稍微多一些,并且会影响已经创建的容器。

对于我想要实现的目标,是否有任何专门的开源解决方案?

如果您想摆脱现有的 shell 脚本解决方案,Docker Compose主要为您管理这个:它在它创建的所有网络和卷上放置一个名称前缀,并为每个容器创建与 YAML 中其名称匹配的网络别名文件。如果您的主机卷挂载是相对于当前目录的,那么该内容也是相当隔离的。您不能轻易做的一件事是在单独的主机端口上启动堆栈的每个副本,因此您必须解决这些冲突。

Kubernetes 有一个命名空间的概念,实际上这正是您所要求的,但采用它是一项巨大的投资,并且比 Docker Compose 更需要重写您的部署序列。

于 2019-01-06T14:21:51.970 回答