Docker的網絡介紹

Docker 網絡基礎

Docker啓動時, 會自動在主機上創建一個docker0虛擬網橋, 實際上是Linux的一個bridge,可以理解爲一個軟件交換機, 它會而掛載到它的網口之間進行轉發 當創建一個Docker容器的時候, 同理會創建一對veth pair接口(當數據包發送到一個接口時, 另外一個接口也可以收到相同的數據包), 這對接口一端在容器內, 即eth0;另一端在本地並被掛載到docker0網橋, 名稱以veth開頭。
Docker的網絡介紹
Docker容器的DNS和主機名
實際上容器中/etc目錄下有3個文件是容器啓動後被虛擬文件覆蓋掉的, 分別是/etc/hostname、 /etc/hosts、 /etc/resolve.conf,通過在容器中運行mount命令可以查看。
Docker容器的5種網絡模式
在使用docker run創建docker容器時, 可以用--net選項指定容器的網絡模式, Docker有以下5種網絡模式:
1. bridge模式
使用docker run --net=bridge指定, bridge模式是Docker默認的網絡設置, 此模式會爲每一個容器分配Network Namespace、 設置IP等, 並將一個主機上的Docker容器連接到一個虛擬網橋上。 此模式與外界通信使用NAT協議, 增加了通訊的複雜性, 在複雜場景下使用會有諸多
限制。
route -n 查看 IP routing tables;
iptables -t nat -L -n 查看iptables rules.
2. host模式
使用docker run --net=host指定, 這種模式Docker Server將不爲Docker容器創建網絡協議棧, 即不會創建獨立的network namespace,Docker容器中的進程處於宿主機的網絡環境中,相當於Docker容器的宿主機共用同一個network namespace,使用宿主機的網卡、 IP、 端口等信息。 此模式沒有網絡隔離性, 同時會引起網絡資源的競爭與衝突。
3. container模式
使用docker run --net=container:othercontainer_name指定, 這種模式與host模式相似, 指定新創建的容器和已經存在的某個容器共享同一個network namespace, 以下兩種模式都共享network namespace,區別就在於host模與宿主機共享, 而container模式與某個存在的容器共享。 在container模式下, 兩個容器的進程可以通過lo迴環網絡設備通訊, 增加了容器間通訊的便利性和效率。 container模式的應用場景就在於可以將一個應用的多個組件放在不同的容器趾, 這些 容器配成container模式的網絡, 這樣它們可以作爲一個整體對外提供服務。 同
時, 這種模式也降低了容器間的隔離性。
docker run -it --name helloworld busybox sh docker run -it --name helloword-con --
net=container:helloword busybox sh
4. none模式
使用docker run --net=none指定, 在這種模式下, Docker容器擁有自己的Network
Namespace, 但是, 並不爲Docker容器進行任何網絡配置。 也就是說, 這個Docker容器沒有網卡、 IP、 路由等信息。 需要我們自己爲Docker容器添加網卡、 配置IP等。 這種模式如果不進行特定的配置是無法正常使用的, 但它也給了用戶最大的自由度來自定義容器的網絡環境。
5. overlay模式
overlay網絡特點:
跨主機通訊
無需做端口映射
無需擔心IP衝突
服務發現與k/v存儲: etcd, consul

原生網絡

[root@localhost ~]# docker pull busybox
//下載一個busybox
[root@localhost ~]# docker network ls
//查看原生網絡

Docker的網絡介紹

1.None:什麼都沒有的網絡

[root@localhost ~]# docker run -itd --name none --network none busybox:latest
//根據busybox創建一個容器,網卡爲none

[root@localhost ~]# docker exec -it none /bin/sh
//進入剛剛創建的容器
/ # ip a
//查看一下IP

Docker的網絡介紹
用到None網絡的容器,會發現它只有一個Loop back迴環的地址,沒有Mac地址,IP等信息,意味着他不能跟外界通信,是被隔離起來的網絡。需要我們自己爲Docker容器添加網卡、 配置IP等。 這種模式如果不進行特定的配置是無法正常使用的, 但它也給了用戶最大的自由度來自定義容器的網絡環境。

使用場景:
隔離意味着安全,所以此網絡可以運行一些關於安全方面的驗證碼、效驗碼等服務。

2.Host網絡:基於宿主機的網絡

[root@localhost ~]# docker run -itd --name host --network host  busybox:latest
//根據busybox創建一個容器,網卡爲host

[root@localhost ~]# docker exec -it host /bin/sh
//進入剛剛創建的容器
/ # ip a
//查看一下IP

