成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Docker核心技術(shù)

FreeZinG / 2198人閱讀

摘要:整理自技術(shù)入門與實踐楊保華戴王劍曹亞侖核心技術(shù)一文。默認監(jiān)聽本地的套接字,只允許本地的訪問,但是可以通過選項來修改監(jiān)聽的方式。在交互過程中,如果服務(wù)端未監(jiān)聽到默認套接字,則需要客戶端在執(zhí)行命令的時候顯示指定套接字。

整理自《Docker技術(shù)入門與實踐》(楊保華 戴王劍 曹亞侖) - Docker核心技術(shù)一文。
Docker是一種基于Linux Container(LXC)技術(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ò)。

基礎(chǔ)架構(gòu)

Docker采用的是標準的C/S架構(gòu),客戶端和服務(wù)端可以運行在同一機器上,也可以通過socket或RESTful API進行通信。

服務(wù)端
Docker daemon一般作為服務(wù)端運行在宿主機的后臺,它是一個非常松耦合的架構(gòu),會通過專門的Engine模塊來分發(fā)管理來自各個客戶端的任務(wù),并根據(jù)請求來創(chuàng)建、運行、分發(fā)容器。Docker支持通過HTTPS認證方式來驗證訪問。Docker daemon默認監(jiān)聽本地的unix:///var/run/docker.sock套接字,只允許本地的root訪問,但是可以通過-H選項來修改監(jiān)聽的方式。例如Ubuntu系統(tǒng)中,Docker daemon的默認啟動配置就在/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í)行的命令,從而達到與Docker daemon交互的目的。同樣的,客戶端則默認通過本地的unix:///var/run/docker.sock套接字向服務(wù)端發(fā)送指令。不同的是服務(wù)端會一直處于監(jiān)聽狀態(tài),而客戶端在發(fā)送指令后等待服務(wù)端返回,一旦收到返回就會立即執(zhí)行結(jié)束并退出。在交互過程中,如果服務(wù)端未監(jiān)聽到默認套接字,則需要客戶端在執(zhí)行命令的時候顯示指定套接字。如服務(wù)端在監(jiān)聽本地的9527端口,那么如果要查詢Docker的版本信息:sudo docker -H tcp://127.0.0.1:9527 version

命名空間

命名空間是Linux內(nèi)核為實現(xiàn)容器虛擬化而引入的特性。每個容器都有自己的命名空間,這保證了容器之間的互不影響。利用該特性,容器實現(xiàn)了在內(nèi)核、文件系統(tǒng)、網(wǎng)絡(luò)、PID、UID、IPC、內(nèi)存、硬盤、CPU等資源的隔離,而不再是應(yīng)用進程直接共享的狀態(tài)。

進程命名空間
Linux通過命名空間管理進程號,同一進程在不同的命名空間中的進程號是不同的。進程命名空間是一個父子關(guān)系的結(jié)構(gòu),子空間的進程可看到父進程的ID。

網(wǎng)絡(luò)命名空間
通過網(wǎng)絡(luò)命名空間可以實現(xiàn)網(wǎng)絡(luò)的完全隔離。一個網(wǎng)絡(luò)命名空間為進程提供了一個完全獨立的網(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è)備連接在一起。默認情況下,容器的虛擬網(wǎng)卡將與宿主機的docker0網(wǎng)橋連接在一起。

IPC命名空間
進程間交互(Interprocess Communication - IPC)的信息包括信號量、消息隊列、共享內(nèi)存等。同一IPC命名空間的進程可以交互;否則不行。PID命名空間和IPC命名空間可以組合使用。

掛載命名空間
掛載命名空間可以將一個進程放到一個特定的目錄執(zhí)行,且允許不同命名空間的進程看到的文件結(jié)構(gòu)不同,將各個命名空間中的進程看到的文件目錄隔離。

UTS命名空間
UTS(UNIX Time-sharing System)命名空間可以另每個容器擁有獨立的主機名和域名,從而虛擬出一個擁有獨立主機名和獨立網(wǎng)絡(luò)空間的環(huán)境。默認情況下,Docker容器的主機名就是容器的ID。

用戶命名空間
每個容器擁有不同的用戶和組ID,容器可以使用自身內(nèi)部的特定用戶執(zhí)行程序,而非宿主機系統(tǒng)上存在的用戶。每個容器內(nèi)部都可以有root賬號,且跟宿主機不在同一命名空間。

控制組

控制組(CGroup)用于對共享資源進行隔離、限制、審計等??刂品峙涞饺萜鞯馁Y源可避免多個容器同時運行時造成的系統(tǒng)資源競爭??刂平M的目標:為不同應(yīng)用情況提供統(tǒng)一的接口,從控制單一進程到系統(tǒng)級虛擬化??刂平M具備以下功能:

