代码之家  ›  专栏  ›  技术社区  ›  Jimmix

Docker命名空间,Docker on virtualbox,镜像环境

  •  0
  • Jimmix  · 技术社区  · 5 年前

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

    在我只想在一台机器上有一个这样的环境之前,一切都工作得很好。

    但是如果我想在同一台机器上有一个与我刚创建的机器相似的环境,但是为了不同的目的(测试),我有一个名称冲突的问题,因为我不能用相同的名称装箱和启动容器和网络。

    到目前为止,我尝试用和第一个相同的方法来启动第二个环境,但要预先固定所有容器和网络名称。
    这是有效的,但有一个缺陷:在运行对URI的所有请求的应用程序中,由于存在一个结构,所有请求都被破坏了。

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

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

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

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

    谢谢你的帮助。

    1 回复  |  直到 5 年前
        1
  •  0
  •   David Maze    5 年前

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

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

    使用虚拟机[…]可以解决我的问题吗?…这不是一种过度杀戮吗?会不会增加额外的麻烦?

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

    也许有一种 --hostname 对于 docker run 允许使用此名称从其他容器访问容器的命令?

    docker run --network-alias 非常简单地提到 in the docker run documentation 并且有这种效果。 docker network connect --alias is slightly more documented 并影响已创建的容器。

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

    码头工人组成 主要地 如果您想离开现有的shell脚本解决方案,可以为您管理这个:它在创建的所有网络和卷上放置一个名称前缀,并为每个容器在yaml文件中匹配其名称创建网络别名。如果主机卷装载与当前目录相关,那么该内容也相当独立。有一件事是您不能轻易地在单独的主机端口上启动堆栈的每个副本,因此您必须解决这些冲突。

    Kubernetes有一个名称空间的概念,它实际上正是您所要求的,但是采用它是一项巨大的投资,它将涉及到重写部署序列,甚至比Docker撰写还要多。