初學Docker容器網路不得不看的學習筆記

宜信技術學院發表於2019-05-23

一、關於Docker

Docker 是一個開源的應用容器引擎,基於 Go 語言 並遵從Apache2.0協議開源。

Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然後釋出到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面(類似 iPhone 的 app),更重要的是容器效能開銷極低。

因為對比傳統虛擬機器有啟動快、效能提升、運維成本等等絕對優勢,越來越受開發運維童鞋的青睞。

二、關於Docker網路模式分類

1、bridge模式,--net=bridge(預設)

2、host模式,--net=host

3、container模式 使用–net =container:指定容器名

4、none模式,--net=none

5、使用者自定義模式

三、關於Docker網路模式詳解

3.1 bridge模式

Docker網路的預設模式,在docker run啟動容器的時候,如果不加--net引數,就預設採用這種網路模式。安裝完docker,系統會自動新增一個供docker使用的網橋docker0。容器通過DHCP獲取一個與docker0同網段的IP地址,並預設連線到docker0網橋,並將docker0的IP地址作為閘道器實現容器與宿主機的網路互通,另外,同一個宿主機下同樣使用bridge模式的容器可以直接通訊。

實驗部分

環境:VMware 安裝Centos7虛擬機器。

首先在Centos虛擬機器中安裝容器

yum -y install docker-io  ####安裝docker

 

啟動容器服務並檢查啟動狀態systemctl start docker 

啟動docker服務後會發現主機多了一個docker0網路卡 (PS:目前本機是通過192.168.32.129這個地址可以直接上網的)。

我們啟動一個Centos的容器並進入bash,由於我們沒有本地沒有centos的映象檔案,預設就直接從Docker的官網映象倉庫下載。

[root@cesrc ~]# docker run -itd centos /bin/bash

 

檢視啟動的容器

[root@cesrc ~]# docker ps –a

 

進入容器裡面,檢視IP配置。

[root@cesrc ~]# docker attach b670

 

預設沒有ifconfig命令,yum安裝下net-tools

yum install net-tools

 

檢視容器的ip和路由配置,容器分到了與docker0同段地址並將預設路由指向docker0

此容器可以直接上網

iptables -t nat –vnL,檢視docker生成的iptables,可以看出相當於docker0對容器做了SNAT,

再啟動一個容器

docker run -itd --name centos2 centos /bin/bash

 

此主機上的容器間可以直接通訊

此模式的網路工作模式如下圖所示

3.2 host模式

容器將不會虛擬出自己的網路卡,配置自己的IP等,而是直接使用宿主機的IP和埠,但是檔案系統是和宿主機隔離的

docker run -itd --net=host --name host-rq centos /bin/bash

 

進入容器

容器的程式如下,是和宿主機獨立。

3.3 Container模式

此模式指定新建立的容器和已經存在的一個容器共享一個 Network,和已有指定的容器出了網路方面其他都是獨立的。

建立原始的一個容器s-centos

[root@cesrc ~]# docker run -itd --name s-centos centos /bin/bash

be7425c3fac6845c9d8d150f9b8c710f9268611fa3a6d86d59444ea1e4bfe415

 

建立新容器d-centos並使用原有容器的網路

[root@cesrc ~]# docker run -itd --net=container:s-centos --name d-centos centos /bin/bash

d576e3009391111688004f57c1549572fd534d33d0e7ee7cc1e02a785f6c8c14

 

分別進入容器內部,檢視IP配置和檔案系統是否獨立

S-centos

D-centos

3.4 None模式

此模式下建立的不會建立網路,容器裡面就不會有ip容器中只有lo,使用者可以在此基礎上,對容器網路做定製,若想使用pipework手工配置指定docker容器的ip地址,必須要在none模式下才可以

docker run -itd --net=none --name n-centos centos /bin/bash

 

None模式下生成的容器必須經過手工配置後才可以上網。

