如何在原始网络上为 docker 容器提供自己的可路由 IP?

Tre*_*rKS 7 ssh containers docker kubernetes docker-compose

主要问题

想象一下这个场景。

  • 192.168.0.0/24的网络。
  • 主机名为“Docker-Host”的计算机正在 192.168.0.2 运行 docker 引擎
  • 'Docker-Host' 运行 sshd 服务器
  • 在 'Docker-Host' 上,我在使用 ssh:22 和 https:443 (GitLab) 的容器中运行应用程序

我如何为这个容器分配 192.168.0.3 的 IP?

我需要服务在他们设计的默认端口上运行。


附加信息

我不能使用反向代理作为解决方案,因为这并不能解决如何通过 SSH 与 GitLab 实例通信的问题。

在这种情况下,将端口 22 映射到主机上的不同端口是不专业的,我的客户端开发人员不会喜欢这种设置。

如果我正在启动此应用程序的许多实例,这也将很难维护。并且必须为每个容器将每个 SSH 映射到主机上的新端口。

我的客户需要能够在没有额外配置客户端的情况下解析和运行以下内容。

https://GitLab.internal.net.work

ssh git 克隆https://GitLab.internal.net.work

我已经查看了 Docker 网络文档,除非我弄错了,否则我看不到一个易于维护的解决方案(尽管我还是 Docker 的新手)。

如何才能做到这一点?在这种情况下,其他人在做什么作为“最佳实践”?(如果可能,请以 docker-compose 语法的形式给出答案)。

BMi*_*tch 5

这往往是容器领域的反模式。一种常见的解决方案不是直接从外部访问容器,而是为您需要公开的每个 IP 设置一个负载均衡器,并且该负载均衡器将众所周知的端口映射到唯一端口。在云空间中,这通常比分配具有不同 IP 的多个虚拟机更便宜。


您可以使用 docker 直接发布到单个 IP 地址。例如:

docker run -p 192.168.0.3:22:22 sshd
Run Code Online (Sandbox Code Playgroud)

这要求主机配置每个 IP 地址,这已在其他 SE Q&A中进行了描述。


如果仍然需要原始请求,直接暴露容器,可以使用 macvlan 或 ipvlan 网络驱动程序为容器提供外部可访问的 IP。我倾向于避免这种情况,因为这通常是尝试像管理虚拟机一样管理容器的症状。有关 macvlan 的文档位于:https://docs.docker.com/network/macvlan/


wti*_*wti 1

对于容器上需要 IP 的情况,最接近的是桥接网络,桥接有一些子类型。IBM在这里提供了其中之一的示例。这比我能解释的要好。现在他们所做的是:

  1. 在主机上创建一个桥接Linux。

    brctl addbr br0 brctl addif br0 enp0s1 brctl setfd br0 0 ifconfig br0 192.168.0.0/24 netmask 255.255.255.0

*省略了坚持它的步骤。

  1. 然后检查网桥是否UP

    root@docker:~# brctl show br0 bridge name bridge id STP enabled interfaces br0 8000.42570a00bd6d no enp0s1 root@docker:~#

  2. 创建桥接网络:

    docker network create --driver=bridge --ip-range=192.168.0.0/24 --subnet=192.168.0.0/24 -o "com.docker.network.bridge.name=br0" br0

** 此处您可以使用--aux-address从范围中排除 ip。您还应该将其限制--subnet为较小的子集,但这完全取决于您的需要。

*** 您可能希望将此设置为默认值。链接中也对此进行了解释。

  1. 启动你的容器:

    docker run -it my/contianer

    • --ip可以在此处使用诸如 和其他选项。Docker 帮助docker run --help |grep IP在这里可能会有所帮助。
  2. 容器运行后,您可以用来docker inspect <container_name>了解是否有 IP,然后需要测试与该容器的连接等。

我希望它能有所帮助,如果您有疑问或者这不是您想要/需要提供的一些背景信息,请进一步询问。