我在桥接网络N1上启动一个容器,比如说C1,
docker network create --driver bridge N1
docker run --net=N1 --name C1 -d some image
然后我在N2上启动另一个容器C2:
docker network create --driver bridge N2
docker run --net=N1 --name C1 -d some image
我想启动第三个容器(可以从端口9090访问的反向代理)C3,以便它可以看到C1:
docker run --net=N1 -p 9090:9090 --name C3
然后我从C3里面访问C1,它的名字是C1。所以例如从C3我可以做到
curl http://C1
然后我可以在C3内部运行反向代理,并将来自端口9090的请求转发到C1上的其他端口。
但如果我想将N2添加到C3:
docker run --net=N1 --net=N2 -p 9090:9090 --name C3
然后从C3内部,如果我查看C1或C2,我得到一个未找到的主机:
curl http://C1
host not found
在这种情况下C1和C2的名称是什么?
答案 0 :(得分:1)
要将容器连接到第二个网络,您需要使用docker network connect <network> <container>
。 docker run
命令仅支持单个网络。
您可以在容器启动之前或之后执行此操作。某些进程在启动之前需要额外的接口。
docker create --name C3 --net=N1 <image>
docker network connect N2 C3
docker start C3
容器现在有多个接口
$ docker exec C3 ip ad sh
...
360: eth0@if361: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:14:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.20.0.3/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe14:3/64 scope link
valid_lft forever preferred_lft forever
362: eth1@if363: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:15:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.21.0.3/16 scope global eth1
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe15:3/64 scope link
valid_lft forever preferred_lft forever
容器可以解析并连接到两个网络上的容器
$ docker exec C3 ping -c 1 C1
PING ping2 (172.20.0.5): 56 data bytes
64 bytes from 172.20.0.5: icmp_seq=0 ttl=64 time=0.221 ms
--- ping2 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.221/0.221/0.221/0.000 ms
$ docker exec C3 ping -c 1 C2
PING ping1 (172.21.0.5): 56 data bytes
64 bytes from 172.21.0.5: icmp_seq=0 ttl=64 time=0.177 ms
--- ping1 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.177/0.177/0.177/0.000 ms
一旦开始进入多个网络,使用Docker Compose v2定义来设置和运行环境可能会更容易。