让我们假设我正在使用一组 CLI docker run 命令来创建容器、网络(在我的情况下为桥接类型)的整个环境并将容器连接到特定网络的场景。
一切正常,直到我只想在一台机器上只有一个这样的环境。
但是,如果我想在同一台机器上拥有与我刚刚创建的环境类似的环境,但出于不同的目的(测试),我会遇到名称冲突问题,因为我无法创建并启动容器和网络同名。
到目前为止,我尝试以与第一个相同的方式启动第二个环境,但在所有容器和网络名称前加上前缀。这可行,但有一个缺陷:在运行对 URI 的所有请求的应用程序中,由于它们具有结构,因此被破坏
<scheme>://<container-name>:<port-number>
并且应用程序无法访问
<prefix-container-name>
.我想要实现的是在与第二个环境相同的机器上运行的第一个环境的精确副本,我可以用它来执行应用程序测试等。
我可以在用于创建环境的所有 docker run 等命令之前使用的命令,并且只有两个 bash 脚本,它们的区别仅在于开头的命名空间命令?
--hostname
为 docker run
允许使用此名称从其他容器访问容器的命令?倒霉--hostname
仅提供通过该名称从容器本身访问容器的能力,而不能从任何其他容器访问该容器。也许有一个选项或命令可以创建别名、虚拟主机或任何我可以放入应用程序 URI 的神奇通用名称 <scheme>://<magic-name>:<port-number>
因此,只要 magic-name
使用不同的容器和网络名称创建第二个环境就不会造成问题。可在环境网谢谢您的帮助。
最佳答案
Is there any concept of namespaces or something similar to it in Docker?
不是真的,不是(但请继续阅读)。
Can using virtual machine [...] be the solution to my problem? ... Isn't that an overkill, will it add an additional set of troubles?
这是一个非常合理的解决方案。如果您想进一步自动化部署,则尤其如此:您应该能够模拟启动一个干净的 VM,然后在其上运行您的配置脚本,然后将其移植到您的真实生产环境中。 Vagrant是一个非常典型的尝试这个工具。最大的问题将是到达各个 VM 的网络连接,这没什么大不了的。
Perhaps there is a kind of
--hostname
fordocker run
command that will allow to access the container from other container by using this name?
docker run --network-alias
非常简要地提到in the docker run
documentation并有这种效果。 docker network connect --alias
is slightly more documented并影响已经创建的容器。Are there any dedicated open source solutions to what I want to achieve?
如果您想摆脱现有的 shell 脚本解决方案,Docker Compose 主要会为您管理这些:它在它创建的所有网络和卷上放置一个名称前缀,并为每个容器在 YAML 中为其名称创建网络别名文件。如果您的主机卷挂载是相对于当前目录的,那么该内容也是相当孤立的。您无法轻松做的一件事是在单独的主机端口上启动堆栈的每个副本,因此您必须解决这些冲突。
Kubernetes 有一个命名空间的概念,这实际上正是您所要求的,但采用它是一项巨大的投资,并且比 Docker Compose 更需要重写您的部署序列。
关于Docker 命名空间、virtualbox 上的 docker、镜像环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54061820/