Docker网络

Docker提供了多种网络模式,包括none(无网络)、host(共享宿主机网络栈)、bridge(默认桥接网络),以及用户自定义网络。none网络适用于安全要求高的无网络应用,host网络则提高网络性能但牺牲隔离性,bridge网络允许容器间和宿主机通信。用户还可以创建自定义网络,如bridge、overlay和macvlan,以满足特定的跨主机通信需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

网络介绍

none网络

Host网络

bridge网络

自定义容器网络


网络介绍

ocker网络是在Docker容器间提供通信的机制,能够让多个容器之间相互通信,同时还可以让容器和宿主机或者外网进行通信

docker的网络分为三种:none网络、host网络、bridge网络

none网络:这种网络模式下,容器没有网络连接,只能通过IPC和UTS命名空间和宿主机进行通信,通常只在特殊场景下使用

host网络:在这种网络模式下,容器将直接使用宿主机器的网络栈,而不会分配单独的IP地址。这样可以获得更好的网络性能,但是也会失去隔离性,不利于多个容器同时运行的场景

bridge网络:这种网络模式下,Docker会为每个容器分配一个IP地址,并且在宿主机器上创建一个名为docker0的虚拟网桥,这样就可以使不同容器之间互相通信,同时也可以和宿主机器以及外部网络进行通信

我们在安装Docker是会自动在host上创建三个网络,可以用docker network ls命令查看

[root@master01 ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
40ce3374d8ee   bridge    bridge    local
354ef8fbfc42   host      host      local
a69fbb65ef8b   none      null      local

none网络

none网络就是什么都没有的网络,在这个网卡容器下除了lo,没有其他任何网卡

[root@localhost ~]# docker run -it --network none busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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

这个网络可以对一些安全行要求高并且不需要联网的应用可以使用none网络,比如某个容器的唯一用途是生成随机密码,既可以放到none网络中避免密码被窃取

Host网络

这个网络是连接到宿主机共享的docker host的网络栈,容器的网络配置与host完全一样

[root@localhost ~]# docker run -it --network host busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:0c:29:c6:6e:e4 brd ff:ff:ff:ff:ff:ff
    inet 192.168.8.6/24 brd 192.168.8.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fec6:6ee4/64 scope link 
       valid_lft forever preferred_lft forever
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue 
    link/ether 02:42:f0:11:c1:32 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:f0ff:fe11:c132/64 scope link 
       valid_lft forever preferred_lft forever
8: vethe93e3b9@if7: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue master docker0 
    link/ether 42:d5:fa:e6:c8:ae brd ff:ff:ff:ff:ff:ff
    inet6 fe80::40d5:faff:fee6:c8ae/64 scope link 
       valid_lft forever preferred_lft forever

我们在容器中可以看到宿主机的所有网卡,并且hostname也是host的

这个网络是我们在使用容器时对网络传输效率有较高要求时,可以选择host网络,但是这个网络牺牲了一些灵活性,比如端口冲突问题,宿主机上已经使用的端口在容器里就不能使用了

bridge网络

在安装Docker时会创建一个命名为docker0的linux bridge,我们在创建容器不指定--network时,创建的容器默认都会挂到docker0上

先查看docker0上有没有其他网络设备

[root@localhost ~]# brctl show
bridge name bridge id       STP enabled interfaces
docker0     8000.0242f011c132   no      

在启动一个网络为bridge的容器,在进行查看

[root@localhost ~]# brctl show
bridge name bridge id       STP enabled interfaces
docker0     8000.0242f011c132   no      veth6fe3007              

可以看到有一个新的网络接口veth6fe3007被挂在到docker0上,veth6fe3007就是新创建容器的虚拟网卡

然后我们在进到一个容器里查看这个网卡信息

[root@master01 ~]# docker run -it busybox /bin/sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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
6: eth0@if13: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

可以看到容器里的网卡是eth0@if13,实际上eth0@if13和veth6fe3007是一对veth pair,这是一种成对出现的特殊网络设备,可以把他们想象成有一根虚拟网线连接起来的一对网卡

自定义容器网络

除了none,host,bridge这三个自动创建的网络,用户也可以根据业务需要创建user-defined网络

docker提供了三种user-defined网络驱动:bridge,overlay和macvlan,overlay和macvlan用于创建跨主机的网络

自己创建一个网络类型为bridge的网络

[root@localhost ~]# docker network create --driver bridge br1
66873f4c38cbb2d7b23ec4839710db2b2ce55d93461da9eda7184b18d5f48625
[root@localhost ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
66873f4c38cb   br1       bridge    local
bd66c496caee   bridge    bridge    local
9ba89ae763b5   host      host      local
ba22860f1dce   none      null      local

也可以创建一个自定义网段的网络

[root@localhost ~]# docker network create --driver bridge --subnet 10.0.0.0/24 --gateway 10.0.0.1 net1
84e9b51720e7dabf362d1636b9193ab4f2faa28588ba70651d3b36121d41f540

这里在创建一个别的网段的网络

[root@localhost ~]# docker network create --driver bridge --subnet 192.168.1.0/24 --gateway 192.168.1.1 net2
f8c9ea2461aaed1a13f9935637e9411f31cd6d8726b073c122c7b2e84dc5a483

启动两个容器分别用到这两个新创建的网络

[root@localhost ~]# docker run -it --name test1 --network net1 busybox
[root@localhost ~]# docker run -it --name test2 --network net2 busybox

然后要实现这两个容器可以互通

给第一台容器连接net2的网卡

[root@localhost ~]# docker network connect net2 test1

在进到容器里查看一下ip地址

/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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
16: eth0@if17: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:0a:00:00:02 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.2/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
20: eth1@if21: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:c0:a8:01:0a brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.3/24 brd 192.168.1.255 scope global eth1
       valid_lft forever preferred_lft forever

可以看到第一个容器有net2网卡的地址了

在给第二个容器连接net1的网卡

[root@localhost ~]# docker network connect net1 test2

进到容器里面查看IP地址

/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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
18: eth0@if19: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:c0:a8:01:02 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.2/24 brd 192.168.1.255 scope global eth0
       valid_lft forever preferred_lft forever
22: eth1@if23: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:0a:00:00:03 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.3/24 brd 10.0.0.255 scope global eth1
       valid_lft forever preferred_lft forever

也可以看到第二个容器里有net1网卡地址了

然后这两台就可以互通了

/ #  ping 192.168.1.2
PING 192.168.1.2 (192.168.1.2): 56 data bytes
64 bytes from 192.168.1.2: seq=0 ttl=64 time=0.103 ms
64 bytes from 192.168.1.2: seq=1 ttl=64 time=0.111 ms
64 bytes from 192.168.1.2: seq=2 ttl=64 time=0.114 ms
/ # ping 10.0.0.2
PING 10.0.0.2 (10.0.0.2): 56 data bytes
64 bytes from 10.0.0.2: seq=0 ttl=64 time=0.102 ms
64 bytes from 10.0.0.2: seq=1 ttl=64 time=0.112 ms
64 bytes from 10.0.0.2: seq=2 ttl=64 time=0.116 ms

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值