摘要:整理自技術(shù)入門與實(shí)踐楊保華戴王劍曹亞侖核心技術(shù)一文。默認(rèn)監(jiān)聽本地的套接字,只允許本地的訪問,但是可以通過選項(xiàng)來修改監(jiān)聽的方式。在交互過程中,如果服務(wù)端未監(jiān)聽到默認(rèn)套接字,則需要客戶端在執(zhí)行命令的時(shí)候顯示指定套接字。
整理自《Docker技術(shù)入門與實(shí)踐》(楊保華 戴王劍 曹亞侖) - Docker核心技術(shù)一文。
Docker是一種基于Linux Container(LXC)技術(shù)實(shí)現(xiàn)的容器虛擬化技術(shù),現(xiàn)又引入libcontainer。從操作系統(tǒng)功能上的角度出發(fā),Docker的核心可分為:Linux操作系統(tǒng)的命名空間(Namespaces)、控制組(Control Groups)、聯(lián)合文件系統(tǒng)(Union File System)、Linux虛擬網(wǎng)絡(luò)。
Docker采用的是標(biāo)準(zhǔn)的C/S架構(gòu),客戶端和服務(wù)端可以運(yùn)行在同一機(jī)器上,也可以通過socket或RESTful API進(jìn)行通信。
服務(wù)端
Docker daemon一般作為服務(wù)端運(yùn)行在宿主機(jī)的后臺(tái),它是一個(gè)非常松耦合的架構(gòu),會(huì)通過專門的Engine模塊來分發(fā)管理來自各個(gè)客戶端的任務(wù),并根據(jù)請(qǐng)求來創(chuàng)建、運(yùn)行、分發(fā)容器。Docker支持通過HTTPS認(rèn)證方式來驗(yàn)證訪問。Docker daemon默認(rèn)監(jiān)聽本地的unix:///var/run/docker.sock套接字,只允許本地的root訪問,但是可以通過-H選項(xiàng)來修改監(jiān)聽的方式。例如Ubuntu系統(tǒng)中,Docker daemon的默認(rèn)啟動(dòng)配置就在/etc/default/docker中。
$ vim /etc/default/docker # Docker Upstart and SysVinit configuration file # # THIS FILE DOES NOT APPLY TO SYSTEMD # # Please see the documentation for "systemd drop-ins": # https://docs.docker.com/engine/articles/systemd/ # # Customize location of Docker binary (especially for development testing). #DOCKER="/usr/local/bin/docker" # Use DOCKER_OPTS to modify the daemon startup options. #DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4" # If you need Docker to use an HTTP proxy, it can also be specified here. #export http_proxy="http://127.0.0.1:3128/" # This is also a handy place to tweak where Docker"s temporary files go. #export TMPDIR="/mnt/bigdrive/docker-tmp"
客戶端
客戶端為用戶提供了一系列可執(zhí)行的命令,從而達(dá)到與Docker daemon交互的目的。同樣的,客戶端則默認(rèn)通過本地的unix:///var/run/docker.sock套接字向服務(wù)端發(fā)送指令。不同的是服務(wù)端會(huì)一直處于監(jiān)聽狀態(tài),而客戶端在發(fā)送指令后等待服務(wù)端返回,一旦收到返回就會(huì)立即執(zhí)行結(jié)束并退出。在交互過程中,如果服務(wù)端未監(jiān)聽到默認(rèn)套接字,則需要客戶端在執(zhí)行命令的時(shí)候顯示指定套接字。如服務(wù)端在監(jiān)聽本地的9527端口,那么如果要查詢Docker的版本信息:sudo docker -H tcp://127.0.0.1:9527 version
命名空間是Linux內(nèi)核為實(shí)現(xiàn)容器虛擬化而引入的特性。每個(gè)容器都有自己的命名空間,這保證了容器之間的互不影響。利用該特性,容器實(shí)現(xiàn)了在內(nèi)核、文件系統(tǒng)、網(wǎng)絡(luò)、PID、UID、IPC、內(nèi)存、硬盤、CPU等資源的隔離,而不再是應(yīng)用進(jìn)程直接共享的狀態(tài)。
進(jìn)程命名空間
Linux通過命名空間管理進(jìn)程號(hào),同一進(jìn)程在不同的命名空間中的進(jìn)程號(hào)是不同的。進(jìn)程命名空間是一個(gè)父子關(guān)系的結(jié)構(gòu),子空間的進(jìn)程可看到父進(jìn)程的ID。
網(wǎng)絡(luò)命名空間
通過網(wǎng)絡(luò)命名空間可以實(shí)現(xiàn)網(wǎng)絡(luò)的完全隔離。一個(gè)網(wǎng)絡(luò)命名空間為進(jìn)程提供了一個(gè)完全獨(dú)立的網(wǎng)絡(luò)協(xié)議棧的視圖。包括網(wǎng)絡(luò)設(shè)備接口、IPv4和IPv6協(xié)議棧、IP路由表、防火墻規(guī)則、sockets等。Docker可采用虛擬網(wǎng)絡(luò)設(shè)備(Virtual Network Device)的方式將不同命名空間的網(wǎng)絡(luò)設(shè)備連接在一起。默認(rèn)情況下,容器的虛擬網(wǎng)卡將與宿主機(jī)的docker0網(wǎng)橋連接在一起。
IPC命名空間
進(jìn)程間交互(Interprocess Communication - IPC)的信息包括信號(hào)量、消息隊(duì)列、共享內(nèi)存等。同一IPC命名空間的進(jìn)程可以交互;否則不行。PID命名空間和IPC命名空間可以組合使用。
掛載命名空間
掛載命名空間可以將一個(gè)進(jìn)程放到一個(gè)特定的目錄執(zhí)行,且允許不同命名空間的進(jìn)程看到的文件結(jié)構(gòu)不同,將各個(gè)命名空間中的進(jìn)程看到的文件目錄隔離。
UTS命名空間
UTS(UNIX Time-sharing System)命名空間可以另每個(gè)容器擁有獨(dú)立的主機(jī)名和域名,從而虛擬出一個(gè)擁有獨(dú)立主機(jī)名和獨(dú)立網(wǎng)絡(luò)空間的環(huán)境。默認(rèn)情況下,Docker容器的主機(jī)名就是容器的ID。
用戶命名空間
每個(gè)容器擁有不同的用戶和組ID,容器可以使用自身內(nèi)部的特定用戶執(zhí)行程序,而非宿主機(jī)系統(tǒng)上存在的用戶。每個(gè)容器內(nèi)部都可以有root賬號(hào),且跟宿主機(jī)不在同一命名空間。
控制組(CGroup)用于對(duì)共享資源進(jìn)行隔離、限制、審計(jì)等??刂品峙涞饺萜鞯馁Y源可避免多個(gè)容器同時(shí)運(yùn)行時(shí)造成的系統(tǒng)資源競(jìng)爭(zhēng)??刂平M的目標(biāo):為不同應(yīng)用情況提供統(tǒng)一的接口,從控制單一進(jìn)程到系統(tǒng)級(jí)虛擬化??刂平M具備以下功能:
資源限制(Resource Limiting)
組可以設(shè)置為不超過設(shè)定的內(nèi)存限制;
優(yōu)先級(jí)(Priority)
可以讓一些組優(yōu)先得到更多的CPU等資源;
資源審計(jì)(Accounting)
可以使用cpuacct子系統(tǒng)統(tǒng)計(jì)某個(gè)進(jìn)程使用的CPU時(shí)間;
隔離(Isolation)
為組隔離命名空間(進(jìn)程、網(wǎng)絡(luò)、文件系統(tǒng)等的隔離);
控制(Control)
掛起、恢復(fù)、重啟等操作;
/sys/fs/cgroup/memory/docker目錄下可以看到對(duì)Docker應(yīng)用的各種限制項(xiàng):
$ ls /sys/fs/cgroup/memory/docker #返回結(jié)果如下: 0ad2418d6f1bcf17fe5e11071f5b7d538beb9be09847df3f18c596b72258a238 dfbfc284e5a70d79262fede4137b596d0016d9ea2f4f3d28c45cfb284bfd6a54 memory.max_usage_in_bytes 138563cf074e3652c29d3785b618966c3da2db32522f4010bd1148128bbbd10e ff9af226242bd90e6b05e92e5453ce7fc879f4a425276534701c1b091b027444 memory.move_charge_at_immigrate 36cc81e8c6fee35e553eeecdc179a06e38bac49a3a82fd2147d6390309c5833a memory.failcnt memory.numa_stat 3740d5bede34056a53bdce5ba7f18756457262397eaea079b571423a98d61553 memory.force_empty memory.oom_control 3e25c30117030f7f8cbedd08bb9311457fb4cdb64300d76aa0ba7a0cda4f3e21 memory.kmem.failcnt memory.pressure_level 40af5268aeeeb4637283f39e2d22dd34ec7ea73704f2e05a4705890148c72158 memory.kmem.limit_in_bytes memory.soft_limit_in_bytes 59a96d5e5bb0dccf983f2e0a6d05c119af4d053abef11ff336c8d978064061eb memory.kmem.max_usage_in_bytes memory.stat 8129411947b0713d47a2e05304e6ec3a5ec6eacf5c4ce142e3d867f387fde531 memory.kmem.slabinfo memory.swappiness be000c273f97427f7205cdaf6735f145486b584366b8460a83b6b6cba44af248 memory.kmem.tcp.failcnt memory.usage_in_bytes cgroup.clone_children memory.kmem.tcp.limit_in_bytes memory.use_hierarchy cgroup.event_control memory.kmem.tcp.max_usage_in_bytes notify_on_release cgroup.procs memory.kmem.tcp.usage_in_bytes tasks d0767e3dc5ca913816ed1f9b6c60fb0da8c27cfae0c5f168e0ee40b185b9c831 memory.kmem.usage_in_bytes d54ea29dd70b792ba6aa58df056eb156408f3cc96b284d33c04c32cecc83d341 memory.limit_in_bytes
通過修改這些文件值來限制Docker占用的資源。如限制Docker組中的所有進(jìn)程使用的物理內(nèi)存總量不超過100MB:
$ sudo echo 104857600 >/sys/fs/cgroup/memory/docker/memory.limit_in_bytes
查看對(duì)應(yīng)的容器文件夾的內(nèi)容,可以看到對(duì)應(yīng)容器的一些狀態(tài):
$ cd /sys/fs/cgroup/memory/docker/d54ea29dd70b792ba6aa58df056eb156408f3cc96b284d33c04c32cecc83d341 $ cat memory.stat #返回結(jié)果如下: cache 31596544 rss 103755776 rss_huge 69206016 mapped_file 19787776 writeback 0 pgpgin 34059 pgpgout 19921 pgfault 40135 pgmajfault 346 inactive_anon 45056 active_anon 103804928 inactive_file 22183936 active_file 9318400 unevictable 0 hierarchical_memory_limit 18446744073709551615 total_cache 31596544 total_rss 103755776 total_rss_huge 69206016 total_mapped_file 19787776 total_writeback 0 total_pgpgin 34059 total_pgpgout 19921 total_pgfault 40135 total_pgmajfault 346 total_inactive_anon 45056 total_active_anon 103804928 total_inactive_file 22183936 total_active_file 9318400 total_unevictable 0
在容器工具的開發(fā)過程中,往往需要查看一些容器運(yùn)行的狀態(tài)數(shù)據(jù),此時(shí)就可以從這里獲取更多的信息。另外,也可以在創(chuàng)建或啟動(dòng)容器的時(shí)候?yàn)槊總€(gè)容器指定資源的限制??梢酝ㄟ^docker run --help來查看幫助信息。也可以參考“Docker(1.11.1)命令”。
聯(lián)合文件系統(tǒng)聯(lián)合文件系統(tǒng)(UFS)是一種輕量級(jí)的高性能分層文件系統(tǒng),支持將文件系統(tǒng)中的修改信息作為一次提交,并層層疊加,同時(shí)可以將不同目錄掛載到同一虛擬文件系統(tǒng)下。UFS是實(shí)現(xiàn)Docker鏡像的技術(shù)基礎(chǔ),鏡像可以通過分層來進(jìn)行繼承。例如,用戶基于基礎(chǔ)鏡像(沒有父鏡像的鏡像被稱為基礎(chǔ)鏡像)來構(gòu)建各種不同用途的鏡像,而這些鏡像共享同一個(gè)基礎(chǔ)鏡像,提高了存儲(chǔ)效率。而當(dāng)用戶改變了一個(gè)Docker鏡像(如升級(jí)程序,添加/修改文件等),則一個(gè)新的的鏡像層(layer)會(huì)被創(chuàng)建。因此,新鏡像只是在原有的鏡像層上添加新的鏡像層即可,而不需刪除或替換。在分發(fā)鏡像的時(shí)候,也只需分發(fā)新增的鏡像層。這讓Docker的鏡像管理變得十分輕量與迅速。
Docker中使用的AUFS(Another Union File System 或 v2版本以后的 Advanced Multi-layered Unification File System)就是一種UFS。AUFS支持位每一個(gè)成員目錄設(shè)定只讀、讀寫、寫出權(quán)限。同時(shí),AUFS有一個(gè)類似分層的概念,對(duì)只讀權(quán)限的分支可以邏輯上進(jìn)行增量的修改而不影響只讀部分。
Docker利用鏡像啟動(dòng)容器時(shí),將利用鏡像分配文件系統(tǒng)并且掛載一個(gè)新的可讀寫的層給容器,容器會(huì)在該文件系統(tǒng)中創(chuàng)建,并且這個(gè)可讀寫的層會(huì)被添加到鏡像中。
Docker目前支持的聯(lián)合文件系統(tǒng)類型包括:AUFS、btrfs、vfs和DeviceMapper等。
Docker網(wǎng)絡(luò)實(shí)現(xiàn)Docker網(wǎng)絡(luò)的實(shí)現(xiàn)其實(shí)是利用Linux上的網(wǎng)絡(luò)命名空間和虛擬網(wǎng)絡(luò)設(shè)備(特別是veth pair)。
基本原理
要想實(shí)現(xiàn)網(wǎng)絡(luò)通信,機(jī)器至少需要一個(gè)網(wǎng)絡(luò)接口(物理接口或虛擬接口)與外界相通,并可以收發(fā)數(shù)據(jù)包;另外,如果不同子網(wǎng)之間要進(jìn)行通信,則需要額外的路由機(jī)制。Docker的網(wǎng)絡(luò)接口默認(rèn)都是虛擬接口。虛擬接口的最大優(yōu)勢(shì)就是轉(zhuǎn)發(fā)效率極高!之所以會(huì)這樣,那是因?yàn)長(zhǎng)inux通過在內(nèi)核中進(jìn)行數(shù)據(jù)復(fù)制來實(shí)現(xiàn)虛擬接口間的數(shù)據(jù)轉(zhuǎn)發(fā),即直接復(fù)制發(fā)送接口的發(fā)送緩存中的數(shù)據(jù)包到接收接口的接收緩存中,而無需通過外部物理網(wǎng)絡(luò)設(shè)備進(jìn)行交換。對(duì)于本地系統(tǒng)和容器內(nèi)系統(tǒng)來看,虛擬接口和一個(gè)正常的以太網(wǎng)卡相比并無區(qū)別,只是虛擬接口的速度要快得多。
網(wǎng)絡(luò)創(chuàng)建過程
創(chuàng)建一對(duì)虛擬接口,分別放到宿主機(jī)和容器的命名空間中;
宿主機(jī)一端的虛擬接口連接到默認(rèn)的docker0網(wǎng)橋或指定網(wǎng)橋上,并具有一個(gè)以veth開頭的唯一的名字;
容器一端的虛擬接口將被放到容器中,并修改名稱為eth0,且這個(gè)接口只對(duì)該容器的命名空間可見;
從網(wǎng)橋可用地址段中獲取一個(gè)空閑的地址分配給容器的eth0(如
172.17.0.2/16),并配置默認(rèn)路由網(wǎng)關(guān)為docker0網(wǎng)卡的內(nèi)部接口docker0的IP地址(如 172.17.42.1/16);
完成以上這些,容器就可以使用自身可見的eth0虛擬網(wǎng)卡來連接其他容器和訪問外部網(wǎng)絡(luò)。另外,可以在容器創(chuàng)建啟動(dòng)時(shí)通過--net參數(shù)來指定容器的網(wǎng)絡(luò)配置,請(qǐng)參考“Docker網(wǎng)絡(luò)”。
網(wǎng)絡(luò)配置細(xì)節(jié)
使用--net=none運(yùn)行容器后,Docker將不對(duì)容器網(wǎng)絡(luò)進(jìn)行配置。接下來將演示手動(dòng)配置網(wǎng)絡(luò)。
啟動(dòng)一個(gè)/bin/bash容器,指定--net=none參數(shù):
$ sudo docker run -i -t --rm --net=none ubuntu /bin/bash
在宿主機(jī)中查找容器的進(jìn)程ID,并為容器創(chuàng)建網(wǎng)絡(luò)命名空間:
$ sudo docker inspect -f "{{.State.Pid}}" ContainerID #返回結(jié)果(一串?dāng)?shù)字):pidnum $ pid=pidnum $ sudo mkdir -p /var/run/netns $ sudo ln -s /proc/$pid/ns/net /var/run/netns/$pid
檢查橋接網(wǎng)卡的IP和子網(wǎng)掩碼信息:
$ ip addr show docker0
創(chuàng)建一對(duì)“veth pair”接口A和B,綁定A接口到網(wǎng)橋docker0,并啟用它:
$ sudo ip link add A type veth peer name B $ sudo brctl addif docker0 A $ sudo ip link set A up
將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 addr add 172.17.42.99/16 dev eth0 $ sudo ip netns exec $pid ip route add default via 172.17.42.1
以上即為Docker配置網(wǎng)絡(luò)的全過程。當(dāng)容器終止后,Docker會(huì)清空容器,容器內(nèi)的網(wǎng)絡(luò)接口會(huì)隨著網(wǎng)絡(luò)命名空間一起被清除,A接口也會(huì)被自動(dòng)從docker0中卸載并清除。此外,在刪除/var/run/netns/下的內(nèi)容前,用戶可用ip netns exec命令在指定網(wǎng)絡(luò)命名空間中進(jìn)行配置,從而影響容器內(nèi)的網(wǎng)絡(luò)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/26628.html
摘要:的這種在安全可重復(fù)的環(huán)境中可移植,跨平臺(tái)的快速部署軟件的方式也方便做持續(xù)集成,所以說出現(xiàn)拉開了基于云計(jì)算平臺(tái)發(fā)布產(chǎn)品方式的變革序幕,是運(yùn)維人員的解放,廣受開發(fā)者和運(yùn)維人員的歡迎?! ∈紫韧ㄟ^一個(gè)簡(jiǎn)單的場(chǎng)景來看一下為什么docker這么火? 開發(fā)人員在開發(fā)的時(shí)候是有一套開發(fā)環(huán)境,包括運(yùn)行的操作系統(tǒng),依賴的服務(wù)比如weblogic,java,一些特定的配置,比如jvm大小 ,字符集,操作系統(tǒng)內(nèi)...
摘要:虛擬化就是表示計(jì)算機(jī)資源的一種抽象方式,它是一系列虛擬技術(shù)的集合,如硬件虛擬化技術(shù),處理器虛擬化技術(shù),指令虛擬化技術(shù),軟件虛擬化技術(shù)等。對(duì)于計(jì)算機(jī)領(lǐng)域,虛擬化技術(shù)主要分為兩類,一類是硬件虛擬化,一類是軟件虛擬化,容器技術(shù)屬于軟件虛擬化。 容器技術(shù)并不是什么新概念,只不過最近幾年隨著云計(jì)算的火熱,變得被大家所熟知。最早于1979年誕生的chroot技術(shù),容器技術(shù)又稱為容器虛擬化。 虛擬化...
摘要:虛擬化就是表示計(jì)算機(jī)資源的一種抽象方式,它是一系列虛擬技術(shù)的集合,如硬件虛擬化技術(shù),處理器虛擬化技術(shù),指令虛擬化技術(shù),軟件虛擬化技術(shù)等。對(duì)于計(jì)算機(jī)領(lǐng)域,虛擬化技術(shù)主要分為兩類,一類是硬件虛擬化,一類是軟件虛擬化,容器技術(shù)屬于軟件虛擬化。 容器技術(shù)并不是什么新概念,只不過最近幾年隨著云計(jì)算的火熱,變得被大家所熟知。最早于1979年誕生的chroot技術(shù),容器技術(shù)又稱為容器虛擬化。 虛擬化...
閱讀 3590·2021-09-02 09:53
閱讀 1929·2021-08-26 14:13
閱讀 2842·2019-08-30 15:44
閱讀 1424·2019-08-30 14:03
閱讀 2080·2019-08-26 13:42
閱讀 3102·2019-08-26 12:21
閱讀 1370·2019-08-26 11:54
閱讀 1973·2019-08-26 10:46