侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 748 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

Docker 的几种网络模式

zze
zze
2021-03-10 / 0 评论 / 0 点赞 / 316 阅读 / 4930 字

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
0

评论区