docker网络模式

一、docker的四种网络模式

在这里插入图片描述1.docker的四种网络模式如下:

  • Bridge container桥接网络模式
  • Host(open) container开放式网络模式
  • Container(join)container联合挂载式网络模式,是host网络模式的延伸
  • None(close) container封闭式网络模式
    2.可以通过docker network命令来查看。
xqkang@xqkang:~$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
75e6b4c4d091        bridge              bridge              local
20956d90618b        host                host                local
ebd75144c2ac        none                null                local

3.docker run --network命令可以指定使用网络模式

二、bridge网络模式

2.1介绍:

当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上,所以有默认地址172.17.0.0/16的地址。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。

qkang@xqkang:~$ brctl show
bridge name	bridge id		STP enabled	interfaces
docker0		8000.024264e53d7b	no		veth738f8c9
							vethfa1c8d1
virbr0		8000.525400206bf8	yes		virbr0-nic

bridge模式是docker的默认网络模式,不写–net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。

xqkang@xqkang:~$ sudo iptables -t nat -vnL
[sudo] xqkang 的密码: 
Chain PREROUTING (policy ACCEPT 84579 packets, 6260K bytes)
 pkts bytes target     prot opt in     out     source               destination         
   24  2166 DOCKER     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT 33109 packets, 3014K bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 7429 packets, 535K bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DOCKER     all  --  *      *       0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT 7427 packets, 535K bytes)
 pkts bytes target     prot opt in     out     source               destination         
    4   220 MASQUERADE  all  --  *      !docker0  172.17.0.0/16        0.0.0.0/0           
   41  3836 RETURN     all  --  *      *       192.168.122.0/24     224.0.0.0/24        
    0     0 RETURN     all  --  *      *       192.168.122.0/24     255.255.255.255     
    0     0 MASQUERADE  tcp  --  *      *       192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
    0     0 MASQUERADE  udp  --  *      *       192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
    0     0 MASQUERADE  all  --  *      *       192.168.122.0/24    !192.168.122.0/24    
    0     0 MASQUERADE  tcp  --  *      *       172.17.0.5           172.17.0.5           tcp dpt:443
    0     0 MASQUERADE  tcp  --  *      *       172.17.0.5           172.17.0.5           tcp dpt:80
    0     0 MASQUERADE  tcp  --  *      *       172.17.0.5           172.17.0.5           tcp dpt:22

Chain DOCKER (2 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 RETURN     all  --  docker0 *       0.0.0.0/0            0.0.0.0/0           
    0     0 DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443 to:172.17.0.5:443
    0     0 DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 to:172.17.0.5:80
    0     0 DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22 to:172.17.0.5:22

2.2 bridge模式示意图
在这里插入图片描述2.3演示
bridge网络模式;–network不指定,默认也是bridge模式

xqkang@xqkang:~$ docker run --name b1 -it --network bridge --rm busybox:latest 
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
322973677ef5: Pull complete 
Digest: sha256:1828edd60c5efd34b2bf5dd3282ec0cc04d47b2ff9caa0b6d4f07a21d1c08084
Status: Downloaded newer image for busybox:latest
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:04  
          inet addr:172.17.0.4  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:20 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:2520 (2.4 KiB)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  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)

/ # route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.17.0.1      0.0.0.0         UG    0      0        0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth0
/ # ping 192.168.10.46
PING 192.168.10.46 (192.168.10.46): 56 data bytes
64 bytes from 192.168.10.46: seq=0 ttl=64 time=0.217 ms
64 bytes from 192.168.10.46: seq=1 ttl=64 time=0.111 ms
^C
--- 192.168.10.46 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.111/0.164/0.217 ms

三、host网络模式

3.1介绍:
如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

3.2Host模式示意图
在这里插入图片描述3.3演示

 xqkang@xqkang:~$ docker run --name b2 -it --network host --rm busybox:latest
/ # ifconfig
docker0   Link encap:Ethernet  HWaddr 02:42:13:08:20:09  
          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0
          inet6 addr: fe80::42:13ff:fe08:2009/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:4 errors:0 dropped:0 overruns:0 frame:0
          TX packets:71 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:224 (224.0 B)  TX bytes:7821 (7.6 KiB)

