国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Docker核心技術

FreeZinG / 2193人閱讀

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

整理自《Docker技術入門與實踐》(楊保華 戴王劍 曹亞侖) - Docker核心技術一文。
Docker是一種基于Linux Container(LXC)技術實現的容器虛擬化技術,現又引入libcontainer。從操作系統功能上的角度出發,Docker的核心可分為:Linux操作系統的命名空間(Namespaces)、控制組(Control Groups)、聯合文件系統(Union File System)、Linux虛擬網絡。

基礎架構

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

服務端
Docker daemon一般作為服務端運行在宿主機的后臺,它是一個非常松耦合的架構,會通過專門的Engine模塊來分發管理來自各個客戶端的任務,并根據請求來創建、運行、分發容器。Docker支持通過HTTPS認證方式來驗證訪問。Docker daemon默認監聽本地的unix:///var/run/docker.sock套接字,只允許本地的root訪問,但是可以通過-H選項來修改監聽的方式。例如Ubuntu系統中,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"

客戶端
客戶端為用戶提供了一系列可執行的命令,從而達到與Docker daemon交互的目的。同樣的,客戶端則默認通過本地的unix:///var/run/docker.sock套接字向服務端發送指令。不同的是服務端會一直處于監聽狀態,而客戶端在發送指令后等待服務端返回,一旦收到返回就會立即執行結束并退出。在交互過程中,如果服務端未監聽到默認套接字,則需要客戶端在執行命令的時候顯示指定套接字。如服務端在監聽本地的9527端口,那么如果要查詢Docker的版本信息:sudo docker -H tcp://127.0.0.1:9527 version

命名空間

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

進程命名空間
Linux通過命名空間管理進程號,同一進程在不同的命名空間中的進程號是不同的。進程命名空間是一個父子關系的結構,子空間的進程可看到父進程的ID。

網絡命名空間
通過網絡命名空間可以實現網絡的完全隔離。一個網絡命名空間為進程提供了一個完全獨立的網絡協議棧的視圖。包括網絡設備接口、IPv4和IPv6協議棧、IP路由表、防火墻規則、sockets等。Docker可采用虛擬網絡設備(Virtual Network Device)的方式將不同命名空間的網絡設備連接在一起。默認情況下,容器的虛擬網卡將與宿主機的docker0網橋連接在一起。

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

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

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

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

控制組

控制組(CGroup)用于對共享資源進行隔離、限制、審計等。控制分配到容器的資源可避免多個容器同時運行時造成的系統資源競爭。控制組的目標:為不同應用情況提供統一的接口,從控制單一進程到系統級虛擬化。控制組具備以下功能:

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

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

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

隔離(Isolation)
為組隔離命名空間(進程、網絡、文件系統等的隔離);

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

/sys/fs/cgroup/memory/docker目錄下可以看到對Docker應用的各種限制項:

$ ls /sys/fs/cgroup/memory/docker

#返回結果如下:
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組中的所有進程使用的物理內存總量不超過100MB:

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

查看對應的容器文件夾的內容,可以看到對應容器的一些狀態:

$ cd /sys/fs/cgroup/memory/docker/d54ea29dd70b792ba6aa58df056eb156408f3cc96b284d33c04c32cecc83d341
$ cat memory.stat

#返回結果如下:
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

在容器工具的開發過程中,往往需要查看一些容器運行的狀態數據,此時就可以從這里獲取更多的信息。另外,也可以在創建或啟動容器的時候為每個容器指定資源的限制。可以通過docker run --help來查看幫助信息。也可以參考“Docker(1.11.1)命令”。

聯合文件系統

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

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

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

Docker目前支持的聯合文件系統類型包括:AUFS、btrfs、vfs和DeviceMapper等。

Docker網絡實現

Docker網絡的實現其實是利用Linux上的網絡命名空間和虛擬網絡設備(特別是veth pair)。

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

網絡創建過程

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

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

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

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

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

網絡配置細節
使用--net=none運行容器后,Docker將不對容器網絡進行配置。接下來將演示手動配置網絡。

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

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

在宿主機中查找容器的進程ID,并為容器創建網絡命名空間:

$ sudo docker inspect -f "{{.State.Pid}}" ContainerID
#返回結果(一串數字):pidnum
$ pid=pidnum
$ sudo mkdir -p /var/run/netns
$ sudo ln -s /proc/$pid/ns/net /var/run/netns/$pid

檢查橋接網卡的IP和子網掩碼信息:

$ ip addr show docker0

創建一對“veth pair”接口A和B,綁定A接口到網橋docker0,并啟用它:

$ sudo ip link add A type veth peer name B
$ sudo brctl addif docker0 A
$ sudo ip link set A up

將B接口放到容器的網絡命名空間,命名為eth0,啟動它并配置一個可用的IP(橋接網段)和默認網關:

$ 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配置網絡的全過程。當容器終止后,Docker會清空容器,容器內的網絡接口會隨著網絡命名空間一起被清除,A接口也會被自動從docker0中卸載并清除。此外,在刪除/var/run/netns/下的內容前,用戶可用ip netns exec命令在指定網絡命名空間中進行配置,從而影響容器內的網絡。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26628.html

相關文章

  • 云計算核心技術docker的探索

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

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

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

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

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

    chenatu 評論0 收藏0

發表評論

0條評論

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