3.5 使用者自定義模式

使用者自定義模式主要可選的有三種網路驅動:bridge、overlay、macvlan。bridge驅動用於建立類似於前面提到的bridge網路;overlay和macvlan驅動用於建立跨主機的網路,本例中我們使用Flannel和etcd使用overlay技術實現docker跨物理機通訊。

Flannel實現的容器的跨主機通訊通過如下過程實現:

在etcd中規劃配置所有主機的docker0子網範圍;每個主機上的flanneld根據etcd中的配置,為本主機的docker0分配子網,保證所有主機上的docker0網段不重複,並將結果(即本主機上的docker0子網資訊和本主機IP的對應關係)存入etcd庫中,這樣etcd庫中就儲存了所有主機上的docker子網資訊和本主機IP的對應關係;當需要與其他主機上的容器進行通訊時,查詢etcd資料庫,找到目的容器的子網所對應的outip(目的宿主機的IP),將原始資料包封裝在VXLAN或UDP資料包中,IP層以outip為目的IP進行封裝;由於目的IP是宿主機IP,因此路由是可達的,VXLAN或UDP資料包到達目的宿主機解封裝,解出原始資料包,最終到達目的容器。

(圖片摘自網路)

實驗規劃

Node1節點安裝etcd步驟如下

1、安裝etcd程式

yum install -y etcd

 

2、修改etcd配置檔案,配置檔案在/etc/etcd/etcd.conf,本實驗etcd單機部署,群集配置部分沒有做嚴格更改。配置如下:

#[Member]

#ETCD_CORS=""

ETCD_DATA_DIR="/var/lib/etcd/host129.etcd"  #etcd資料儲存目錄

#ETCD_WAL_DIR=""

#ETCD_LISTEN_PEER_URLS=http://192.168.32.129:2380  #叢集內部通訊使用的URL

ETCD_LISTEN_CLIENT_URLS=http://127.0.0.1:2379,http://192.168.32.129:2379    #供外部客戶端使用的URL

#ETCD_MAX_SNAPSHOTS="5"

#ETCD_MAX_WALS="5"

ETCD_NAME="host129"    #etcd例項名稱

 

3、設定後期分給docker容器的網段

etcdctl mk /network/config '{"Network":"172.18.0.0/16", "SubnetMin": "172.18.1.0", "SubnetMax": "172.18.254.0"}'

 

4、設定開機啟動etcd服務並啟動該服務

systemctl enable etcd

systemctl start etcd

 

Node2節點安裝etcd步驟如下

1、安裝Docker和Flannel服務

yum install -y docker flannel

 

2、修改Flannel配置檔案如下

Flanneld configuration options

# etcd url location.  Point this to the server where etcd runs

FLANNEL_ETCD_ENDPOINTS="http://192.168.32.129:2379" ##設定etcd地址和埠資訊

# etcd config key.  This is the configuration key that flannel queries

# For address range assignment

FLANNEL_ETCD_PREFIX="/network"

# Any additional options that you want to pass

FLANNEL_OPTIONS="-iface=ens33"     ##設定Flannel與etcd通訊網路卡

 

3、設定啟動引數

cd /usr/libexec/flannel/ 
./mk-docker-opts.sh –i

 

4、啟動Docker和Flannel服務

systemctl enable docker flanneld

systemctl start docker flannel

 

5、開啟宿主機轉發功能{一定要開啟,很多網上教程都沒有提這個,造成無法聯通}

iptables -PFORWARD ACCEPT

 

6、建立容器並進入容器,檢視IP

docker run -itd centos /bin/bash

docker ps –a

docker attach 6c

 

在Node2節點上的操作同樣在Node3執行一遍,最終看到Node3的獲取的IP如圖:

測試容器

Node2和node3上的容器是可以互相訪問

宿主機上生成了到各個node的路由條目