Docker的網絡介紹
用到Host網絡的容器,它的網絡跟宿主機的網絡一模一樣,那是因爲,在創建這個容器之初、並沒有對它的Net網絡棧進行隔離,而是直接使用的宿主機的網絡棧。

使用場景:
網絡配置與dockerHost完全相同,性能較好,但不便之處是靈活性不高,此模式沒有網絡隔離性,容器與宿主機出現端口衝突問題。

3.Bridge:橋接網絡

[root@localhost ~]# brctl show
//查看一下橋接網絡

Docker的網絡介紹
docker0:在我們安裝docker這個服務的時候,默認就會生產- -張docker0的網卡,一般默認IP爲172.17.0.1/16.

[root@localhost ~]# docker run -itd --name test1   busybox:latest
//根據busybox創建一個容器
[root@localhost ~]# docker exec -it test1 /bin/sh
//進入剛剛創建的容器
/ # ip a
//查看一下IP

Docker的網絡介紹

/ # exit
//退出容器
[root@localhost ~]# ip a
//查看一下IP,*會發現多出一張網卡(docker0的網卡@容器中的if6)*

Docker的網絡介紹

[root@localhost ~]# brctl show
//查看一下橋接網絡,*這裏也多了一個網卡*

Docker的網絡介紹
容器默認使用的網絡是docker0網絡,docker0此時相當於一個路由器,基於此網絡的容器,網段都是和docker0一致的。

自定義網絡

自帶了-個ContainerDNSserver功能(域名解析)
1.bridge

[root@localhost ~]# docker network create -d bridge my_net
//創建一個名稱爲my_net的bridge網絡
-d:設置網卡模式
[root@localhost ~]# ip a
//查看ip,會發現多了一個網卡

Docker的網絡介紹

[root@localhost ~]# brctl show
//查看一下橋接網絡,這裏也多了一個網卡

Docker的網絡介紹

[root@localhost ~]# docker run -itd --name test3 --network   my_net busybox:latest
//開啓一臺容器,網卡爲剛剛創建的my_net
[root@localhost ~]# docker exec -it test3 /bin/sh
//進入剛剛創建的容器
/ # ip a
//查看一下IP

Docker的網絡介紹

[root@localhost ~]# ip a
//查看ip,會發現多了一個網卡

Docker的網絡介紹

[root@localhost ~]# brctl show
//查看一下橋接網絡,這裏也多了一個網卡

Docker的網絡介紹

[root@localhost ~]# docker run -itd --name test4 --network   my_net busybox:latest
//開啓一臺容器,網卡爲剛剛創建的my_net
[root@localhost ~]# docker exec -it test3 /bin/sh
/ # ping test4
//ping 剛剛創建的容器名稱

Docker的網絡介紹
自定義網絡優點,它可以通過容器的名稱通信。

2.指定容器IP

[root@localhost ~]# docker run -itd --name t1 --network my_net --ip 172.18.0.8 busybox:latest
//開啓一個容器並指定IP

Docker的網絡介紹

[root@localhost ~]# docker network create -d bridge --subnet 172.30.16.0/24 --gateway 172.30.16.1 my_net3
//創建一個自定義網絡,並且指定網關和網段
[root@localhost ~]# docker network ls
//查看網絡

Docker的網絡介紹
[root@localhost ~]# ip a
Docker的網絡介紹
如果想要給容器指定IP地址,那麼自定義網絡的時候,必須指定網關gate和subnet網段選項。

開啓兩個容器測試一下

[root@localhost ~]# docker run -itd --name test5 --network my_net3 --ip 172.30.16.5 busybox:latest
//開啓一個容器test5並指定IP
[root@localhost ~]# docker exec -it test5 /bin/sh
/ # ip a

Docker的網絡介紹

[root@localhost ~]# docker run -itd --name test6 --network my_net3 --ip 172.30.16.6 busybox:latest
//開啓一個容器test6並指定IP
[root@localhost ~]# docker exec -it test6 /bin/sh
/ # ip a

Docker的網絡介紹

/ # ping test5
Docker的網絡介紹

3.各網卡互通

[root@localhost ~]# iptables-save
//查看網卡信息的配置規則(可以看到防火牆的規則當另一個網卡信息來到自己這裏時直接丟棄)

Docker的網絡介紹

[root@localhost ~]# docker network connect  my_net3 test4
//my_net3網卡橋接test4 (網卡名稱 容器名稱)
[root@localhost ~]# docker exec  -it test5 /bin/sh
/ # ping test4

Docker的網絡介紹
剩下的以此類推,然後就可以各個網卡互通了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章