使用自己的 IP 地址公开每个 docker 实例

使用自己的 IP 地址公开每个 docker 实例

我的网络上有一个服务器,我想用它假装是许多不同的服务器。

物理电脑正在运行 Ubuntu 服务器,当连接到网络时,dhcp 服务器会为该服务器提供 ip 号码 192.168.1.10。

然后,在其中启动许多不同的 docker 镜像就相当容易了,为了避免端口冲突,我可以为服务提供非标准端口号。然而,这对网络上的其他用户来说并不十分友好。

使用自己的 IP 号码来公开每个 Docker 镜像将更加方便用户。

因此,让我们尝试描述一个典型的用例,其中该服务器将同时托管 gitlab 和 jenkins master。

高级服务器描述

当虚拟服务器使用“桥接适配器”时,可以使用 VirtualBox 进行此设置,但是我正在努力使用 docker 进行相同的操作。(请注意,我不想为此使用 VirtualBox,因为与 docker 相比,它消耗了太多资源)。

从我对 docker 的基本理解来看,似乎我需要创建几个虚拟 docker 网络,但是我不知道这些应该是“bridge”、“macvlan”还是类似的来创建这些网络。


我尝试过在主机 ubuntu 服务器上创建 2 个桥接网络

首先我们有默认网络

enp0s31f6 Link encap:Ethernet  HWaddr 54:bf:64:96:51:57  
          inet addr:192.168.1.10  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fdac:b176:f48b:0:c9bf:3d46:a9f6:8a08/64 Scope:Global
          inet6 addr: fe80::6f2:9b6e:b8a4:225/64 Scope:Link
          inet6 addr: fdac:b176:f48b:0:de76:744c:f42a:75e1/64 Scope:Global
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1356 errors:0 dropped:0 overruns:0 frame:0
          TX packets:842 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:152299 (152.2 KB)  TX bytes:63753 (63.7 KB)
          Interrupt:16 Memory:ef500000-ef520000 

然后我找到docker创建的那个:

docker0   Link encap:Ethernet  HWaddr 02:42:b1:ff:6e:89  
          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0
          inet6 addr: fe80::42:b1ff:feff:6e89/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:4372 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4665 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:175876 (175.8 KB)  TX bytes:333163 (333.1 KB)

然后我为 .11 创建了 bridge11,为 .12 创建了 bridge12

bridge11  Link encap:Ethernet  HWaddr 4a:2b:6b:07:51:70  
          inet addr:192.168.1.11  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

bridge12  Link encap:Ethernet  HWaddr 82:ec:66:9c:f2:b5  
          inet addr:192.168.1.12  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:828 (828.0 B)

但是当我尝试使用 .12 网络启动 vanilla gitlab docker 镜像时

docker run \
    --name gitlab \
    --hostname gitlab \
    --publish 192.168.1.12:443:443 \
    --publish 192.168.1.12:80:80 \
    --publish 192.168.1.12:22:22 \
    --volume /var/gitlab/config:/etc/gitlab:Z \
    --volume /var/gitlab/logs:/var/log/gitlab:Z \
    --volume /var/gitlab/data:/var/opt/gitlab:Z \
    gitlab/gitlab-ce:latest

然后他抱怨端口 22 已被使用,如下所示:

docker: Error response from daemon: 
  driver failed programming external connectivity on endpoint gitlab 
  (4fda91298a6b9d416cb7e91813d95ad0d35315260881377d1238887724cf3d1f): 
  Error starting userland proxy: listen tcp 192.168.1.12:22: 
  bind: address already in use.
ERRO[0000] error waiting for container: context canceled 

请注意,端口 22 在 192.168.1.10 上使用,而不是在 192.168.1.12 上使用,如果我使用另一个未使用的端口,那实际上是可行的。

然而我的想法是能够在不同的 docker 镜像上重用标准 ssh 端口之类的东西。

相关内容