Docker的網絡模式和網絡隔離


一、Docker的網絡模式

docker的網絡模式有Bridge、Host、Container、None四種模式

Bridge

當docker進程啟動時,會在主機上創建一個名為docker0的虛擬網橋,此主機上啟動的docker容器默認會連接到這個虛擬網橋上;虛擬網橋的工作方式類似於物理交換機,主機上的所有容器就通過虛擬網橋連在一個二層網絡中。
默認,Docker會從docker0子網中分配一個IP給容器使用,並設置docker0的IP地址為容器的默認網關。
在主機上創建一對虛擬網卡br設備,docker將br設備的一端放在新創建的容器中,並命名為eth0(容器內部網卡),另一端放在主機中,以br-xxx這樣類似的名稱命名,並將這個網絡設備加入到docker0(網橋中)。
如果有多個容器之間需要互相通信,使用Docker Compose或k8s編排工具。

[root@919 ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
br-3721cd5a380d		8000.0242fae4b5b4	no		
br-c1a81e911a92		8000.0242bf8de935	no		
docker0		        8000.0242ce2c4c07	no	

Host

如果啟動容器時使用host模式,那么這個容器將不會獲取一個獨立的“network namespace”,而是和宿主機共用一個“network namespace”。容器將不會虛擬出自己的網卡、配置自己IP等,而是直接使用宿主機的IP和端口;但是,容器的其他方面,如文件系統、系統進程等還是和宿主機隔離開的。

Container

這個模式指定新創建的容器和已經存在的容器共享一個“network namespace”,而不是和宿主機共享;新創建的容器也不會自己創建網卡、IP等。同樣兩個容器除了網絡外,其他的還都是屬於隔離;兩個容器的進程可以通過宿主機的lo網卡設備進行通信。

[root@919 ~]# docker run -it --name centos1 centos1/centos:v1

[root@5b475c57a4b0 /]# ifconfig eth0
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 8  bytes 656 (656.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
[root@5b475c57a4b0 /]# read escape sequence

[root@919 ~]# docker run -it --name centos2 --net=container:centos1 centos1/centos:v1

[root@5b475c57a4b0 /]# ifconfig eth0
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 8  bytes 656 (656.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

None

使用none模式,docker容器擁有自己的network namespace,但是,並不為docker容器進行任何網絡配置;也就是說,這個docker容器沒有網卡、IP、路由等信息,需要我們自己為docker容器添加網卡、配置IP等。

二、Docker網絡隔離、獨立IP設置

在通常情況下,docker使用網橋(Bridge)與NAT的通信模式

netfilter規則

(1)容器訪問外部網絡

# SNAT
iptables -t nat -A POSTROUTING -s 172.17.0.0/16 -o docker0 -j MASQUERADE

(2)外部網絡訪問容器

# DNAT
docker run -d -p 80:80 apache

iptables -t nat -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER

iptables -t nat -A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.2:80

docker網絡模式修改

(1)docker進程網絡修改
只要修改了進程網絡后面的容器都會生效,主從的關系

-b,--bridge:
指定docker使用的網橋設備,默認情況下docker會自動創建和使用docker0網橋設備,通過此參數可以使用已經存在的設備。

[root@919 ~]# ifconfig docker0
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:ceff:fe2c:4c07  prefixlen 64  scopeid 0x20<link>
        ether 02:42:ce:2c:4c:07  txqueuelen 0  (Ethernet)
        RX packets 35126  bytes 6686759 (6.3 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 42464  bytes 86634276 (82.6 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

--bip:
指定docker0的IP和掩碼,使用標准的CIDR形式,如10.10.10.10/24

--dns:
配置容器的DNS,在啟動docker進程時添加,所有容器全部生效

(2)docker容器網絡修改
只在啟動的容器生效

--dns:
用於指定啟動的容器的DNS

--net:
用於指定容器的網絡通訊方式,有如下四個值

  • bridge:docker默認方式,網橋模式
  • none:容器沒有網絡棧
  • container:使用其他容器的網絡棧,docker容器會加入其他容器的network namespace
  • host:表示容器使用host的網絡,沒有自己獨立的網絡棧,容器可以完全訪問host網絡,非常不安全。
docker run -it --name centos1 --net=none centos
[root@919 ~]# docker run -it --name centos1 --net=none centos
[root@5b16b5f20c58 /]# 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

(3)暴露端口

-p/P選項的使用格式

-p <containerport> # 將指定的容器端口映射至主機所有地址的一個動態端口
-p <hostport>:<containerport> # 映射至指定的主機端口
-p <IP>::<containerport> # 映射至指定的主機的IP的動態端口
-p <IP>:<hostport>:<containerport> # 映射至指定主機的IP的主機端口
-P # 暴露所需要的所有端口

docker port 可以查看容器當前的映射關系

[root@919 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                   NAMES
c99a91d6250d        centos              "/usr/sbin/init"    9 minutes ago       Up 9 minutes        0.0.0.0:32768->80/tcp   nginxv3
491ab139e4fd        centos              "/usr/sbin/init"    18 minutes ago      Up 18 minutes                               nginxv2
[root@919 ~]# docker port nginxv3
80/tcp -> 0.0.0.0:32768

(4)自定義docker0網橋的網絡地址
修改/etc/docker/daemon.json

	{
		"bip":"192.168.1.5/24",
		"fixed-cidr":"10.20.0.0/16",
		"fixed-cidr-v6":"2001:db8::/64",
		"mtu":"1500",
		"default-gateway":"10.20.1.1",
		"default-gateway-v6":"2001:db8:abcd::89",
		"dns":["10.20.1.2","10.20.1.3"]
	}

常見隔離方式

網絡命令空間隔離網絡

docker network ls 查看當前可用的網絡類型

docker network create -d <類型> <網絡空間名稱>

類型:

overlay network	# 覆蓋型網絡,不同的主機之間可以互相通信,需要借助一定的設備
bridge network  # 網橋

創建兩個網絡

[root@919 ~]# docker network create -d bridge lamp
3721cd5a380de3f27bc3b32c9dfd34f8262aac0917e30799085fc11d0d0d2068
[root@919 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
2f6d2d0b2eb2        bridge              bridge              local
8ff53f37566a        host                host                local
3721cd5a380d        lamp                bridge              local
c1a81e911a92        lnmp                bridge              local
b897072c940a        none                null                local

[root@919 ~]# ifconfig 
br-3721cd5a380d: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.18.0.1  netmask 255.255.0.0  broadcast 172.18.255.255
        inet6 fe80::42:faff:fee4:b5b4  prefixlen 64  scopeid 0x20<link>
        ether 02:42:fa:e4:b5:b4  txqueuelen 0  (Ethernet)
        RX packets 3  bytes 182 (182.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 11  bytes 838 (838.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

br-c1a81e911a92: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.19.0.1  netmask 255.255.0.0  broadcast 172.19.255.255
        inet6 fe80::42:bfff:fe8d:e935  prefixlen 64  scopeid 0x20<link>
        ether 02:42:bf:8d:e9:35  txqueuelen 0  (Ethernet)
        RX packets 41405  bytes 23602140 (22.5 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 41405  bytes 23602140 (22.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


運行容器,分別指定網絡為剛才創建的名為lamp和lnmp的網絡

[root@919 ~]# docker run -it  --name cento01 --network=lamp centos
[root@744bbf4fa6c0 /]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.18.0.2  netmask 255.255.0.0  broadcast 172.18.255.255
        ether 02:42:ac:12:00:02  txqueuelen 0  (Ethernet)
        RX packets 1402  bytes 8858081 (8.4 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1395  bytes 95487 (93.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@919 ~]# docker run -it  --name cento02 --network=lnmp centos
[root@0f79003592cd /]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.19.0.2  netmask 255.255.0.0  broadcast 172.19.255.255
        ether 02:42:ac:13:00:02  txqueuelen 0  (Ethernet)
        RX packets 2011  bytes 8895817 (8.4 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1673  bytes 115079 (112.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

此時兩個容器之間無法進行通信,但依舊可以連接外網

[root@0f79003592cd /]# ping 172.18.0.2
PING 172.18.0.2 (172.18.0.2) 56(84) bytes of data.
^C
--- 172.18.0.2 ping statistics ---
7 packets transmitted, 0 received, 100% packet loss, time 1005ms

[root@0f79003592cd /]# ping www.baidu.com
PING www.a.shifen.com (182.61.200.7) 56(84) bytes of data.
64 bytes from 182.61.200.7 (182.61.200.7): icmp_seq=1 ttl=54 time=4.48 ms


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM