Docker 命名空间,docker 在 virtualbox 上,镜像环境
Docker namespace, docker on virtualbox, mirror environment
让我们假设我正在使用一组 CLI docker 运行 命令来创建容器、网络(在我的例子中是桥接类型)的整个环境并将容器连接到特定网络的场景。
一切正常,直到我想在一台机器上只有一个这样的环境。
但是,如果我想在同一台机器上拥有与我刚刚创建的环境类似的环境,但出于不同的目的(测试),我遇到了名称冲突问题,因为我无法打包并启动同名的容器和网络。
到目前为止,我尝试以与第一个环境相同的方式启动第二个环境,但为所有容器和网络名称添加前缀。
这有效但有一个缺陷:在应用程序中 运行 所有对 URI 的请求都被破坏了,因为它们有一个结构
<scheme>://<container-name>:<port-number>
并且应用程序无法访问 <prefix-container-name>
。
我想要实现的是在与第二个环境相同的机器上拥有第一个环境的精确副本运行,我可以用它来执行应用程序测试等
- 在Docker中是否有命名空间的概念或类似的概念?
我可以在我用来创建环境的所有 docker 运行 等命令之前使用的命令,并且只有两个 bash 脚本,它们的区别仅在于开头的命名空间命令?
- 可以使用虚拟机,即 Oracle Virtualbox 来解决我的问题吗?为第二个环境创建一个虚拟机?这不是矫枉过正吗,会不会增加一些额外的麻烦?
- 也许有一种
--hostname
for docker run
命令允许使用此名称从其他容器访问容器?不幸的是 --hostname
只允许通过这个名称从容器本身访问容器,而不能从任何其他容器访问。也许有一个选项或命令可以创建一个别名、虚拟主机或任何我可以放入应用程序 URI 中的神奇通用名称 <scheme>://<magic-name>:<port-number>
,因此创建具有不同容器和网络名称的第二个环境不会造成任何问题,只要 magic-name
在环境network 中可用
- 我需要精确的环境副本是因为我想进行测试 运行 并检查它们是否也在依赖级别上失败,我认为这是来自持续集成过程的非常简单的场景。对于我想要实现的目标,是否有专门的开源解决方案?我不使用 docker 作曲家,而是使用 bash 脚本和所有 docker cli 命令来启动整个环境并 运行ning.
感谢您的帮助。
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
for docker 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 and has this effect. docker network connect --alias
is slightly more documented 并影响已经创建的容器。
Are there any dedicated open source solutions to what I want to achieve?
Docker Compose mostly 为你管理这个,如果你想离开你现有的 shell-script 解决方案:它放置一个名称前缀在它创建的所有网络和卷上,并为每个与其在 YAML 文件中的名称匹配的容器创建网络别名。如果您的主机卷挂载是相对于当前目录的,那么该内容也是相当孤立的。您不能轻易做到的一件事是在单独的主机端口上启动堆栈的每个副本,因此您必须解决这些冲突。
Kubernetes 有一个命名空间的概念,这实际上正是您所要求的,但采用它是一项巨大的投资,并且比 Docker Compose 更需要重写您的部署序列。
让我们假设我正在使用一组 CLI docker 运行 命令来创建容器、网络(在我的例子中是桥接类型)的整个环境并将容器连接到特定网络的场景。
一切正常,直到我想在一台机器上只有一个这样的环境。
但是,如果我想在同一台机器上拥有与我刚刚创建的环境类似的环境,但出于不同的目的(测试),我遇到了名称冲突问题,因为我无法打包并启动同名的容器和网络。
到目前为止,我尝试以与第一个环境相同的方式启动第二个环境,但为所有容器和网络名称添加前缀。
这有效但有一个缺陷:在应用程序中 运行 所有对 URI 的请求都被破坏了,因为它们有一个结构
<scheme>://<container-name>:<port-number>
并且应用程序无法访问 <prefix-container-name>
。
我想要实现的是在与第二个环境相同的机器上拥有第一个环境的精确副本运行,我可以用它来执行应用程序测试等
- 在Docker中是否有命名空间的概念或类似的概念?
我可以在我用来创建环境的所有 docker 运行 等命令之前使用的命令,并且只有两个 bash 脚本,它们的区别仅在于开头的命名空间命令? - 可以使用虚拟机,即 Oracle Virtualbox 来解决我的问题吗?为第二个环境创建一个虚拟机?这不是矫枉过正吗,会不会增加一些额外的麻烦?
- 也许有一种
--hostname
fordocker run
命令允许使用此名称从其他容器访问容器?不幸的是--hostname
只允许通过这个名称从容器本身访问容器,而不能从任何其他容器访问。也许有一个选项或命令可以创建一个别名、虚拟主机或任何我可以放入应用程序 URI 中的神奇通用名称<scheme>://<magic-name>:<port-number>
,因此创建具有不同容器和网络名称的第二个环境不会造成任何问题,只要magic-name
在环境network 中可用
- 我需要精确的环境副本是因为我想进行测试 运行 并检查它们是否也在依赖级别上失败,我认为这是来自持续集成过程的非常简单的场景。对于我想要实现的目标,是否有专门的开源解决方案?我不使用 docker 作曲家,而是使用 bash 脚本和所有 docker cli 命令来启动整个环境并 运行ning.
感谢您的帮助。
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 and has this effect. docker network connect --alias
is slightly more documented 并影响已经创建的容器。
Are there any dedicated open source solutions to what I want to achieve?
Docker Compose mostly 为你管理这个,如果你想离开你现有的 shell-script 解决方案:它放置一个名称前缀在它创建的所有网络和卷上,并为每个与其在 YAML 文件中的名称匹配的容器创建网络别名。如果您的主机卷挂载是相对于当前目录的,那么该内容也是相当孤立的。您不能轻易做到的一件事是在单独的主机端口上启动堆栈的每个副本,因此您必须解决这些冲突。
Kubernetes 有一个命名空间的概念,这实际上正是您所要求的,但采用它是一项巨大的投资,并且比 Docker Compose 更需要重写您的部署序列。