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

1、關於Dockerhtml



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

Docker 可讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,而後發佈到任何流行的 Linux 機器上,也能夠實現虛擬化。容器是徹底使用沙箱機制,相互之間不會有任何接口(相似 iPhone 的 app),更重要的是容器性能開銷極低。web

由於對比傳統虛擬機有啓動快、性能提高、運維成本等等絕對優點,愈來愈受開發運維童鞋的青睞。docker



2、關於Docker網絡模式分類
數據庫



  1. 1)bridge模式,--net=bridge(默認)ubuntu

  2. 2)host模式,--net=hostcentos

  3. 3)container模式 使用–net =container:指定容器名安全

  4. 4)none模式,--net=nonebash

  5. 5)用戶自定義模式服務器



3、關於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

1.png

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

2.png

啓動docker服務後會發現主機多了一個docker0網卡
(PS:目前本機是經過192.168.32.129這個地址能夠直接上網的)。

3.png

咱們啓動一個Centos的容器並進入bash,因爲咱們沒有本地沒有centos的鏡像文件,默認就直接從Docker的官網鏡像倉庫下載。

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

4.png

查看啓動的容器

[root@cesrc ~]# docker ps –a

5.png

進入容器裏面,查看IP配置。

[root@cesrc ~]# docker attach b670

6.png

默認沒有ifconfig命令,yum安裝下net-tools

yum install net-tools

7.png

查看容器的ip和路由配置,容器分到了與docker0同段地址並將默認路由指向docker0

8.png

9.png

此容器能夠直接上網

10.png

iptables -t nat –vnL,查看docker生成的iptables,能夠看出至關於docker0對容器作了SNAT,

11.png

再啓動一個容器

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

12.png

此主機上的容器間能夠直接通信

13.png

此模式的網絡工做模式以下圖所示

14.png



3.2 host模式


容器將不會虛擬出本身的網卡,配置本身的IP等,而是直接使用宿主機的IP和端口,可是文件系統是和宿主機隔離的

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

15.png

進入容器

16.png

容器的進程以下,是和宿主機獨立。

17.png



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

18.png

分別進入容器內部,查看IP配置和文件系統是否獨立

S-centos

19.png

D-centos

20.png



3.4 None模式


此模式下建立的不會建立網絡,容器裏面就不會有ip容器中只有lo,用戶能夠在此基礎上,對容器網絡作定製,若想使用pipework手工配置指定docker容器的ip地址,必需要在none模式下才能夠

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

21.png

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數據包到達目的宿主機解封裝,解出原始數據包,最終到達目的容器。

22.png

圖片摘自網絡

實驗規劃

表格x.png


23.png

Node1節點安裝etcd步驟以下:


一、安裝etcd程序

yum install -y etcd

二、修改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實例名稱


三、設置後期分給docker容器的網段

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


四、設置開機啓動etcd服務並啓動該服務

systemctl enable etcd

systemctl start etcd


Node 2

一、安裝Docker和Flannel服務

yum install -y docker flannel


二、修改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通信網卡


三、設置啓動參數

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


四、啓動Docker和Flannel服務

systemctl enable docker flanneld

systemctl start docker flannel


五、開啓宿主機轉發功能{必定要打開,不少網上教程都沒有提這個,形成沒法聯通}

iptables -PFORWARD ACCEPT


六、建立容器並進入容器,查看IP

docker run -itd centos /bin/bash

docker ps –a

docker attach 6c

24.png

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

25.png

測試容器


Node2和node3上的容器是能夠互相訪問


26.png

27.png

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

28.png

29.png

上述方式能夠實現跨主機的docker通信,除此以外還有其餘兩種方式:

1:在宿主機上添加到其餘主機容器的靜態路由方式

2:橋接方式

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

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

靜態路由方法:

30.png

橋接方法:

31.png



4、關於Docker的經常使用概念和命令總結



Docker 鏡像

咱們都知道,操做系統分爲內核和用戶空間。對於 Linux 而言,內核啓動後,會掛載 root 文件系統爲其提供用戶空間支持。而 Docker 鏡像(Image),就至關因而一個 root 文件系統。好比官方鏡像 ubuntu:16.04 就包含了完整的一套 Ubuntu 16.04 最小系統的 root 文件系統。


Docker 容器

鏡像(Image)和容器(Container)的關係,就像是面向對象程序設計中的 類 和 實例 同樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器能夠被建立、啓動、中止、刪除、暫停等。


Docker Registry

鏡像構建完成後,能夠很容易的在當前宿主機上運行,可是,若是須要在其它服務器上使用這個鏡像,咱們就須要一個集中的存儲、分發鏡像的服務,Docker Registry 就是這樣的服務。

有公有,有私有。


鏡像管理命令:

獲取鏡像

從 Docker 鏡像倉庫獲取鏡像的命令是 docker pull。其命令格式爲:

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

命令參考 docker pull ubuntu:16.04

不指定tag默認就是下載最新的

docker pull mirrors.aliyun.com:ubuntu 從阿里雲倉庫


列出鏡像

docker image ls

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


刪除鏡像

docker rmi 鏡像Id 刪除鏡像文件

docker rmi -f 鏡像ID強制刪除鏡像


容器管理

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 查看全部容器,包含中止的容器。



進入容器

docker attch 名字進入容器

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


導出容器至文件

docker export -o test_for_run_tar 容器ID

或 docker export 容器ID >test_for_stop_tar


導入文件變成鏡像

docker import test_for_run_tar - test/ubuntu:v1.0


數據管理

  1. 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

只讀模式


  1. 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

文章來源:微信公衆號(宜信安全應急響應中心:CreditEaseSec)

做者:宜信技術學院    網絡安全-王志強  
相關文章
相關標籤/搜索