Docker 命名空间、virtualbox 上的 docker、镜像环境

标签 docker namespaces continuous-integration virtual-machine docker-run

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

一切正常,直到我只想在一台机器上只有一个这样的环境。

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

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

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

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

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

  • 谢谢您的帮助。

    最佳答案

    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并有这种效果。 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/

    相关文章:

    Docker:通过 CLI 使用 --password 是不安全的。使用 --password-stdin

    php - 调用在另一个命名空间中定义的不带前缀的 PHP 函数

    c# - LinQ to XML 访问元素及其值

    azure - 从 Visual Studio Online 将 ASP.NET 5 构建到 Azure 网站 ERROR_FILE_IN_USE

    git - 具有本地 Git 的 Azure DevOps 板

    docker - 如何仅在另一个事件镜像完成任务后才运行docker镜像?

    jenkins - Docker:Jenkins 容器无法在 QNAP 设备上访问互联网

    java - 在 Dockerfile 中覆盖继承的 CMD 并不总是有效?

    c++ - 如何在模板类的 'namespace' 中创建非模板类型定义?

    gradle - Gradle Groovy插件是否支持连续构建?