上述方式可以實現跨主機的docker通訊,除此之外還有其他兩種方式:

  • 在宿主機上新增到其他主機容器的靜態路由方式

  • 橋接方式

這兩種方式都比較好理解,參考網路摘抄的兩張圖片

原文連結:https://www.cnblogs.com/yy-cxd/p/6553624.html

靜態路由方法:

橋接方法:

四、關於Docker的常用概念和命令總結

4.1 Docker 映象

我們都知道,作業系統分為核心和使用者空間。對於 Linux 而言,核心啟動後,會掛載 root 檔案系統為其提供使用者空間支援。而 Docker 映象(Image),就相當於是一個 root 檔案系統。比如官方映象 ubuntu:16.04 就包含了完整的一套 Ubuntu 16.04 最小系統的 root 檔案系統。

4.2 Docker 容器

映象(Image)和容器(Container)的關係,就像是物件導向程式設計中的 類 和 例項 一樣,映象是靜態的定義,容器是映象執行時的實體。容器可以被建立、啟動、停止、刪除、暫停等。

4.3 Docker Registry

映象構建完成後,可以很容易的在當前宿主機上執行,但是,如果需要在其它伺服器上使用這個映象,我們就需要一個集中的儲存、分發映象的服務,Docker Registry 就是這樣的服務。

有公有,有私有。

映象管理命令

1) 獲取映象

從 Docker 映象倉庫獲取映象的命令是 

docker pull

其命令格式為:

docker pull [選項] [Docker Registry 地址[:埠號]/]倉庫名[:標籤]

 

命令參考

docker pull ubuntu:16.04 

 

不指定tag預設就是從阿里雲倉庫下載最新的

docker pull mirrors.aliyun.com:ubuntu 

 

2) 列出映象

docker image ls

 

列表包含了 倉庫名、標籤、映象 ID、建立時間 以及 所佔用的空間。

3) 刪除映象

docker rmi 映象Id 刪除映象檔案

docker rmi -f 映象ID強制刪除映象

4) 容器管理

docker create 建立不啟動

docker start啟動容器 

docker stop 容器名稱 終止容器

docker restart 容器名稱重啟容器

docker rm id 刪除容器

docker run -it centos /bin/sh 建立並啟動容器 exit後容器自動退出,若想以守護程式方式繼續執行,需要改為docker run -itd centos /bin/sh

docker ps 檢視執行中的容器

docker ps –a 檢視所有容器,包含停止的容器。

5) 進入容器

docker attch 名字進入容器

docker exec -it``` 容器```id command | docker exec -it 7813e41ec005 /bin/sh

 

6) 匯出容器至檔案

docker export -o test_for_run_tar 容器ID

 docker export 容器ID >test_for_stop_tar

7) 匯入檔案變成映象

docker import test_for_run_tar - test/ubuntu:v1.0

 

8) 資料管理

a)資料卷是一個可供容器使用的特殊目錄,將作業系統的目錄對映到容器

docker run -d -P --name web -v /src/webapp:/opt/webapp centos /bin/sh

 

掛載主機的/src/webapp到容器的/opt/webapp目錄,預設可讀寫

docker run -d -P --name web -v /src/webapp:/opt/webapp:ro centos /bin/sh

只讀模式

 

b)資料卷容器,可供其他容器共享使用的容器

先建立一個資料卷容器

root@localhost /]# docker run -it -v /cunchu --name chuchurongqi centos

[root@90bd63b06074 /]# ls

bin cunchu dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

[root@90bd63b06074 /]# cd cunchu/

[root@90bd63b06074 cunchu]# vi qiang.txt

 

新建一個其他容器,使用--volumes-from 資料卷容器名字實現掛載容器卷裡面的資料卷。

[root@localhost /]# docker run -it --volumes-from chuchurongqi --name db2 centos

 

作者:網路安全-王志強

原文首發於:宜信安全應急響應中心

來源:宜信技術學院

相關文章