Docker入門與應用系列(四)網絡管理
一、Docker的五種網絡模式
在使用docker run創建docker容器時,可以用--net選項指定容器的網絡模式,Docker有以下5種網絡模式:
1. bridge模式
使用docker run --net=bridge指定,bridge模式是Docker默認的網絡設置,此模式會為每一個容器分配Network Namespace、設置IP等,並將一個主機上的Docker容器連接到一個虛擬網橋上。 此模式與外界通信使用NAT協議,增加了通訊的復雜性,在復雜場景下使用會有諸多限制。
2. host模式
使用docker run --net=host指定,這種模式Docker Server將不為Docker容器創建網絡協議棧,即不會創建獨立的network namespace,Docker容器中的進程處於宿主機的網絡環境中,相當於Docker容器的宿主機共用同一個network namespace,使用宿主機的網卡、IP、端口等信息。此模式沒有網絡隔離性,同時會引起網絡資源的競爭與沖突。
docker run -it --rm --name=centos-test --net=host centos:7 /bin/bash # --rm :當進入到容器後,退出時將刪除該容器 yum -y install net-tools [root@localhost ~]# ifconfig docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255 ether 02:42:f9:fe:32:41 txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.16.200.208 netmask 255.255.255.0 broadcast 172.16.200.255 inet6 fe80::20c:29ff:fefc:9a4b prefixlen 64 scopeid 0x20<link> ether 00:0c:29:fc:9a:4b txqueuelen 1000 (Ethernet) RX packets 47243 bytes 18062368 (17.2 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 17177 bytes 2678186 (2.5 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 0 (Local Loopback) RX packets 112 bytes 6172 (6.0 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 112 bytes 6172 (6.0 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
使用host模式container 和宿主機的IP一樣
3.container模式使用docker run --net=container:othercontainer_name指定,這種模式與host模式相似,指定新創建的容器和已經存在的某個容器共享同一個network namespace, 以下兩種模式都共享network namespace,區別就在於host模與宿主機共享,而container模式與某個存在的容器共享。 在container模式下,兩個容器的進程可以通過lo回環網絡設備通訊,增加了容器間通訊的便利性和效率。container模式的應用場景就在於可以將一個應用的多個組件放在不同的容器趾,這些 容器配成container模式的網絡,這樣它們可以作為一個整體對外提供服務。同時,這種模式也降低了容器間的隔離性。
# 1. 啟動一個現有容器 [bigberg@localhost ~]$ docker-enter my-test Last login: Mon Feb 26 03:42:28 UTC 2018 [root@0cd0fd089ea0 ~]# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255 ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet) RX packets 16 bytes 1296 (1.2 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 loop txqueuelen 0 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 # 新建一個容器 [bigberg@localhost ~]$ docker run -it --net=container:my-test --name=my-test2 centos:7 /bin/bash [root@0cd0fd089ea0 /]# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255 ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet) RX packets 9021 bytes 13565843 (12.9 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 7500 bytes 503022 (491.2 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 loop txqueuelen 0 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
可以看到兩個容器eth0的IP地址一樣
4.none模式
使用docker run --net=none指定,在這種模式下,Docker容器擁有自己的Network Namespace,但是,並不為Docker容器進行任何網絡配置。也就是說,這個Docker容器沒有網卡、IP、路由等信息。需要我們自己為Docker容器添加網卡、配置IP等。這種模式如果不進行特定的配置是無法正常使用的,但它也給了用戶最大的自由度來自定義容器的網絡環境。
5.overlay模式
overlay網絡特點:
- 跨主機通訊
- 無需做端口映射
- 無需擔心IP沖突
Docker入門與應用系列(四)網絡管理