UTS:主機名和域名docker
User:用戶網絡
Mount掛載文件繫系統oop
IPC:進程間通訊code
pid:進程id接口
Net:網絡進程
網絡名稱空間主要實現「協議棧」和「網絡設備」的隔離,一個設備能夠單獨關聯給一個單獨的名稱空間使用,其餘名稱空間就看不到這個設備了,這使得每一個名稱空間均可以配置一個單獨的ip與外界通訊,ip
可是若是網絡設備不夠爲網絡設備使用了,咱們的內核能夠模擬出來一個交換機,並模擬一對接口,一個接到一個名稱空間,一個接到交換機,get
docker安裝後自動提供三種網絡域名
[root@localhost ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 1d7c5fcc9190 bridge bridge local b3ec0cad3ccc host host local 2c634f206126 none null local
bridge表示橋接式網絡(net橋)他會在本機之上建立一個純軟件的交換機,叫docker0,既能夠扮演交換設備,又能夠扮演網卡設備,io
host表示讓容器使用宿主機的網絡名稱空間
none表示null 表示爲空,沒有任何網卡,封閉式接口只有lo接口
[root@localhost ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 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: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 08:00:27:72:1c:ca brd ff:ff:ff:ff:ff:ff inet 10.192.45.116/21 brd 10.192.47.255 scope global dynamic enp0s3 valid_lft 2875sec preferred_lft 2875sec inet6 fe80::a00:27ff:fe72:1cca/64 scope link valid_lft forever preferred_lft forever 3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP link/ether 02:42:58:26:e8:42 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:58ff:fe26:e842/64 scope link valid_lft forever preferred_lft forever 13: vethcc71d75@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP link/ether 86:ad:5a:89:e7:46 brd ff:ff:ff:ff:ff:ff link-netnsid 1 inet6 fe80::84ad:5aff:fe89:e746/64 scope link valid_lft forever preferred_lft forever 15: vethe5b386c@if14: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP link/ether 3a:43:31:9c:5b:0f brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet6 fe80::3843:31ff:fe9c:5b0f/64 scope link valid_lft forever preferred_lft forever
vethcc71d75@if12和vethe5b386c@if14這兩個是咱們建立的一對網卡的一半,咱們有兩個容器,一半在容器裏,一半在本機上
[root@localhost ~]# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bd141921d661 haoran/httpd:v0.2 "/bin/httpd -f -h /d…" 3 hours ago Up 3 hours t2 e0f415751ebb haoran/httpd:v0.1-1 "sh" 3 hours ago Up 3 hours t1
使用brctl命令就能夠看的明白了
[root@localhost ~]# yum -y install bridge-utils [root@localhost ~]# brctl show bridge name bridge id STP enabled interfaces docker0 8000.02425826e842 no vethcc71d75 vethe5b386c
能夠看到docker0關聯了兩個設備vethcc71d75和vethe5b386c
每建立一個容器啓動並分配ip之後,在主機上會生成一個iptables規則
[root@iZ2zefbrqggvke1qw0kd0hZ ~]# iptables -t nat -vnL Chain POSTROUTING (policy ACCEPT 8020 packets, 581K bytes) pkts bytes target prot opt in out source destination 274 17427 MASQUERADE all -- * !docker0 172.18.0.0/16 0.0.0.0/0
*從任何接口進來
!docker0只要不從docker0進來
原地址來個172.18.0.0/16這個網段的
0.0.0.0/0 不管到達任何主機
MASQUERADE是用發送數據的網卡上的IP來替換源IP,所以,對於那些IP不固定的場合,好比撥號網絡或者經過dhcp分配IP的狀況下,就得用MASQUERADE。