一、關於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
作者:網絡安全-王志強
原文首發於:宜信安全應急響應中心
來源:宜信技術學院