enp2s0    Link encap:Ethernet  HWaddr 4C:ED:FB:3F:13:04  
          inet addr:192.168.10.46  Bcast:192.168.10.255  Mask:255.255.255.0
          inet6 addr: fe80::c2a5:497d:880f:329/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:50427 errors:0 dropped:0 overruns:0 frame:0
          TX packets:29474 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:53845467 (51.3 MiB)  TX bytes:2857759 (2.7 MiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:953 errors:0 dropped:0 overruns:0 frame:0
          TX packets:953 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:103767 (101.3 KiB)  TX bytes:103767 (101.3 KiB)

veth199ff09 Link encap:Ethernet  HWaddr 56:60:D9:DC:B6:0C  
          inet6 addr: fe80::5460:d9ff:fedc:b60c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:102 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:11388 (11.1 KiB)

vethcfc665b Link encap:Ethernet  HWaddr 7E:C3:D1:3C:0A:45  
          inet6 addr: fe80::7cc3:d1ff:fe3c:a45/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:101 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:11330 (11.0 KiB)

virbr0    Link encap:Ethernet  HWaddr 52:54:00:20:6B:F8  
          inet addr:192.168.122.1  Bcast:192.168.122.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)

四、Container 网络模式

4.1 介绍  
这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。

4.2 Container模式示意图

在这里插入图片描述4.3 演示

(1)在一个终端,使用bridge网络模式启动容器b1

xqkang@xqkang:~$  docker run --name b1 -it --rm busybox:latest 
/ # ifconfig (b1此处IP为172.17.04)
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:04  
          inet addr:172.17.0.4  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:19 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:2450 (2.3 KiB)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  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)

/ # echo "hello world b1" > /tmp/index.html
/ #  httpd -h /tmp/  (在b1上启动httpd服务)
/ # netstat -nutl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       
tcp        0      0 :::80                   :::*                    LISTEN      
/ # 

(2)在另一个终端使用Container 网络模式创建容器b2

xqkang@xqkang:~$ docker run --name b2 -it --network container:b1 --rm busybox:latest
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:04  
          inet addr:172.17.0.4  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:27 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:3158 (3.0 KiB)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  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)

/ # wget -O - -q 127.0.0.1 ( b1启动的httpd服务,在b2上直接访问)
hello world b1
/ # ls /tmp/ (但是文件系统并不共享,只共享网络)
/ # 

五、None 网络模式

5.1 介绍  
使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息,只有lo 网络接口。需要我们自己为Docker容器添加网卡、配置IP等。  不参与网络通信,运行于此类容器中的进程仅能访问本地回环接口;仅适用于进程无须网络通信的场景中,例如:备份、进程诊断及各种离线任务等。

5.2 Node模式示意图
在这里插入图片描述5.3演示

xqkang@xqkang:~$ docker run --name b1 -it --network none --rm busybox:latest 
/ # ifconfig
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  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)

/ # route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
/ # 

### Docker 网络模式详解及配置方法 #### 1. **Bridge 模式** 这是 Docker 默认的网络模式。当启动一个容器时,如果没有显式指定 `--network` 参数,则会自动使用 Bridge 模式[^2]。在这种模式下,Docker 守护进程会在主机上创建一个名为 `docker0` 的虚拟网桥,并为每个容器分配独立的 IP 地址和子网掩码。 - 配置方式: ```bash docker run --network=bridge <image_name> ``` 这种模式适合大多数场景下的应用部署需求,因为它提供了良好的隔离性和灵活性。 --- #### 2. **Host 模式** 在 Host 模式下,容器不会被分配单独的网络命名空间,而是共享宿主机的操作系统网络栈。这意味着容器内的服务可以直接绑定到宿主机的真实接口地址,而无需 NAT 或端口映射操作。 - 配置方式: ```bash docker run --network=host <image_name> ``` 需要注意的是,在此模式下运行的应用可能会与其他正在监听相同端口号的服务发生冲突。 --- #### 3. **None 模式** 如果希望完全屏蔽掉某个特定容器对外部世界的访问能力,可以选用 None 模式。此时除了 loopback 接口外不会再有其他任何形式的联网支持存在[^4]。 - 配置方式: ```bash docker run --network=none <image_name> ``` 用户需手动完成所有的必要设置比如添加额外物理适配器或者调整路由表项等工作才能让此类实例重新获得连通性。 --- #### 4. 自定义 Overlay/Custom Networks (User-defined networks) 为了实现更复杂的跨节点集群环境中的多台机器之间相互协作的需求, 可以考虑构建自定义overlay类型的逻辑拓扑结构来满足实际业务情况的要求[^3]. 这种高级别的抽象层允许不同主机上的多个容器彼此透明地交换数据包而不必关心底层具体的传输细节. - 创建一个新的覆盖型网络: ```bash docker network create -d overlay my_overlay_network ``` 之后就可以像平常一样把新产生的资源关联至目标镜像文件之上啦! --- ### 总结 每种 docker 网络模型都有其独特之处以及适用范围。对于简单的单机测试用途来说 bridge 已经足够强大;而对于追求极致性能表现又不想牺牲太多安全性的朋友而言 host 则是个不错的选择;最后当我们面临分布式计算框架搭建难题的时候不妨试试看 user defined ones 吧!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值