bridge 模式
bridge 模式可使用 --net=bridge
指定,是 Docker 的默认设置,正常运行起来的容器都是桥接到 docker0 设备,所以它们可以直接通信。
# 运行两个容器
$ docker run -d --name c1 centos:8 init
$ docker run -d --name c2 centos:8 init
# 查看 c1 的 IP
$ docker exec c1 ip a | grep 'global eth0'
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
# 查看 c2 的 IP
$ docker exec c2 ip a | grep 'global eth0'
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
# 进入 c1 ping c2
$ docker exec c1 ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.099 ms
^C
host 模式
host 模式可使用 --net=host
指定,该模式下的容器会与宿主机共享 NET 命名空间。
# 查看宿主机的网络信息
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:79:83:49 brd ff:ff:ff:ff:ff:ff
inet 10.0.1.121/24 brd 10.0.1.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::ef05:22c9:4f03:8f80/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::65c0:6c62:3742:c036/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:02:45:e8:5e brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:2ff:fe45:e85e/64 scope link
valid_lft forever preferred_lft forever
# 以 host 模式运行一个容器查看网络信息
$ docker run --rm --name c3 --net=host centos:8 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:79:83:49 brd ff:ff:ff:ff:ff:ff
inet 10.0.1.121/24 brd 10.0.1.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::ef05:22c9:4f03:8f80/64 scope link dadfailed tentative noprefixroute
valid_lft forever preferred_lft forever
inet6 fe80::65c0:6c62:3742:c036/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:02:45:e8:5e brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:2ff:fe45:e85e/64 scope link
valid_lft forever preferred_lft forever
none 模式
none 模式可使用 --net=none
指定,该模式下的容器的网络会与宿主机及其它容器完全隔离,只有一个回环接口。
$ docker run --rm --name c4 --net=none centos:8 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
container 模式
container 模式可使用 --net=container:<容器名或 ID>
指定,该模式下的容器会与指定容器共享同一个 NET 命名空间。
# 先运行一个目标容器 c5
$ docker run -d --name c5 centos:8 init
# 指定 container 模式运行一个 c6 来共享 c5 的命名空间
$ docker run -d --name c6 --net=container:c5 centos:8 init
# 查看 c5 的网络信息
$ docker exec c5 ip a | grep 'global eth0'
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
# 查看 c6 的网络信息
$ docker exec c6 ip a | grep 'global eth0'
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
自定义网络
自定义网络可通过 docker network create <网络名>
来创建,其网络原理和默认存在的 bridge 模式相同。与默认的 bridge 模式不同的是:
- 自定义网络支持通过容器名进行访问,而默认的 bridge 模式仅能通过 IP 进行访问。
# 创建一个名为 testnet 的网络
$ docker network create testnet
# 指定 testnet 网络来创建两个容器
$ docker run -d --name c7 --net testnet centos:8 init
$ docker run -d --name c8 --net testnet centos:8 init
# 进入 c7 通过容器名访问 c8
$ docker exec c7 ping c8
PING c8 (172.18.0.3) 56(84) bytes of data.
64 bytes from c8.testnet (172.18.0.3): icmp_seq=1 ttl=64 time=0.042 ms
^C
评论区