




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、項(xiàng)目5 容器相關(guān)技術(shù)通過本章了解Docker容器相關(guān)技術(shù),底層技術(shù),Docker 內(nèi)部以及容器之間管理數(shù)據(jù),網(wǎng)絡(luò)功能,Docker API,安全。目錄任務(wù)5.1 Docker底層技術(shù)任務(wù)5.2 存儲(chǔ)任務(wù)5.3 網(wǎng)絡(luò)任務(wù)5.4 Docker API任務(wù)5.5.安全任務(wù)5.1 Docker底層技術(shù) Docker 底層使用的核心技術(shù)包括 Linux 上的命名空間(Namespaces)控制組(Control groups)聯(lián)合文件系統(tǒng)(Union file systems)和容器格式(Container format)。圖5.1 虛擬機(jī)技術(shù)與容器技術(shù)的對(duì)比5.1.1 命名空間nameSpace 命名
2、空間是 Linux 內(nèi)核一個(gè)強(qiáng)大的特性。每個(gè)容器都有自己單獨(dú)的命名空間,運(yùn)行在其中的應(yīng)用都像獨(dú)立的操作系統(tǒng)中運(yùn)行一樣。命名空間保證了容器之間彼此互不影響。Linux內(nèi)核提供了六種namespace隔離的系統(tǒng)調(diào)用,如下表所示。Namespace系統(tǒng)調(diào)用參數(shù)隔離內(nèi)容UTSCLONE_NEWUTS主機(jī)名與域名IPCCLONE_NEWIPC信號(hào)量、消息隊(duì)列和共享內(nèi)存PIDCLONE_NEWPID進(jìn)程編號(hào)NetworkCLONE_NEWNET網(wǎng)絡(luò)設(shè)備、網(wǎng)絡(luò)棧、端口等等MountCLONE_NEWNS掛載點(diǎn)(文件系統(tǒng))UserCLONE_NEWUSER用戶和用戶組表5.1 namespace六項(xiàng)隔離5.1
3、.2控制組cgroupcgroups是Linux內(nèi)核提供的一種機(jī)制,cgroup可以根據(jù)特定的行為,把一系列系統(tǒng)任務(wù)及其子任務(wù)整合或分隔到不同的資源等級(jí)分組中,從而為系統(tǒng)資源管理提供一個(gè)統(tǒng)一的框架。主要的功能包括:資源限制(Resource Limitation):cgroups可以對(duì)進(jìn)程組使用的資源總額進(jìn)行限制。如設(shè)定應(yīng)用運(yùn)行時(shí)使用內(nèi)存的上限,一旦超過這個(gè)配額就發(fā)出OOM(Out of Memory)。優(yōu)先級(jí)分配(Prioritization):通過分配的CPU時(shí)間片數(shù)量及硬盤IO帶寬大小,實(shí)際上就相當(dāng)于控制了進(jìn)程運(yùn)行的優(yōu)先級(jí)。資源統(tǒng)計(jì)(Accounting): cgroups可以統(tǒng)計(jì)系統(tǒng)的
4、資源使用量,如CPU使用時(shí)長、內(nèi)存用量等等,這個(gè)功能非常適用于計(jì)費(fèi)。進(jìn)程控制(Control):cgroups可以對(duì)進(jìn)程組執(zhí)行掛起、恢復(fù)等操作。 通俗的來說,cgroups可以限制、記錄、隔離進(jìn)程組所使用的物理資源(包括:CPU、memory、IO等),為容器實(shí)現(xiàn)虛擬化提供了基本保證,是構(gòu)建Docker等一系列虛擬化管理工具的基礎(chǔ)。Cgroup功能實(shí)現(xiàn)特點(diǎn):(1)cgroups的API以一個(gè)偽文件系統(tǒng)的方式實(shí)現(xiàn),即用戶可以通過文件操作實(shí)現(xiàn)cgroups的組織管理。(2)cgroups的組織管理操作單元可以細(xì)粒度到線程級(jí)別,用戶態(tài)代碼也可以針對(duì)系統(tǒng)分配的資源創(chuàng)建和銷毀cgroups,從而實(shí)現(xiàn)資源
5、再分配和管理。(3)所有資源管理的功能都以subsystem(子系統(tǒng))的方式實(shí)現(xiàn),接口統(tǒng)一。(4)子進(jìn)程創(chuàng)建之初與其父進(jìn)程處于同一個(gè)cgroups的控制組。5.1.3聯(lián)合文件系統(tǒng)UnionFS聯(lián)合文件系統(tǒng)(UnionFS)是一種分層、輕量級(jí)并且高性能的文件系統(tǒng),它支持對(duì)文件系統(tǒng)的修改按層(Layer)疊加,同時(shí)可以將不同目錄掛載到同一個(gè)虛擬文件系統(tǒng)下。聯(lián)合文件系統(tǒng)是 Docker 鏡像的基礎(chǔ)。鏡像可以通過分層來進(jìn)行繼承,基于基礎(chǔ)鏡像,可以制作各種具體的應(yīng)用鏡像。Aufs是Docker最初采用的文件系統(tǒng),由于Aufs未能加入到Linux內(nèi)核,考慮到兼容性問題,加入了Devicemapper的支持
6、。Docker 目前支持的聯(lián)合文件系統(tǒng)種類包括 Aufs、btrfs、vfs和DeviceMapper。典型的Linux文件系統(tǒng)由bootfs和rootfs兩部分組成,bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引導(dǎo)加載kernel,當(dāng)kernel被加載到內(nèi)存中后bootfs就被umount了。rootfs (root file system)包含的就是典型 Linux 系統(tǒng)中的/dev,/proc,/bin,/etc等標(biāo)準(zhǔn)目錄和文件。 Docker鏡像的典型結(jié)構(gòu)如右圖。傳統(tǒng)的Linux加載bootfs時(shí)會(huì)先將rootf
7、s設(shè)為read-only,然后在系統(tǒng)自檢之后將rootfs從read-only改為read-write,然后就可以在rootfs上進(jìn)行寫和讀的操作了。為了形象化Docker的鏡像結(jié)構(gòu),docker pull一個(gè)ubuntu:14.04的鏡像,使用docker images -tree查看結(jié)果如下:rootqingze qingze# docker images -treeWarning: -tree is deprecated, it will be removed soon. See usage.511136ea3c5a Virtual Size: 0 B 3b363fd9d7da Virt
8、ual Size: 192.5 MB 607c5d1cca71 Virtual Size: 192.7 MB f62feddc05dc Virtual Size: 192.7 MB 8eaa4ff06b53 Virtual Size: 192.7 MB Tags: ubuntu:14.04因?yàn)槿绻逥ocker版本,docker image不再使用,可以使用“docker history 鏡像ID”來查看。 可以看到Ubuntu的鏡像中有多個(gè)長ID的layer,且以一種樹狀結(jié)構(gòu)繼承下來,如下圖。其中,第n+1層繼承了第n層,并在此基礎(chǔ)上有了自己的內(nèi)容,直觀上的表現(xiàn)就是第n+1層占用磁盤空間增大
9、。并且,不同的鏡像可能會(huì)有相同的父鏡像。例如,圖中Tomcat和Nginx 繼承于同一個(gè)Vim 鏡像,這種組織方式起到共享的作用,節(jié)約了鏡像在物理機(jī)上占用的空間。 使用docker save命令保存鏡像tar,查詢其結(jié)構(gòu)。rootqingze qingze# docker save -o ubuntu.tar ubuntu:14.04rootqingze qingze# tar -tf ubuntu.tar 3b363fd9d7dab4db9591058a3f43e806f6fa6f7e2744b63b2df4b84eadb0685a/3b363fd9d7dab4db9591058a3f43e
10、806f6fa6f7e2744b63b2df4b84eadb0685a/VERSION3b363fd9d7dab4db9591058a3f43e806f6fa6f7e2744b63b2df4b84eadb0685a/json3b363fd9d7dab4db9591058a3f43e806f6fa6f7e2744b63b2df4b84eadb0685a/layer.tar511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158/511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba
11、7d4d2698e22c158/VERSION511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158/json511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158/layer.tar607c5d1cca71dd3b6c04327c3903363079b72ab3e5e4289d74fb00a9ac7ec2aa/607c5d1cca71dd3b6c04327c3903363079b72ab3e5e4289d74fb00a9ac7ec2aa/VERS
12、ION607c5d1cca71dd3b6c04327c3903363079b72ab3e5e4289d74fb00a9ac7ec2aa/json607c5d1cca71dd3b6c04327c3903363079b72ab3e5e4289d74fb00a9ac7ec2aa/layer.tar8eaa4ff06b53ff7730c4d7a7e21b4426a4b46dee064ca2d5d90d757dc7ea040a/8eaa4ff06b53ff7730c4d7a7e21b4426a4b46dee064ca2d5d90d757dc7ea040a/VERSION8eaa4ff06b53ff773
13、0c4d7a7e21b4426a4b46dee064ca2d5d90d757dc7ea040a/json8eaa4ff06b53ff7730c4d7a7e21b4426a4b46dee064ca2d5d90d757dc7ea040a/layer.tarf62feddc05dc67da9b725361f97d7ae72a32e355ce1585f9a60d090289120f73/f62feddc05dc67da9b725361f97d7ae72a32e355ce1585f9a60d090289120f73/VERSIONf62feddc05dc67da9b725361f97d7ae72a32e
14、355ce1585f9a60d090289120f73/jsonf62feddc05dc67da9b725361f97d7ae72a32e355ce1585f9a60d090289120f73/layer.tarrepositories5.1.4 容器管理 1)Libcontainer在2013年Docker剛發(fā)布的時(shí)候,它是一款基于LXC的開源容器管理引擎。隨著Docker的不斷發(fā)展,它開始有了更為遠(yuǎn)大的目標(biāo),將底層實(shí)現(xiàn)都抽象化到Libcontainer的接口。這就意味著,底層容器的實(shí)現(xiàn)方式變成了一種可變的方案,無論是使用namespace、cgroups技術(shù)或是使用systemd等其他方案
15、,只要實(shí)現(xiàn)了Libcontainer定義的一組接口,Docker都可以運(yùn)行。這也為Docker實(shí)現(xiàn)全面的跨平臺(tái)帶來了可能。Libcontainer功能實(shí)現(xiàn)上涵蓋了包括namespaces使用、cgroups管理、Rootfs的配置啟動(dòng)、默認(rèn)的Linux capability權(quán)限集、以及進(jìn)程運(yùn)行的環(huán)境變量配置。本身主要分為三大塊工作內(nèi)容,一是容器的創(chuàng)建及初始化,二是容器生命周期管理,三則是進(jìn)程管理,調(diào)用方為Docker的execdriver。容器的監(jiān)控主要通過cgroups的狀態(tài)統(tǒng)計(jì)信息,未來會(huì)加入進(jìn)程追蹤等更豐富的功能。另一方面,Libcontainer在安全支持方面也為用戶盡可能多的提供了支
16、持和選擇。2)runCLinux基金會(huì)于2015年6月成立OCI(Open Container Initiative)組織,旨在圍繞容器格式和運(yùn)行時(shí)制定一個(gè)開放的工業(yè)化標(biāo)準(zhǔn)。OCI的目標(biāo)是為了避免容器的生態(tài)分裂為“小生態(tài)王國”,確保一個(gè)引擎上構(gòu)建的容器可以運(yùn)行在其他引擎之上。這是實(shí)現(xiàn)容器可移植性至關(guān)重要的部分。該組織一成立便得到了包括谷歌、微軟、亞馬遜、華為等一系列云計(jì)算廠商的支持。3)containerd2016年12月Docker 將Docker Engine 中的核心元件Containerd 開源,作為一個(gè)獨(dú)立的開源項(xiàng)目獨(dú)立發(fā)展,目標(biāo)是提供一個(gè)更加開放、穩(wěn)定的容器運(yùn)行基礎(chǔ)設(shè)施。Conta
17、inerd可以說是Docker 引擎的引擎(Runtime)。和包含在Docker Engine里containerd相比,獨(dú)立的containerd將具有更多的功能,可以涵蓋整個(gè)容器運(yùn)行時(shí)管理的所有需求。Containerd面向運(yùn)維人員而構(gòu)建,目的構(gòu)建工業(yè)級(jí)規(guī)模的Docker系統(tǒng),在性能上進(jìn)行了優(yōu)化,Containerd利用runC來提供高級(jí)功能,比如熱遷移(checkpoint & restore)seccomp以及用戶命名空間支持,這將為Docker引入這些功能敞開大門。containerd的功能和架構(gòu)如下:Containerd分三層,最上層為API,包括GRPC API(Go RPC)
18、和Metrics API。中間層為內(nèi)部子系統(tǒng),包括三個(gè):(1)Distribution: 和Docker Registry打交道,拉取鏡像(2)Bundle: 管理本地磁盤上面鏡像的子系統(tǒng)。(3)Runtime:創(chuàng)建容器、管理容器的子系統(tǒng)。最下面為功能組件包括內(nèi)容、元數(shù)據(jù)、快照、執(zhí)行器和監(jiān)控器。任務(wù)5.2 存儲(chǔ)下面介紹Docker 內(nèi)部以及容器之間管理數(shù)據(jù)。在容器中管理數(shù)據(jù)主要有兩種方式。(1)數(shù)據(jù)卷(2)數(shù)據(jù)卷容器5.2.1 數(shù)據(jù)卷1)數(shù)據(jù)卷(Data volumes)。數(shù)據(jù)卷是一個(gè)可供一個(gè)或多個(gè)容器使用的特殊目錄,它繞過UFS,可以提供很多有用的特性:(1)數(shù)據(jù)卷可以在容器之間共享和重用。
19、(2)對(duì)數(shù)據(jù)卷的修改會(huì)立馬生效。(3)對(duì)數(shù)據(jù)卷的更新,不會(huì)影響鏡像(4)數(shù)據(jù)卷默認(rèn)會(huì)一直存在,即使容器被刪除。數(shù)據(jù)卷的使用,類似于Linux下對(duì)目錄或文件進(jìn)行mount,鏡像中的被指定為掛載點(diǎn)的目錄中的文件會(huì)隱藏掉,能顯示看到的是掛載的數(shù)據(jù)卷。2)創(chuàng)建一個(gè)數(shù)據(jù)卷在用 docker run 命令的時(shí)候,使用 -v 標(biāo)記來創(chuàng)建一個(gè)數(shù)據(jù)卷并掛載到容器里。在一次 run 中多次使用可以掛載多個(gè)數(shù)據(jù)卷。下面創(chuàng)建一個(gè)名為 web 的容器,并加載一個(gè)數(shù)據(jù)卷到容器的/webapp 目錄。$ sudo docker run -d -P -name web -v /webapp training/webapp p
20、ython app.py可以在Dockerfile中使用 VOLUME 來添加一個(gè)或者多個(gè)新的卷到由該鏡像創(chuàng)建的任意容器。3)刪除數(shù)據(jù)卷數(shù)據(jù)卷是被設(shè)計(jì)用來持久化數(shù)據(jù)的,它的生命周期獨(dú)立于容器,Docker不會(huì)在容器被刪除后自動(dòng)刪除數(shù)據(jù)卷,并且也不存在垃圾回收這樣的機(jī)制來處理沒有任何容器引用的數(shù)據(jù)卷。如果需要在刪除容器的同時(shí)移除數(shù)據(jù)卷。可以在刪除容器的時(shí)候使用 docker rm -v 這個(gè)命令。4)掛載一個(gè)主機(jī)目錄作為數(shù)據(jù)卷使用 -v 標(biāo)記也可以指定掛載一個(gè)本地主機(jī)的目錄到容器中去。$ sudo docker run -d -P -name web -v /src/webapp:/opt/we
21、bapp training/webapp python app.py上面的命令加載主機(jī)的/src/webapp 目錄到容器的/opt/webapp 目錄。這個(gè)功能在進(jìn)行測(cè)試的時(shí)候十分方便,比如用戶可以放置一些程序到本地目錄中,來查看容器是否正常工作。本地目錄的路徑必須是絕對(duì)路徑,如果目錄不存在Docker 會(huì)自動(dòng)為你創(chuàng)建它。Docker 掛載數(shù)據(jù)卷的默認(rèn)權(quán)限是讀寫,用戶也可以通過:ro 指定為只讀。$ sudo docker run -d -P -name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py5)查看數(shù)據(jù)
22、卷的具體信息在主機(jī)里使用以下命令可以查看指定容器的信息,在輸出的內(nèi)容中找到其中和數(shù)據(jù)卷相關(guān)的部分,可以看到所有的數(shù)據(jù)卷都是創(chuàng)建在主機(jī)的/var/lib/docker/volumes/下面的$ docker inspect web.Volumes: /webapp: /var/lib/docker/volumes/fac362.80535,VolumesRW: /webapp: true.6)掛載一個(gè)本地主機(jī)文件作為數(shù)據(jù)卷-v 標(biāo)記也可以從主機(jī)掛載單個(gè)文件到容器中$ sudo docker run -rm -it -v /.bash_history:/.bash_history ubuntu /
23、bin/bash這樣就可以記錄在容器輸入過的命令了。如果直接掛載一個(gè)文件,很多文件編輯工具,包括 vi 或者 sed -in-place,可能會(huì)造成文件 inode 的改變,所以最簡單的辦法就直接掛載文件的父目錄。5.2.2 數(shù)據(jù)卷容器數(shù)據(jù)卷容器(Data volume containers)涉及容器間共享的持久化、序列化的數(shù)據(jù)持久性的數(shù)據(jù),最好創(chuàng)建數(shù)據(jù)卷容器。1)創(chuàng)建數(shù)據(jù)卷容器。(1)首先,創(chuàng)建一個(gè)名為 dbdata 的數(shù)據(jù)卷容器:$ sudo docker run -d -v /dbdata -name dbdata training/postgres echo Data-only con
24、tainer for postgres(2)然后,在其他容器中使用-volumes-from 來掛載 dbdata 容器中的數(shù)據(jù)卷。$ sudo docker run -d -volumes-from dbdata -name db1 training/postgres$ sudo docker run -d -volumes-from dbdata -name db2 training/postgres(3)可以使用超過一個(gè)的 -volumes-from 參數(shù)來指定從多個(gè)容器掛載不同的數(shù)據(jù)卷。 也可以從其他已經(jīng)掛載了數(shù)據(jù)卷的容器來級(jí)聯(lián)掛載數(shù)據(jù)卷。$ sudo docker run -d -n
25、ame db3 -volumes-from db1 training/postgres2)利用數(shù)據(jù)卷容器來備份、恢復(fù)、遷移數(shù)據(jù)卷??梢岳脭?shù)據(jù)卷對(duì)其中的數(shù)據(jù)進(jìn)行進(jìn)行備份、恢復(fù)和遷移。(1)備份:首先使用 -volumes-from 標(biāo)記來創(chuàng)建一個(gè)加載 dbdata 容器卷的容器,并從主機(jī)掛載當(dāng)前目錄到容器的 /backup 目錄。命令如下:$ sudo docker run -volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata容器啟動(dòng)后,使用了tar 命令來將dbdata 卷備份為容器中
26、 /backup/backup.tar 文件,也就是主機(jī)當(dāng)前目錄下的名為 backup.tar 的文件。(2)恢復(fù):如果要恢復(fù)數(shù)據(jù)到一個(gè)容器,首先創(chuàng)建一個(gè)帶有空數(shù)據(jù)卷的容器dbdata2。$ sudo docker run -v /dbdata -name dbdata2 ubuntu /bin/bash然后創(chuàng)建另一個(gè)容器,掛載 dbdata2 容器卷中的數(shù)據(jù)卷,并使用untar 解壓備份文件到掛載的容器卷中。$ sudo docker run -volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf/backup/backup.tar為了
27、查看/驗(yàn)證恢復(fù)的數(shù)據(jù),可以再啟動(dòng)一個(gè)容器掛載同樣的容器卷來查看$ sudo docker run -volumes-from dbdata2 busybox /bin/ls /dbdata5.3.1 Docker網(wǎng)絡(luò)功能介紹1)容器網(wǎng)絡(luò)Docker 的網(wǎng)絡(luò)實(shí)現(xiàn)其實(shí)就是利用了 Linux 上的網(wǎng)絡(luò)命名空間、網(wǎng)橋和虛擬網(wǎng)絡(luò)設(shè)備(VETH)等實(shí)現(xiàn)。默認(rèn)Docker安裝完成后會(huì)創(chuàng)建一個(gè)網(wǎng)橋docker0。Docker中的網(wǎng)絡(luò)接口默認(rèn)都是虛擬的網(wǎng)絡(luò)接口。Docker 容器網(wǎng)絡(luò)在本地主機(jī)和容器內(nèi)分別創(chuàng)建一個(gè)虛擬接口,并讓它們彼此連通。Docker 創(chuàng)建一個(gè)容器執(zhí)行如下操作:(1)創(chuàng)建一對(duì)虛擬接口,分別放到
28、本地主機(jī)和新容器中;(2)本地主機(jī)一端橋接到默認(rèn)的docker0或指定網(wǎng)橋上,并具有一個(gè)唯一的名字,如veth65f9;(3)容器一端放到新容器中,并修改名字作為eth0,這個(gè)接口只在容器的命名空間可見;(4)從網(wǎng)橋可用地址段中獲取一個(gè)空閑地址IP分配給容器的 eth0,并配置默認(rèn)路由到橋接網(wǎng)卡veth65f9。(5)完成這些之后,容器就可以使用eth0虛擬網(wǎng)卡來連接其他容器和其他網(wǎng)絡(luò)。另外,可以在docker run的時(shí)候通過-net參數(shù)來指定容器的網(wǎng)絡(luò)配置,有4個(gè)可選值:-net=bridge 這個(gè)是默認(rèn)值,連接到默認(rèn)的網(wǎng)橋。-net=host 告訴 Docker 不要將容器網(wǎng)絡(luò)放到隔離的
29、命名空間中,使用本地主機(jī)的網(wǎng)絡(luò),它擁有完全的本地主機(jī)接口訪問權(quán)限。容器進(jìn)程可以跟主機(jī)其它root進(jìn)程一樣可以打開低范圍的端口機(jī)。因此使用這個(gè)選項(xiàng)的時(shí)候要非常小心。如果進(jìn)一步的使用 -privileged=true,容器會(huì)被允許直接配置主機(jī)的網(wǎng)絡(luò)堆棧。-net=container:NAME_or_ID 讓 Docker 將新建容器的進(jìn)程放到一個(gè)已存在容器的網(wǎng)絡(luò)棧中,新容器進(jìn)程有自己的文件系統(tǒng)、進(jìn)程列表和資源限制,但會(huì)和已存在的容器共享 IP 地址和端口等網(wǎng)絡(luò)資源,兩者進(jìn)程可以直接通過 lo 環(huán)回接口通信。-net=none 讓 Docker 將新容器放到隔離的網(wǎng)絡(luò)棧中,但是不進(jìn)行網(wǎng)絡(luò)配置。之后,
30、用戶可以自己進(jìn)行配置。當(dāng)容器結(jié)束后,Docker 會(huì)清空容器,容器內(nèi)的 eth0 會(huì)隨網(wǎng)絡(luò)命名空間一起被清除,A 接口也被自動(dòng)從 docker0 卸載。圖5.7 Docker 容器網(wǎng)絡(luò)示意圖2)網(wǎng)絡(luò)配置細(xì)節(jié)用戶使用 -net=none 后,可以自行配置網(wǎng)絡(luò),讓容器達(dá)到跟平常一樣具有訪問網(wǎng)絡(luò)的權(quán)限。通過這個(gè)過程,可以了解 Docker 配置網(wǎng)絡(luò)的細(xì)節(jié)。(1)首先,啟動(dòng)一個(gè) /bin/bash 容器,指定 -net=none 參數(shù)。$ sudo docker run -i -t -rm -net=none base /bin/bashroot63f36fc01b5f:/#(2)在本地主機(jī)查找容器的
31、進(jìn)程 id,并為它創(chuàng)建網(wǎng)絡(luò)命名空間。$ sudo docker inspect -f .State.Pid 63f36fc01b5f2778$ pid=2778$ sudo mkdir -p /var/run/netns$ sudo ln -s /proc/$pid/ns/net /var/run/netns/$pid(3)檢查橋接網(wǎng)卡的 IP 和子網(wǎng)掩碼信息。$ ip addr show docker021: docker0: .inet /16 scope global docker0.(4)創(chuàng)建一對(duì) “veth pair” 接口 A 和 B,綁定 A 到網(wǎng)橋 docker0,并啟用它$
32、sudo ip link add A type veth peer name B$ sudo brctl addif docker0 A$ sudo ip link set A up(5)將B放到容器的網(wǎng)絡(luò)命名空間,命名為 eth0,啟動(dòng)它并配置一個(gè)可用 IP(橋接網(wǎng)段)和默認(rèn)網(wǎng)關(guān)。$ sudo ip link set B netns $pid$ sudo ip netns exec $pid ip link set dev B name eth0$ sudo ip netns exec $pid ip link set eth0 up$ sudo ip netns exec $pid ip
33、addr add 9/16 dev eth0$ sudo ip netns exec $pid ip route add default via 以上,就是 Docker 配置網(wǎng)絡(luò)的具體過程。3)外部訪問容器,端口映射容器中可以運(yùn)行一些網(wǎng)絡(luò)應(yīng)用,要讓外部也可以訪問這些應(yīng)用,可以通過 -P 或 -p 參數(shù)來指定端口映射。(1)查看端口信息當(dāng)使用 -P 標(biāo)記時(shí),Docker 會(huì)隨機(jī)映射一個(gè) 4900049900 的端口到內(nèi)部容器開放的網(wǎng)絡(luò)端口。使用 docker ps 可以看到,本地主機(jī)的 49155 被映射到了容器的 5000 端口。此時(shí)訪問本機(jī)的 49155 端口即可訪問容器內(nèi) web 應(yīng)用提
34、供的界面。$ sudo docker run -d -P training/webapp python app.py$ sudo docker ps -lCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESbc533791f3f5 training/webapp:latest python app.py 5 seconds ago Up 2 seconds :49155-5000/tcp nostalgic_morse同樣的,可以通過 docker logs 命令來查看應(yīng)用的信息。$ sudo docker logs -f nostalgi
35、c_morse* Running on :5000/ - - 23/May/2014 20:16:31 GET / HTTP/1.1 200 - - - 23/May/2014 20:16:31 GET /favicon.ico HTTP/1.1 404 - -p(小寫的)則可以指定要映射的端口,并且,在一個(gè)指定端口上只可以綁定一個(gè)容器。支持的格式有ip:hostPort:containerPort | ip:containerPort | hostPort:containerPort。(2)映射所有接口地址使用 hostPort:containerPort 格式本地的 5000 端口映射到容
36、器的 5000 端口,可以執(zhí)行$ sudo docker run -d -p 5000:5000 training/webapp python app.py此時(shí)默認(rèn)會(huì)綁定本地所有接口上的所有地址。(3) 映射到指定地址的指定端口可以使用 ip:hostPort:containerPort 格式指定映射使用一個(gè)特定地址,比如 localhost 地址 $ sudo docker run -d -p :5000:5000 training/webapp python app.py(4)映射到指定地址的任意端口使用 ip:containerPort 綁定 localhost 的任意端口到容器的 50
37、00 端口,本地主機(jī)會(huì)自動(dòng)分配一個(gè)端口。$ sudo docker run -d -p :5000 training/webapp python app.py還可以使用 udp 標(biāo)記來指定 udp 端口$ sudo docker run -d -p :5000:5000/udp training/webapp python app.py(5)查看映射端口配置使用 docker port 來查看當(dāng)前映射的端口配置,也可以查看到綁定的地址$ docker port nostalgic_morse 5000:49155.容器有自己的內(nèi)部網(wǎng)絡(luò)和 ip 地址,-p 標(biāo)記可以多次使用來綁定多個(gè)端口,例如:
38、$ sudo docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py5.3.2 容器互聯(lián)容器的連接(linking)系統(tǒng)是除了端口映射外,另一種跟容器中應(yīng)用交互的方式。該系統(tǒng)會(huì)在源和接收容器之間創(chuàng)建一個(gè)隧道,接收容器可以看到源容器指定的信息。1)自定義容器命名連接系統(tǒng)依據(jù)容器的名稱來執(zhí)行。因此,首先需要自定義一個(gè)好記的容器命名。使用 -name 標(biāo)記可以為容器自定義命名。$ sudo docker run -d -P -name web training/webapp python app.py使用 docker
39、ps 來驗(yàn)證設(shè)定的命名。$ sudo docker ps -lCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESaed84ee21bde training/webapp:latest python app.py 12 hours ago Up 2 seconds :49154-5000/tcp web也可以使用 docker inspect 來查看容器的名字。$ sudo docker inspect -f .Name aed84ee21bde/web注意:容器的名稱是唯一的。如果已經(jīng)命名了一個(gè)叫 web 的容器,當(dāng)你要再次使用 web
40、這個(gè)名稱的時(shí)候,需要先用docker rm 來刪除之前創(chuàng)建的同名容器。在執(zhí)行 docker run 的時(shí)候如果添加 -rm 標(biāo)記,則容器在終止后會(huì)立刻刪除。注意,-rm 和 -d 參數(shù)不能同時(shí)使用。2 )容器互聯(lián)使用 -link 參數(shù)可以讓容器之間安全的進(jìn)行交互。下面先創(chuàng)建一個(gè)新的數(shù)據(jù)庫容器。$ sudo docker run -d -name db training/postgres刪除之前創(chuàng)建的 web 容器$ docker rm -f web然后創(chuàng)建一個(gè)新的 web 容器,并將它連接到 db 容器$ sudo docker run -d -P -name web -link db:db
41、training/webapp python app.py此時(shí),db 容器和 web 容器建立互聯(lián)關(guān)系。-link 參數(shù)的格式為 -link name:alias,其中 name 是要鏈接的容器的名稱,alias 是這個(gè)連接的別名。使用 docker ps 來查看容器的連接$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES349169744e49 training/postgres:latest su postgres -c /usr About a minute ago Up About a minute 5432
42、/tcp db, web/dbaed84ee21bde training/webapp:latest python app.py 16 hours ago Up 2 minutes :49154-5000/tcp web可以看到自定義命名的容器db 和 web,db 容器的 names 列有 db 也有 web/db。這表示 web 容器鏈接到 db 容器,web 容器將被允許訪問 db 容器的信息。Docker 在兩個(gè)互聯(lián)的容器之間創(chuàng)建了一個(gè)安全隧道,而且不用映射它們的端口到宿主主機(jī)上。在啟動(dòng) db 容器的時(shí)候并沒有使用 -p 和 -P標(biāo)記,從而避免了暴露數(shù)據(jù)庫端口到外部網(wǎng)絡(luò)上。Docker
43、 通過 2 種方式為容器公開連接信息:(1)環(huán)境變量使用 env 命令來查看 web 容器的環(huán)境變量$ sudo docker run -rm -name web2 -link db:db training/webapp env. . .DB_NAME=/web2/dbDB_PORT=tcp:/:5432DB_PORT_5000_TCP=tcp:/:5432DB_PORT_5000_TCP_PROTO=tcpDB_PORT_5000_TCP_PORT=5432DB_PORT_5000_TCP_ADDR=. . .其中 DB_ 開頭的環(huán)境變量是供 web 容器連接 db 容器使用,前綴采用大寫的
44、連接別名。(1)除了環(huán)境變量,Docker 還添加 host 信息到父容器的 /etc/hosts 的文件。下面是父容器 web 的 hosts 文件這里有 2 個(gè) hosts,第一個(gè)是 web 容器,web 容器用 id 作為他的主機(jī)名,第二個(gè)是 db 容器的 ip 和主機(jī)名。 可以在 web 容器中安裝 ping 命令來測(cè)試跟db容器的連通。$ sudo docker run -t -i -rm -link db:db training/webapp /bin/bashrootaed84ee21bde:/opt/webapp# cat /etc/hosts aed84ee21bde. .
45、. dbrootaed84ee21bde:/opt/webapp# apt-get install -yqq inetutils-pingrootaed84ee21bde:/opt/webapp# ping dbPING db (): 48 data bytes56 bytes from : icmp_seq=0 ttl=64 time=0.267 ms56 bytes from : icmp_seq=1 ttl=64 time=0.250 ms56 bytes from : icmp_seq=2 ttl=64 time=0.256 ms用 ping 來測(cè)試db容器,它會(huì)解析成 。注意:官方的
46、 ubuntu 鏡像默認(rèn)沒有安裝 ping,需要自行安裝。用戶可以鏈接多個(gè)父容器到子容器,比如可以鏈接多個(gè) web 到 db 容器上。5.3.3 高級(jí)網(wǎng)絡(luò)配置本章將介紹 Docker 的一些高級(jí)網(wǎng)絡(luò)配置和選項(xiàng)。當(dāng) Docker 啟動(dòng)時(shí),會(huì)自動(dòng)在主機(jī)上創(chuàng)建一個(gè) docker0 虛擬網(wǎng)橋,實(shí)際上是 Linux 的一個(gè) bridge,可以理解為一個(gè)軟件交換機(jī)。它會(huì)在掛載到它的網(wǎng)口之間進(jìn)行轉(zhuǎn)發(fā)。同時(shí),Docker 隨機(jī)分配一個(gè)本地未占用的私有網(wǎng)段(在 RFC1918 中定義)中的一個(gè)地址給 docker0 接口。比如典型的 ,掩碼為 。此后啟動(dòng)的容器內(nèi)的網(wǎng)口也會(huì)自動(dòng)分配一個(gè)同一網(wǎng)段(/16)的地址。當(dāng)
47、創(chuàng)建一個(gè) Docker 容器的時(shí)候,同時(shí)會(huì)創(chuàng)建了一對(duì) veth pair 接口(當(dāng)數(shù)據(jù)包發(fā)送到一個(gè)接口時(shí),另外一個(gè)接口也可以收到相同的數(shù)據(jù)包)。這對(duì)接口一端在容器內(nèi),即 eth0;另一端在本地并被掛載到 docker0 網(wǎng)橋,名稱以 veth 開頭(例如 vethAQI2QT)。通過這種方式,主機(jī)可以跟容器通信,容器之間也可以相互通信。Docker 就創(chuàng)建了在主機(jī)和所有容器之間一個(gè)虛擬共享網(wǎng)絡(luò)。接下來的部分將介紹在一些場(chǎng)景中,Docker 所有的網(wǎng)絡(luò)定制配置。以及通過 Linux 命令來調(diào)整、補(bǔ)充、甚至替換 Docker 默認(rèn)的網(wǎng)絡(luò)配置。1)快速配置指南下面是一個(gè)跟 Docker 網(wǎng)絡(luò)相關(guān)的命
48、令列表。其中有些命令選項(xiàng)只有在 Docker 服務(wù)啟動(dòng)的時(shí)候才能配置,而且不能馬上生效。-b BRIDGE or -bridge=BRIDGE -指定容器掛載的網(wǎng)橋-bip=CIDR -定制 docker0 的掩碼-H SOCKET. or -host=SOCKET. -Docker 服務(wù)端接收命令的通道-icc=true|false -是否支持容器之間進(jìn)行通信-ip-forward=true|false -請(qǐng)看下文容器之間的通信-iptables=true|false -是否允許 Docker 添加 iptables 規(guī)則-mtu=BYTES -容器網(wǎng)絡(luò)中的 MTU下面2個(gè)命令選項(xiàng)既可以在啟
49、動(dòng)服務(wù)時(shí)指定,也可以 Docker 容器啟動(dòng)(docker run)時(shí)候指定。在 Docker 服務(wù)啟動(dòng)的時(shí)候指定則會(huì)成為默認(rèn)值,后面執(zhí)行 docker run 時(shí)可以覆蓋設(shè)置的默認(rèn)值。-dns=IP_ADDRESS. -使用指定的DNS服務(wù)器-dns-search=DOMAIN. -指定DNS搜索域最后這些選項(xiàng)只有在 docker run 執(zhí)行時(shí)使用,因?yàn)樗轻槍?duì)容器的特性內(nèi)容。-h HOSTNAME or -hostname=HOSTNAME -配置容器主機(jī)名-link=CONTAINER_NAME:ALIAS -添加到另一個(gè)容器的連接-net=bridge|none|container:
50、NAME_or_ID|host -配置容器的橋接模式-p SPEC or -publish=SPEC -映射容器端口到宿主主機(jī)-P or -publish-all=true|false -映射容器所有端口到宿主主機(jī)2)配置 DNSDocker 沒有為每個(gè)容器專門定制鏡像,那么怎么自定義配置容器的主機(jī)名和 DNS 配置呢?秘訣就是它利用虛擬文件來掛載到來容器的3個(gè)相關(guān)配置文件。在容器中使用 mount 命令可以看到掛載信息:$ mount./dev/disk/by-uuid/1fec.ebdf on /etc/hostname type ext4 ./dev/disk/by-uuid/1fec.
51、ebdf on /etc/hosts type ext4 .tmpfs on /etc/resolv.conf type tmpfs .這種機(jī)制可以讓宿主主機(jī) DNS 信息發(fā)生更新后,所有 Docker 容器的 dns 配置通過 /etc/resolv.conf 文件立刻得到更新。如果用戶想要手動(dòng)指定容器的配置,可以利用下面的選項(xiàng)。-h HOSTNAME or -hostname=HOSTNAME 設(shè)定容器的主機(jī)名,它會(huì)被寫到容器內(nèi)的 /etc/hostname 和 /etc/hosts。但它在容器外部看不到,既不會(huì)在 docker ps 中顯示,也不會(huì)在其他的容器的 /etc/hosts 看
52、到。-link=CONTAINER_NAME:ALIAS 選項(xiàng)會(huì)在創(chuàng)建容器的時(shí)候,添加一個(gè)其他容器的主機(jī)名到 /etc/hosts 文件中,讓新容器的進(jìn)程可以使用主機(jī)名 ALIAS 就可以連接它。-dns=IP_ADDRESS 添加 DNS 服務(wù)器到容器的 /etc/resolv.conf 中,讓容器用這個(gè)服務(wù)器來解析所有不在 /etc/hosts 中的主機(jī)名。-dns-search=DOMAIN 設(shè)定容器的搜索域,當(dāng)設(shè)定搜索域?yàn)?. 時(shí),在搜索一個(gè)名為 host 的主機(jī)時(shí),DNS 不僅搜索host,還會(huì)搜索 。 注意:如果沒有上述最后 2 個(gè)選項(xiàng),Docker 會(huì)默認(rèn)用主機(jī)上的 /etc/r
53、esolv.conf 來配置容器。3)容器訪問控制容器的訪問控制,主要通過 Linux 上的 iptables 防火墻來進(jìn)行管理和實(shí)現(xiàn)。iptables 是 Linux 上默認(rèn)的防火墻軟件,在大部分發(fā)行版中都自帶。(1)容器訪問外部網(wǎng)絡(luò)容器要想訪問外部網(wǎng)絡(luò),需要本地系統(tǒng)的轉(zhuǎn)發(fā)支持。在Linux 系統(tǒng)中,檢查轉(zhuǎn)發(fā)是否打開。$sysctl net.ipv4.ip_forwardnet.ipv4.ip_forward = 1如果為 0,說明沒有開啟轉(zhuǎn)發(fā),則需要手動(dòng)打開。$sysctl -w net.ipv4.ip_forward=1如果在啟動(dòng) Docker 服務(wù)的時(shí)候設(shè)定 -ip-forward=t
54、rue, Docker 就會(huì)自動(dòng)設(shè)定系統(tǒng)的 ip_forward 參數(shù)為 1。(2)容器之間訪問容器之間相互訪問,需要兩方面的支持。容器的網(wǎng)絡(luò)拓?fù)涫欠褚呀?jīng)互聯(lián)。默認(rèn)情況下,所有容器都會(huì)被連接到 docker0 網(wǎng)橋上。本地系統(tǒng)的防火墻軟件 - iptables 是否允許通過。(3)訪問所有端口當(dāng)啟動(dòng) Docker 服務(wù)時(shí)候,默認(rèn)會(huì)添加一條轉(zhuǎn)發(fā)策略到 iptables 的 FORWARD 鏈上。策略為通過(ACCEPT)還是禁止(DROP)取決于配置-icc=true(缺省值)還是 -icc=false。當(dāng)然,如果手動(dòng)指定 -iptables=false 則不會(huì)添加 iptables 規(guī)則??梢?/p>
55、,默認(rèn)情況下,不同容器之間是允許網(wǎng)絡(luò)互通的。如果為了安全考慮,可以在 /etc/default/docker 文件中配置 DOCKER_OPTS=-icc=false 來禁止它。(4)訪問指定端口在通過 -icc=false 關(guān)閉網(wǎng)絡(luò)訪問后,還可以通過 -link=CONTAINER_NAME:ALIAS 選項(xiàng)來訪問容器的開放端口。例如,在啟動(dòng) Docker 服務(wù)時(shí),可以同時(shí)使用 icc=false -iptables=true 參數(shù)來關(guān)閉允許相互的網(wǎng)絡(luò)訪問,并讓 Docker 可以修改系統(tǒng)中的 iptables 規(guī)則。此時(shí),系統(tǒng)中的 iptables 規(guī)則可能是類似$ sudo iptabl
56、es -nL.Chain FORWARD (policy ACCEPT)target prot opt source destinationDROP all - /0 /0.之后,啟動(dòng)容器(docker run)時(shí)使用 -link=CONTAINER_NAME:ALIAS 選項(xiàng)。Docker 會(huì)在 iptable 中為 兩個(gè)容器分別添加一條 ACCEPT 規(guī)則,允許相互訪問開放的端口(取決于 Dockerfile 中的 EXPOSE 行)。當(dāng)添加了 -link=CONTAINER_NAME:ALIAS 選項(xiàng)后,添加了 iptables 規(guī)則。$ sudo iptables -nL.Chain
57、FORWARD (policy ACCEPT)target prot opt source destinationACCEPT tcp - tcp spt:80ACCEPT tcp - tcp dpt:80DROP all - /0 /0注意:-link=CONTAINER_NAME:ALIAS 中的 CONTAINER_NAME 目前必須是 Docker 分配的名字,或使用 -name 參數(shù)指定的名字。主機(jī)名則不會(huì)被識(shí)別。4)映射容器端口到宿主主機(jī)的實(shí)現(xiàn)默認(rèn)情況下,容器可以主動(dòng)訪問到外部網(wǎng)絡(luò)的連接,但是外部網(wǎng)絡(luò)無法訪問到容器。(1)容器訪問外部實(shí)現(xiàn)容器所有到外部網(wǎng)絡(luò)的連接,源地址都會(huì)被NAT
58、成本地系統(tǒng)的IP地址。這是使用 iptables 的源地址偽裝操作實(shí)現(xiàn)的。查看主機(jī)的 NAT 規(guī)則。$ sudo iptables -t nat -nL.Chain POSTROUTING (policy ACCEPT)target prot opt source destinationMASQUERADE all - /16 !/16.其中,上述規(guī)則將所有源地址在 /16 網(wǎng)段,目標(biāo)地址為其他網(wǎng)段(外部網(wǎng)絡(luò))的流量動(dòng)態(tài)偽裝為從系統(tǒng)網(wǎng)卡發(fā)出。MASQUERADE 跟傳統(tǒng) SNAT 的好處是它能動(dòng)態(tài)從網(wǎng)卡獲取地址。(2)外部訪問容器實(shí)現(xiàn)容器允許外部訪問,可以在 docker run 時(shí)候通過 -
59、p 或 -P 參數(shù)來啟用。不管用那種辦法,其實(shí)也是在本地的 iptable 的 nat 表中添加相應(yīng)的規(guī)則。使用 -P 時(shí):$ iptables -t nat -nL.Chain DOCKER (2 references)target prot opt source destinationDNAT tcp - /0 /0 tcp dpt:49153 to:80 使用 -p 80:80 時(shí):$ iptables -t nat -nLChain DOCKER (2 references)target prot opt source destinationDNAT tcp - /0 /0 tcp d
60、pt:80 to:80注意:這里的規(guī)則映射了 ,意味著將接受主機(jī)來自所有接口的流量。用戶可以通過 -p IP:host_port:container_port 或 -p IP:port 來指定允許訪問容器的主機(jī)上的 IP、接口等,以制定更嚴(yán)格的規(guī)則。配置文件 /etc/default/docker 中指定 DOCKER_OPTS=-ip=IP_ADDRESS,之后重啟 Docker 服務(wù)即可生效。5)配置 docker0 網(wǎng)橋Docker 服務(wù)默認(rèn)會(huì)創(chuàng)建一個(gè) docker0 網(wǎng)橋(其上有一個(gè) docker0 內(nèi)部接口),它在內(nèi)核層連通了其他的物理或虛擬網(wǎng)卡,這就將所有容器和本地主機(jī)都放到同一個(gè)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 新員工入職產(chǎn)品手冊(cè)
- 世界地圖集各樣民族故事讀后感
- 企業(yè)風(fēng)險(xiǎn)評(píng)估報(bào)告表
- 企業(yè)員工績效獎(jiǎng)勵(lì)激勵(lì)制度實(shí)施協(xié)議
- 汽車銷售排行榜
- 市場(chǎng)營銷活動(dòng)效果評(píng)估與優(yōu)化實(shí)戰(zhàn)指南
- 環(huán)衛(wèi)公司勞動(dòng)合同書
- 高分子化學(xué)與材料合成考試要點(diǎn)解析
- 中小學(xué)生國學(xué)經(jīng)典故事解讀
- 酒店業(yè)投資經(jīng)營與股權(quán)轉(zhuǎn)讓協(xié)議
- 2025遼寧大連融金征信服務(wù)選聘8人筆試參考題庫附帶答案詳解
- 2025年浙江機(jī)電職業(yè)技術(shù)學(xué)院單招職業(yè)技能測(cè)試題庫含答案
- 2024年鞍山市臺(tái)安農(nóng)業(yè)發(fā)展集團(tuán)有限公司招聘考試真題
- 糖尿病合并胃輕癱護(hù)理查房
- 2025年協(xié)議離婚夫妻模板
- 福建省龍巖市2024-2025學(xué)年九年級(jí)上學(xué)期期末語文試題(解析版)
- 人教版(2024新版)七年級(jí)下冊(cè)生物3.2.1 水的利用與散失 教案
- 2025-2030年中國高爾夫產(chǎn)業(yè)規(guī)模分析及投資前景規(guī)劃研究報(bào)告
- 《中醫(yī)體重管理臨床指南》
- 材料科學(xué)與工程專業(yè) 畢業(yè)論文
- 糖尿病視網(wǎng)膜病變PPT課件
評(píng)論
0/150
提交評(píng)論