初学Docker容器网络不得不看的学习笔记
【技術(shù)沙龍002期】數(shù)據(jù)中臺(tái):宜信敏捷數(shù)據(jù)中臺(tái)建設(shè)實(shí)踐|宜信技術(shù)沙龍 將于5月23日晚8點(diǎn)線上直播,點(diǎn)擊報(bào)名
一、關(guān)于Docker
Docker 是一個(gè)開(kāi)源的應(yīng)用容器引擎,基于 Go 語(yǔ)言 并遵從Apache2.0協(xié)議開(kāi)源。
Docker 可以讓開(kāi)發(fā)者打包他們的應(yīng)用以及依賴(lài)包到一個(gè)輕量級(jí)、可移植的容器中,然后發(fā)布到任何流行的 Linux 機(jī)器上,也可以實(shí)現(xiàn)虛擬化。容器是完全使用沙箱機(jī)制,相互之間不會(huì)有任何接口(類(lèi)似 iPhone 的 app),更重要的是容器性能開(kāi)銷(xiāo)極低。
因?yàn)閷?duì)比傳統(tǒng)虛擬機(jī)有啟動(dòng)快、性能提升、運(yùn)維成本等等絕對(duì)優(yōu)勢(shì),越來(lái)越受開(kāi)發(fā)運(yùn)維童鞋的青睞。
二、關(guān)于Docker網(wǎng)絡(luò)模式分類(lèi)
1、bridge模式,--net=bridge(默認(rèn))
2、host模式,--net=host
3、container模式 使用–net =container:指定容器名
4、none模式,--net=none
5、用戶(hù)自定義模式
三、關(guān)于Docker網(wǎng)絡(luò)模式詳解
3.1 bridge模式
Docker網(wǎng)絡(luò)的默認(rèn)模式,在docker run啟動(dòng)容器的時(shí)候,如果不加--net參數(shù),就默認(rèn)采用這種網(wǎng)絡(luò)模式。安裝完docker,系統(tǒng)會(huì)自動(dòng)添加一個(gè)供docker使用的網(wǎng)橋docker0。容器通過(guò)DHCP獲取一個(gè)與docker0同網(wǎng)段的IP地址,并默認(rèn)連接到docker0網(wǎng)橋,并將docker0的IP地址作為網(wǎng)關(guān)實(shí)現(xiàn)容器與宿主機(jī)的網(wǎng)絡(luò)互通,另外,同一個(gè)宿主機(jī)下同樣使用bridge模式的容器可以直接通訊。
實(shí)驗(yàn)部分
環(huán)境:VMware 安裝Centos7虛擬機(jī)。
首先在Centos虛擬機(jī)中安裝容器
yum -y install docker-io ####安裝docker啟動(dòng)容器服務(wù)并檢查啟動(dòng)狀態(tài)systemctl start docker
啟動(dòng)docker服務(wù)后會(huì)發(fā)現(xiàn)主機(jī)多了一個(gè)docker0網(wǎng)卡
(PS:目前本機(jī)是通過(guò)192.168.32.129這個(gè)地址可以直接上網(wǎng)的)。
我們啟動(dòng)一個(gè)Centos的容器并進(jìn)入bash,由于我們沒(méi)有本地沒(méi)有centos的鏡像文件,默認(rèn)就直接從Docker的官網(wǎng)鏡像倉(cāng)庫(kù)下載。
[root@cesrc ~]# docker run -itd centos /bin/bash查看啟動(dòng)的容器
[root@cesrc ~]# docker ps –a進(jìn)入容器里面,查看IP配置。
[root@cesrc ~]# docker attach b670默認(rèn)沒(méi)有ifconfig命令,yum安裝下net-tools
yum install net-tools
查看容器的ip和路由配置,容器分到了與docker0同段地址并將默認(rèn)路由指向docker0
此容器可以直接上網(wǎng)
iptables -t nat –vnL,查看docker生成的iptables,可以看出相當(dāng)于docker0對(duì)容器做了SNAT,
再啟動(dòng)一個(gè)容器
docker run -itd --name centos2 centos /bin/bash
此主機(jī)上的容器間可以直接通訊
此模式的網(wǎng)絡(luò)工作模式如下圖所示
3.2 host模式
容器將不會(huì)虛擬出自己的網(wǎng)卡,配置自己的IP等,而是直接使用宿主機(jī)的IP和端口,但是文件系統(tǒng)是和宿主機(jī)隔離的
docker run -itd --net=host --name host-rq centos /bin/bash
進(jìn)入容器
容器的進(jìn)程如下,是和宿主機(jī)獨(dú)立。
3.3 Container模式
此模式指定新創(chuàng)建的容器和已經(jīng)存在的一個(gè)容器共享一個(gè) Network,和已有指定的容器出了網(wǎng)絡(luò)方面其他都是獨(dú)立的。
創(chuàng)建原始的一個(gè)容器s-centos
[root@cesrc ~]# docker run -itd --name s-centos centos /bin/bashbe7425c3fac6845c9d8d150f9b8c710f9268611fa3a6d86d59444ea1e4bfe415創(chuàng)建新容器d-centos并使用原有容器的網(wǎng)絡(luò)
[root@cesrc ~]# docker run -itd --net=container:s-centos --name d-centos centos /bin/bashd576e3009391111688004f57c1549572fd534d33d0e7ee7cc1e02a785f6c8c14分別進(jìn)入容器內(nèi)部,查看IP配置和文件系統(tǒng)是否獨(dú)立
S-centos
D-centos
3.4 None模式
此模式下創(chuàng)建的不會(huì)創(chuàng)建網(wǎng)絡(luò),容器里面就不會(huì)有ip容器中只有l(wèi)o,用戶(hù)可以在此基礎(chǔ)上,對(duì)容器網(wǎng)絡(luò)做定制,若想使用pipework手工配置指定docker容器的ip地址,必須要在none模式下才可以
docker run -itd --net=none --name n-centos centos /bin/bash
None模式下生成的容器必須經(jīng)過(guò)手工配置后才可以上網(wǎng)。
3.5 用戶(hù)自定義模式
用戶(hù)自定義模式主要可選的有三種網(wǎng)絡(luò)驅(qū)動(dòng):bridge、overlay、macvlan。bridge驅(qū)動(dòng)用于創(chuàng)建類(lèi)似于前面提到的bridge網(wǎng)絡(luò);overlay和macvlan驅(qū)動(dòng)用于創(chuàng)建跨主機(jī)的網(wǎng)絡(luò),本例中我們使用Flannel和etcd使用overlay技術(shù)實(shí)現(xiàn)docker跨物理機(jī)通信。
Flannel實(shí)現(xiàn)的容器的跨主機(jī)通信通過(guò)如下過(guò)程實(shí)現(xiàn):
在etcd中規(guī)劃配置所有主機(jī)的docker0子網(wǎng)范圍;每個(gè)主機(jī)上的flanneld根據(jù)etcd中的配置,為本主機(jī)的docker0分配子網(wǎng),保證所有主機(jī)上的docker0網(wǎng)段不重復(fù),并將結(jié)果(即本主機(jī)上的docker0子網(wǎng)信息和本主機(jī)IP的對(duì)應(yīng)關(guān)系)存入etcd庫(kù)中,這樣etcd庫(kù)中就保存了所有主機(jī)上的docker子網(wǎng)信息和本主機(jī)IP的對(duì)應(yīng)關(guān)系;當(dāng)需要與其他主機(jī)上的容器進(jìn)行通信時(shí),查找etcd數(shù)據(jù)庫(kù),找到目的容器的子網(wǎng)所對(duì)應(yīng)的outip(目的宿主機(jī)的IP),將原始數(shù)據(jù)包封裝在VXLAN或UDP數(shù)據(jù)包中,IP層以outip為目的IP進(jìn)行封裝;由于目的IP是宿主機(jī)IP,因此路由是可達(dá)的,VXLAN或UDP數(shù)據(jù)包到達(dá)目的宿主機(jī)解封裝,解出原始數(shù)據(jù)包,最終到達(dá)目的容器。
(圖片摘自網(wǎng)絡(luò))
實(shí)驗(yàn)規(guī)劃
Node1節(jié)點(diǎn)安裝etcd步驟如下
1、安裝etcd程序
yum install -y etcd2、修改etcd配置文件,配置文件在/etc/etcd/etcd.conf,本實(shí)驗(yàn)etcd單機(jī)部署,群集配置部分沒(méi)有做嚴(yán)格更改。配置如下:
#[Member]#ETCD_CORS=""ETCD_DATA_DIR="/var/lib/etcd/host129.etcd" #etcd數(shù)據(jù)保存目錄#ETCD_WAL_DIR=""#ETCD_LISTEN_PEER_URLS=http://192.168.32.129:2380 #集群內(nèi)部通信使用的URLETCD_LISTEN_CLIENT_URLS=http://127.0.0.1:2379,http://192.168.32.129:2379 #供外部客戶(hù)端使用的URL#ETCD_MAX_SNAPSHOTS="5"#ETCD_MAX_WALS="5"ETCD_NAME="host129" #etcd實(shí)例名稱(chēng)3、設(shè)置后期分給docker容器的網(wǎng)段
etcdctl mk /network/config '{"Network":"172.18.0.0/16", "SubnetMin": "172.18.1.0", "SubnetMax": "172.18.254.0"}'4、設(shè)置開(kāi)機(jī)啟動(dòng)etcd服務(wù)并啟動(dòng)該服務(wù)
systemctl enable etcdsystemctl start etcdNode2節(jié)點(diǎn)安裝etcd步驟如下
1、安裝Docker和Flannel服務(wù)
yum install -y docker flannel2、修改Flannel配置文件如下
Flanneld configuration options# etcd url location. Point this to the server where etcd runsFLANNEL_ETCD_ENDPOINTS="http://192.168.32.129:2379" ##設(shè)置etcd地址和端口信息# etcd config key. This is the configuration key that flannel queries# For address range assignmentFLANNEL_ETCD_PREFIX="/network"# Any additional options that you want to passFLANNEL_OPTIONS="-iface=ens33" ##設(shè)置Flannel與etcd通訊網(wǎng)卡3、設(shè)置啟動(dòng)參數(shù)
cd /usr/libexec/flannel/ ./mk-docker-opts.sh –i4、啟動(dòng)Docker和Flannel服務(wù)
systemctl enable docker flanneldsystemctl start docker flannel5、開(kāi)啟宿主機(jī)轉(zhuǎn)發(fā)功能{一定要打開(kāi),很多網(wǎng)上教程都沒(méi)有提這個(gè),造成無(wú)法聯(lián)通}
iptables -PFORWARD ACCEPT6、創(chuàng)建容器并進(jìn)入容器,查看IP
docker run -itd centos /bin/bashdocker ps –adocker attach 6c在Node2節(jié)點(diǎn)上的操作同樣在Node3執(zhí)行一遍,最終看到Node3的獲取的IP如圖:
測(cè)試容器
Node2和node3上的容器是可以互相訪問(wèn)
宿主機(jī)上生成了到各個(gè)node的路由條目
上述方式可以實(shí)現(xiàn)跨主機(jī)的docker通訊,除此之外還有其他兩種方式:
-
在宿主機(jī)上添加到其他主機(jī)容器的靜態(tài)路由方式
- 橋接方式
這兩種方式都比較好理解,參考網(wǎng)絡(luò)摘抄的兩張圖片
原文鏈接:https://www.cnblogs.com/yy-cxd/p/6553624.html
靜態(tài)路由方法:
橋接方法:
四、關(guān)于Docker的常用概念和命令總結(jié)
4.1 Docker 鏡像
我們都知道,操作系統(tǒng)分為內(nèi)核和用戶(hù)空間。對(duì)于 Linux 而言,內(nèi)核啟動(dòng)后,會(huì)掛載 root 文件系統(tǒng)為其提供用戶(hù)空間支持。而 Docker 鏡像(Image),就相當(dāng)于是一個(gè) root 文件系統(tǒng)。比如官方鏡像 ubuntu:16.04 就包含了完整的一套 Ubuntu 16.04 最小系統(tǒng)的 root 文件系統(tǒng)。
4.2 Docker 容器
鏡像(Image)和容器(Container)的關(guān)系,就像是面向?qū)ο蟪绦蛟O(shè)計(jì)中的 類(lèi) 和 實(shí)例 一樣,鏡像是靜態(tài)的定義,容器是鏡像運(yùn)行時(shí)的實(shí)體。容器可以被創(chuàng)建、啟動(dòng)、停止、刪除、暫停等。
4.3 Docker Registry
鏡像構(gòu)建完成后,可以很容易的在當(dāng)前宿主機(jī)上運(yùn)行,但是,如果需要在其它服務(wù)器上使用這個(gè)鏡像,我們就需要一個(gè)集中的存儲(chǔ)、分發(fā)鏡像的服務(wù),Docker Registry 就是這樣的服務(wù)。
有公有,有私有。
鏡像管理命令
1) 獲取鏡像
從 Docker 鏡像倉(cāng)庫(kù)獲取鏡像的命令是 docker pull。其命令格式為:
docker pull [選項(xiàng)] [Docker Registry 地址[:端口號(hào)]/]倉(cāng)庫(kù)名[:標(biāo)簽]命令參考 docker pull ubuntu:16.04
不指定tag默認(rèn)就是下載最新的
docker pull mirrors.aliyun.com:ubuntu 從阿里云倉(cāng)庫(kù)
2) 列出鏡像
docker image ls列表包含了 倉(cāng)庫(kù)名、標(biāo)簽、鏡像 ID、創(chuàng)建時(shí)間 以及 所占用的空間。
3) 刪除鏡像
docker rmi 鏡像Id 刪除鏡像文件
docker rmi -f 鏡像ID強(qiáng)制刪除鏡像
4) 容器管理
docker create 創(chuàng)建不啟動(dòng)
docker start啟動(dòng)容器
docker stop 容器名稱(chēng) 終止容器
docker restart 容器名稱(chēng)重啟容器
docker rm id 刪除容器
docker run -it centos /bin/sh 創(chuàng)建并啟動(dòng)容器 exit后容器自動(dòng)退出,若想以守護(hù)進(jìn)程方式繼續(xù)運(yùn)行,需要改為docker run -itd centos /bin/sh
docker ps 查看運(yùn)行中的容器
docker ps –a 查看所有容器,包含停止的容器。
5) 進(jìn)入容器
docker attch 名字進(jìn)入容器
docker exec -it``` 容器```id command | docker exec -it 7813e41ec005 /bin/sh6) 導(dǎo)出容器至文件
docker export -o test_for_run_tar 容器ID
或 docker export 容器ID >test_for_stop_tar
7) 導(dǎo)入文件變成鏡像
docker import test_for_run_tar - test/ubuntu:v1.0
8) 數(shù)據(jù)管理
a)數(shù)據(jù)卷是一個(gè)可供容器使用的特殊目錄,將操作系統(tǒng)的目錄映射到容器
docker run -d -P --name web -v /src/webapp:/opt/webapp centos /bin/sh
掛載主機(jī)的/src/webapp到容器的/opt/webapp目錄,默認(rèn)可讀寫(xiě)
docker run -d -P --name web -v /src/webapp:/opt/webapp:ro centos /bin/sh只讀模式b)數(shù)據(jù)卷容器,可供其他容器共享使用的容器
先建立一個(gè)數(shù)據(jù)卷容器
root@localhost /]# docker run -it -v /cunchu --name chuchurongqi centos[root@90bd63b06074 /]# lsbin 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新建一個(gè)其他容器,使用--volumes-from 數(shù)據(jù)卷容器名字實(shí)現(xiàn)掛載容器卷里面的數(shù)據(jù)卷。
[root@localhost /]# docker run -it --volumes-from chuchurongqi --name db2 centos作者:網(wǎng)絡(luò)安全-王志強(qiáng)
原文首發(fā)于:宜信安全應(yīng)急響應(yīng)中心
來(lái)源:宜信技術(shù)學(xué)院
轉(zhuǎn)載于:https://blog.51cto.com/14159827/2397193
總結(jié)
以上是生活随笔為你收集整理的初学Docker容器网络不得不看的学习笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 简单搞定linux逻辑卷
- 下一篇: 7_12_2013 G: Mahjong