docker容器网络
Docker在安装后自动提供3种网络,使用docker network ls命令查看
[root@suna ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
016887b34684 bridge bridge local
7548a06f8474 host host local
75bffc9dab2d none null local
Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
1. docker四种网络模式
网络模式 | 配置 | 说明 |
---|---|---|
bridge | –network bridge | 默认模式 |
host | –network host | 容器和宿主机共享Network namespace |
container | –network container:NAME_OR_ID | 容器和另外一个容器共享Network namespace |
none | –network none | 容器有独立的Network namespace, 但并没有对其进行任何网络设置, 如分配veth pair 和网桥连接,配置IP等 |
1.1 bridge模式
Docker的默认网络模式,创建出来的Docker容器连接到Docker网桥上。
作为最常规的模式,bridge模式已经可以满足Docker容器最基本的使用需求了。然而其与外界通信使用NAT,增加了通信的复杂性,在复杂场景下使用会有诸多限制。
[root@suna ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242c809ae49 no veth5527c82
veth5c21Oe9
[root@suna]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:17ff:fe9c:cb6b prefixlen 64 scopeid 0x20<link>
ether 02:42:17:9c:cb:6b txqueuelen 0(Ethernet)
RX packets O bytes 0 (0.0 B)
RX errors 0 dropped 0overruns O frame 0
TX packets 5 bytes 446 (446.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collision 0
1.2 Host模式
相当于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址,但是文件系统、进程等还是和宿主机隔离的。
很好地解决了容器与外界通信的地址转换问题,可以直接使用宿主机的IP进行通信,不存在虚拟化网络带来的额外性能负担。也降低了容器与容器之间、容器与宿主机之间网络层面的隔离性,引起网络资源的竞争与冲突。
适用于对于容器集群规模不大的场景。
[root@suna]# docker container run -it --name=test_bus --network=host busybox //新建容器
[root@suna]# ip a
1: lo: <LO0PBACK,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:f7:55:53 brd ff:ff:ff:ff:ff:ff
inet 192.168.32.150/24 brd_192.168.3.255scope global dynamic ens33
valid_lft 79893sec preferred_lft 79893sec
inet6 fe80: : 300d:17d3:dd1a:5895764 scope link
valid_lft forever preferred_lft forever
3: docker0:<BROADCAST,MULTICAST,UP,LOWER_UP>mtu 1500 qdisc noqueue
link/ether 02:42:17:9c:cb:6b brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global dockerO
valid_lft forever preferred_lft forever
inet6 fe80: :42:17ff:fe9c:cb6b/64 scope link
valid_lft forever preferred_lft forever
1.3 container模式
新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享
新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等
同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。
1.4 none模式
网络环境为 none,即不为 Docker Container 任何的网络环境。一旦 Docker Container 采用了none 网络模式,那么容器内部就只能使用 loopback 网络设备,不会再有其他的网络资源。可以说 none 模式为 Docker Container 做了极少的网络设定,在没有网络配置的情况下,作为 Docker 开发者,才能在这基础做其他无限多可能的网络定制开发。
[root@suna]# 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:O
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:10oo
RX bytes:0 (0.0B TX bytes:0 (0.0 B)