資源限制(Resource Limiting)
組可以設(shè)置為不超過設(shè)定的內(nèi)存限制;

優(yōu)先級(Priority)
可以讓一些組優(yōu)先得到更多的CPU等資源;

資源審計(Accounting)
可以使用cpuacct子系統(tǒng)統(tǒng)計某個進程使用的CPU時間;

隔離(Isolation)
為組隔離命名空間(進程、網(wǎng)絡(luò)、文件系統(tǒng)等的隔離);

控制(Control)
掛起、恢復(fù)、重啟等操作;

/sys/fs/cgroup/memory/docker目錄下可以看到對Docker應(yī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組中的所有進程使用的物理內(nèi)存總量不超過100MB:

$ sudo echo 104857600 >/sys/fs/cgroup/memory/docker/memory.limit_in_bytes

查看對應(yīng)的容器文件夾的內(nèi)容,可以看到對應(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ā)過程中,往往需要查看一些容器運行的狀態(tài)數(shù)據(jù),此時就可以從這里獲取更多的信息。另外,也可以在創(chuàng)建或啟動容器的時候為每個容器指定資源的限制??梢酝ㄟ^docker run --help來查看幫助信息。也可以參考“Docker(1.11.1)命令”。

聯(lián)合文件系統(tǒng)

聯(lián)合文件系統(tǒng)(UFS)是一種輕量級的高性能分層文件系統(tǒng),支持將文件系統(tǒng)中的修改信息作為一次提交,并層層疊加,同時可以將不同目錄掛載到同一虛擬文件系統(tǒng)下。UFS是實現(xiàn)Docker鏡像的技術(shù)基礎(chǔ),鏡像可以通過分層來進行繼承。例如,用戶基于基礎(chǔ)鏡像(沒有父鏡像的鏡像被稱為基礎(chǔ)鏡像)來構(gòu)建各種不同用途的鏡像,而這些鏡像共享同一個基礎(chǔ)鏡像,提高了存儲效率。而當用戶改變了一個Docker鏡像(如升級程序,添加/修改文件等),則一個新的的鏡像層(layer)會被創(chuàng)建。因此,新鏡像只是在原有的鏡像層上添加新的鏡像層即可,而不需刪除或替換。在分發(fā)鏡像的時候,也只需分發(fā)新增的鏡像層。這讓Docker的鏡像管理變得十分輕量與迅速。

Docker中使用的AUFS(Another Union File System 或 v2版本以后的 Advanced Multi-layered Unification File System)就是一種UFS。AUFS支持位每一個成員目錄設(shè)定只讀、讀寫、寫出權(quán)限。同時,AUFS有一個類似分層的概念,對只讀權(quán)限的分支可以邏輯上進行增量的修改而不影響只讀部分。

Docker利用鏡像啟動容器時,將利用鏡像分配文件系統(tǒng)并且掛載一個新的可讀寫的層給容器,容器會在該文件系統(tǒng)中創(chuàng)建,并且這個可讀寫的層會被添加到鏡像中。

Docker目前支持的聯(lián)合文件系統(tǒng)類型包括:AUFS、btrfs、vfs和DeviceMapper等。

Docker網(wǎng)絡(luò)實現(xiàn)

Docker網(wǎng)絡(luò)的實現(xiàn)其實是利用Linux上的網(wǎng)絡(luò)命名空間和虛擬網(wǎng)絡(luò)設(shè)備(特別是veth pair)。

基本原理
要想實現(xiàn)網(wǎng)絡(luò)通信,機器至少需要一個網(wǎng)絡(luò)接口(物理接口或虛擬接口)與外界相通,并可以收發(fā)數(shù)據(jù)包;另外,如果不同子網(wǎng)之間要進行通信,則需要額外的路由機制。Docker的網(wǎng)絡(luò)接口默認都是虛擬接口。虛擬接口的最大優(yōu)勢就是轉(zhuǎn)發(fā)效率極高!之所以會這樣,那是因為Linux通過在內(nèi)核中進行數(shù)據(jù)復(fù)制來實現(xiàn)虛擬接口間的數(shù)據(jù)轉(zhuǎn)發(fā),即直接復(fù)制發(fā)送接口的發(fā)送緩存中的數(shù)據(jù)包到接收接口的接收緩存中,而無需通過外部物理網(wǎng)絡(luò)設(shè)備進行交換。對于本地系統(tǒng)和容器內(nèi)系統(tǒng)來看,虛擬接口和一個正常的以太網(wǎng)卡相比并無區(qū)別,只是虛擬接口的速度要快得多。

網(wǎng)絡(luò)創(chuàng)建過程

創(chuàng)建一對虛擬接口,分別放到宿主機和容器的命名空間中;

宿主機一端的虛擬接口連接到默認的docker0網(wǎng)橋或指定網(wǎng)橋上,并具有一個以veth開頭的唯一的名字;

容器一端的虛擬接口將被放到容器中,并修改名稱為eth0,且這個接口只對該容器的命名空間可見;

從網(wǎng)橋可用地址段中獲取一個空閑的地址分配給容器的eth0(如
172.17.0.2/16),并配置默認路由網(wǎng)關(guān)為docker0網(wǎng)卡的內(nèi)部接口docker0的IP地址(如 172.17.42.1/16);

完成以上這些,容器就可以使用自身可見的eth0虛擬網(wǎng)卡來連接其他容器和訪問外部網(wǎng)絡(luò)。另外,可以在容器創(chuàng)建啟動時通過--net參數(shù)來指定容器的網(wǎng)絡(luò)配置,請參考“Docker網(wǎng)絡(luò)”。

網(wǎng)絡(luò)配置細節(jié)
使用--net=none運行容器后,Docker將不對容器網(wǎng)絡(luò)進行配置。接下來將演示手動配置網(wǎng)絡(luò)。

啟動一個/bin/bash容器,指定--net=none參數(shù):

$ sudo docker run -i -t --rm --net=none ubuntu /bin/bash

在宿主機中查找容器的進程ID,并為容器創(chuàng)建網(wǎng)絡(luò)命名空間:

$ sudo docker inspect -f "{{.State.Pid}}" ContainerID
#返回結(jié)果(一串數(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)建一對“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,啟動它并配置一個可用的IP(橋接網(wǎng)段)和默認網(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ò)的全過程。當容器終止后,Docker會清空容器,容器內(nèi)的網(wǎng)絡(luò)接口會隨著網(wǎng)絡(luò)命名空間一起被清除,A接口也會被自動從docker0中卸載并清除。此外,在刪除/var/run/netns/下的內(nèi)容前,用戶可用ip netns exec命令在指定網(wǎng)絡(luò)命名空間中進行配置,從而影響容器內(nèi)的網(wǎng)絡(luò)。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/26628.html

相關(guān)文章

  • 云計算核心技術(shù)docker的探索

    摘要:的這種在安全可重復(fù)的環(huán)境中可移植,跨平臺的快速部署軟件的方式也方便做持續(xù)集成,所以說出現(xiàn)拉開了基于云計算平臺發(fā)布產(chǎn)品方式的變革序幕,是運維人員的解放,廣受開發(fā)者和運維人員的歡迎。  首先通過一個簡單的場景來看一下為什么docker這么火?  開發(fā)人員在開發(fā)的時候是有一套開發(fā)環(huán)境,包括運行的操作系統(tǒng),依賴的服務(wù)比如weblogic,java,一些特定的配置,比如jvm大小 ,字符集,操作系統(tǒng)內(nèi)...

    yanest 評論0 收藏0
  • Docker學習(一)docker的相關(guān)概念

    摘要:虛擬化就是表示計算機資源的一種抽象方式,它是一系列虛擬技術(shù)的集合,如硬件虛擬化技術(shù),處理器虛擬化技術(shù),指令虛擬化技術(shù),軟件虛擬化技術(shù)等。對于計算機領(lǐng)域,虛擬化技術(shù)主要分為兩類,一類是硬件虛擬化,一類是軟件虛擬化,容器技術(shù)屬于軟件虛擬化。 容器技術(shù)并不是什么新概念,只不過最近幾年隨著云計算的火熱,變得被大家所熟知。最早于1979年誕生的chroot技術(shù),容器技術(shù)又稱為容器虛擬化。 虛擬化...

    用戶83 評論0 收藏0
  • Docker學習(一)docker的相關(guān)概念

    摘要:虛擬化就是表示計算機資源的一種抽象方式,它是一系列虛擬技術(shù)的集合,如硬件虛擬化技術(shù),處理器虛擬化技術(shù),指令虛擬化技術(shù),軟件虛擬化技術(shù)等。對于計算機領(lǐng)域,虛擬化技術(shù)主要分為兩類,一類是硬件虛擬化,一類是軟件虛擬化,容器技術(shù)屬于軟件虛擬化。 容器技術(shù)并不是什么新概念,只不過最近幾年隨著云計算的火熱,變得被大家所熟知。最早于1979年誕生的chroot技術(shù),容器技術(shù)又稱為容器虛擬化。 虛擬化...

    chenatu 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<