我的网络上有一个服务器,我想用它假装是许多不同的服务器。
物理电脑正在运行 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 端口之类的东西。