主要问题

主要问题

主要问题

想象一下这个场景。

  • 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 语法的形式给出答案)。

答案1

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


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

docker run -p 192.168.0.3:22:22 sshd

这要求主机配置每个 IP 地址,具体配置请参见其他 SE 问答


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

答案2

对于需要容器 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. 然后检查桥是否已启动

    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。您还应该将 IP 限制--subnet为较小的子集,但这一切都取决于您的需要。

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

  1. 启动你的容器:

    docker run -it my/contianer

    • --ip此处可以使用 等选项。Docker 帮助docker run --help |grep IP可能对此有所帮助。
  2. 一旦容器运行,您就可以使用docker inspect <container_name>它来了解您是否有 IP,然后需要测试与该容器的连接性等。

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

答案3

我所有的生产 Docker 容器都运行这样的设置。

我设置了一个网桥,其中有我的物理网卡(@wti 回答中的步骤 1 和 2)

我安装了 opensvc 代理(https://repo.opensvc.com)、创建服务(svcmgr -s mygitlab create

svcmgr -s mygitlab edit config我使用如下配置片段填写服务配置( )

[DEFAULT]
id = 0ce6aa9c-715f-113f-9c32-0fb32df00d49
orchestrate = start

[ip#0]
container_rid = container#0
gateway = 192.168.1.1
ipdev = br0
ipname = 192.168.1.3
netmask = 255.255.255.0
type = netns

[container#0]
type = docker
run_image = gitlab:latest
run_args = -i -t --net=none
        --hostname=gitlab.acme.com
    -v /etc/localtime:/etc/localtime:ro

完成后,只需启动服务(svcmgr -s mygitlab start)并检查状态(svcmgr -s mygitlab print status

在需要时,我还会部署高可用性设置,以便在第一个节点停机的情况下将 docker 服务故障转移到另一个节点。

相关内容