Docker知識點總結

一:Docker 簡介

    一、Docker 是什麼?

       1. Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發布到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面(類似 iPhone 的 app)。幾乎沒有性能開銷,可以很容易地在機器和數據中心中運行。最重要的是,他們不依賴於任何語言、框架包括系統。

       2. Docker 是基於Go語言實現的雲開源項目,誕生於2013年初,最初是dotCloud公司發起。由鏡像(Image)、容器(Container)、倉庫(Repository) 三大核心組成。

       3. Docker 通過對應用組件的封裝、分發、部署、運行等生命周期的管理,達到應用組件級別的「一次封裝,到處運行」。這裡應用組件,即可以是Web應用,也可以是一套資料庫服務,甚至是一個作業系統或編譯器。

 

    二、為什麼要使用 Docker?

       1. Docker 是一個用於開發,交付和運行應用程式的開放平台。Docker 使您能夠將應用程式與基礎架構分開,從而可以快速交付軟體。藉助 Docker,您可以與管理應用程式相同的方式來管理基礎架構。通過利用 Docker 的方法來快速交付,測試和部署程式碼,您可以大大減少編寫程式碼和在生產環境中運行程式碼之間的延遲。

       2. 更快速的交付和部署(使用docker,開發人員可以用鏡像來快速構建一套標準的開發環境;開發完成之後,測試和運維人員可以直接使用相同環境來部署程式碼)。

       3. 響應式部署和擴展(docker容器幾乎可以在任意平台上運行,包括物理機、虛擬機、公有雲、私有雲、個人電腦、伺服器等。可以在不同的平台輕鬆地遷移應用)。

       4. 更簡單的更新管理(使用Dockerfile,只需要修改小小的配置,就可以替代以往大量的更新工作)。

           1. 與傳統的虛擬機對比

               

 

           2. 傳統開發流程

               

 

           3. Docker開發流程

                

 

    三、Docker 架構

       1. Docker 核心三要素

           1. 鏡像(Image):用於創建 Docker 容器的模板,相當於一個 root 文件系統鏡像內部是一個精簡的作業系統和應用運行所需要的文件以及所有依賴(鏡像不包含內核,容器都是共享所在Docker主機的內核),比如官方鏡像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系統的 root 文件系統。

           2. 容器(Container):容器是鏡像的運行時實例,可以從單個鏡像啟動一個或多個容器。

           3. 倉庫(Repository):用於存放鏡像,可以理解為程式碼控制中的程式碼倉庫。一個 Docker Registry 中可以包含多個倉庫(Repository);每個倉庫可以包含多個標籤(Tag);每個標籤對應一個鏡像。

              

 

       2. 核心架構

           1. Docker 使用客戶端-伺服器 (C/S) 架構模式,使用遠程API來管理和創建Docker容器。

           2. Docker 容器通過 Docker 鏡像來創建。

              

              

 

       3. 運行原理

          

           1. 命令行工具或CLI在被稱為用戶空間的記憶體中運行,就像是在作業系統上運行的其他程式。運行 Docker 可以認為是在用戶空間運行著兩個程式:一個是 Docker 守護進程,另一個是 DockerCLI,DockerCLI 是與用戶交互的 Docker 程式。上圖也顯示了三個運行著的容器,每個都是以 Docker 守護程式的子進程運行,封裝在容器中。在容器中運行的程式只能訪問該容器內部的記憶體空間和資源(除非特別規定可以訪問容器外部資源)。

           2. Docker 可以執行、複製和輕鬆的分發容器,Docker 通過一種打包和分發的軟體完成傳統容器的封裝,這個用來充當容器(Container)分發角色的組件被稱為 鏡像(Image)

 

    四、安裝部署(Centos7)

       1. 查看內核版本(高於3.10)

1 [root@docker ~]# uname -r
2 3.10.0-327.el7.x86_64  # 必須是3.10版本以上

 

       2. 卸載舊版本 Docker

1 [root@docker ~]# yum remove docker  docker-common docker-selinux docker-engine
2 Loaded plugins: fastestmirror
3 No Match for argument: docker
4 No Match for argument: docker-common
5 No Match for argument: docker-selinux
6 No Match for argument: docker-engine
7 No Packages marked for removal

 

       3. 安裝需要的軟體包

 1 [root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
 2 Loaded plugins:fastestmirror
 3 Loading mirror speeds from cached hostfile
 4  * base: centos.ustc.edu.cn
 5  * extras: mirrors.aliyun.com
 6  * updates: mirrors.cn99.com
 7 軟體包 device-mapper-persistent-data-0.7.3-3.el7.x86_64 已安裝並且是最新版本
 8 軟體包 7:lvm2-2.02.180-10.el7_6.8.x86_64 已安裝並且是最新版本
 9 正在解決依賴關係
10 --> 正在檢查事務
11 ---> 軟體包 yum-utils.noarch.0.1.1.31-50.el7 將被 安裝
12 --> 正在處理依賴關係 python-kitchen,它被軟體包 yum-utils-1.1.31-50.el7.noarch 

 

       4. 設置 yum 源

 1 ### 中央倉庫
 2 [root@localhost ~]# yum-config-manager --add-repo http://download.docker.com/docker-ce/linux/centos/docker-ce.repo
 3 Loaded plugins: fastestmirror
 4 adding repo from: http://download.docker.com/docker-ce/linux/centos/docker-ce.repo
 5 grabbing file http://download.docker.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
 6 repo saved to /etc/yum.repos.d/docker-ce.repo
 7 
 8 ### 阿里雲
 9 [root@localhost ~]# yum-config-manager --add-repo //mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
10 Loaded plugins: fastestmirror
11 adding repo from: http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
12 grabbing file http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
13 repo saved to /etc/yum.repos.d/docker-ce.repo

 

       5. 安裝 Docker

 1 ### 查看倉庫中 Docker的版本
 2 [root@docker ~]# yum list docker-ce --showduplicates | sort -r
 3  * updates: mirrors.nju.edu.cn
 4 Loading mirror speeds from cached hostfile
 5 Loaded plugins: fastestmirror
 6 Installed Packages
 7  * extras: mirrors.nju.edu.cn
 8 docker-ce.x86_64            3:19.03.9-3.el7                    docker-ce-stable 
 9 docker-ce.x86_64            3:19.03.8-3.el7                    docker-ce-stable 
10 docker-ce.x86_64            3:19.03.7-3.el7                    docker-ce-stable 
30 docker-ce.x86_64 18.06.3.ce-3.el7 docker-ce-stable 31 docker-ce.x86_64 18.06.2.ce-3.el7 docker-ce-stable 32 docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable 33 docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable 34 docker-ce.x86_64 18.03.1.ce-1.el7.centos docker-ce-stable 35 docker-ce.x86_64 18.03.0.ce-1.el7.centos docker-ce-stable 36 docker-ce.x86_64 17.12.1.ce-1.el7.centos docker-ce-stable 37 docker-ce.x86_64 17.12.0.ce-1.el7.centos docker-ce-stable
43 docker-ce.x86_64 17.03.3.ce-1.el7 docker-ce-stable 44 docker-ce.x86_64 17.03.2.ce-1.el7.centos docker-ce-stable 45 docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable 46 docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable 47 48 ### 安裝最新版本 49 [root@localhost ~]# yum install -y docker-ce 50 Loaded plugins: fastestmirror 51 Loading mirror speeds from cached hostfile 52 * base: mirrors.nju.edu.cn 53 * extras: mirrors.nju.edu.cn 54 * updates: mirrors.nju.edu.cn 55 Resolving Dependencies 56 --> Running transaction check 57 ---> Package docker-ce.x86_64 3:19.03.10-3.el7 will be installed 58 --> Processing Dependency: container-selinux >= 2:2.74 for package: 3:docker-ce-19.03.10-3.el7.x86_64 59 --> Processing Dependency: containerd.io >= 1.2.2-3 for package: 3:docker-ce-19.03.10-3.el7.x86_64 60 --> Processing Dependency: libseccomp >= 2.3 for package: 3:docker-ce-19.03.10-3.el7.x86_64 61 --> Processing Dependency: docker-ce-cli for package: 3:docker-ce-19.03.10-3.el7.x86_64 62 --> Processing Dependency: libcgroup for package: 3:docker-ce-19.03.10-3.el7.x86_64 63 --> Processing Dependency: libseccomp.so.2()(64bit) for package: 3:docker-ce-19.03.10-3.el7.x86_64 64 65 ### 安裝特定版本 66 yum install -y docker-ce-版本 docker-ce-selinux-版本 docker-ce-cli-版本 containerd.io

 

       6. 啟動docker

1 [root@localhost ~]# systemctl start docker
2 [root@localhost ~]# systemctl enable docker
3 Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

 

       7. 配置阿里雲鏡像加速

           1. 獲取自己的鏡像加速地址:點擊「創建我的容器鏡像」

              

 

           2. 編寫配置文件

1 [root@docker ~]# mkdir -p /etc/docker/daemon.json
2 [root@docker ~]# vi /etc/docker/daemon.json
4 {
5   "registry-mirrors": ["//78ssvya7.mirror.aliyuncs.com"]
6 }
8 [root@docker ~]# systemctl daemon-reload 9 [root@docker ~]# systemctl restart docker

 

二:Docker 核心操作

    一、Docker 鏡像

       1. 簡介:鏡像是一種輕量級、可執行的獨立軟體包,用來打包軟體運行環境和基於運行環境開發的軟體。它包含運行某個軟體所需的所有內容,包括程式碼、運行時、庫、環境變數和配置文件。

       2. 鏡像分層

           1. 原理:Docker 鏡像實際上由一層一層的文件系統組成,這種層級的文件系統UnionFS(聯合文件系統):是一種分層、輕量級並且高性能的文件系統,它支援對文件系統的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬文件系統下。Union 文件系統是 Docker 鏡像的基礎。鏡像可以通過分層來進行繼承,基於基礎鏡像(沒有父鏡像),可以製作各種具體的應用鏡像。

           2. 特性

               1. 一次同時載入多個文件系統,但從外面看起來,只能看到一個文件系統,聯合載入會把各層文件系統疊加起來,這樣最終的文件系統會包含所有底層的文件和目錄。

               2. Docker鏡像都是只讀的。當容器啟動時,一個新的可寫層被載入到鏡像的頂部。

               3. 共享資源。一個基礎鏡像可以實例多個容器。

              

              

 

       3. 多架構鏡像(Multi-architecture Image

           1. 原理:在拉取鏡像的時候,Docker 客戶端會調用 Docker 鏡像倉庫服務的 API 完成拉取。如果該鏡像有 Manifest 列表,則 Docker 客戶端會找到當前主機架構對應的 Manifest 並解析出組成該鏡像的鏡像層加密ID,然後從鏡像倉庫中拉取每個鏡像層。

           2. 作用:是為了解決鏡像支援不同架構(Linux、Windows、ARM等)的問題。為了實現這個特性,鏡像倉庫服務API支援兩種重要的結構:Manifest列表和Manifest。Manifest列表是指某個鏡像標籤支援的架構列表,其支援的每種架構都有自己的Manifest定義,其中列舉了鏡像的構成。如下圖所示,圖中左側是Manifest列表,其中包含了該鏡像支援的每種架構。Manifest列表的每一項都有一個箭頭,指向具體的Manifest,其中包含了鏡像配置和鏡像層數據。

              

 

       4. 常用操作

          

 

    二、Docker 容器

       1. 容器是鏡像的運行時實例,可以從單個鏡像啟動一個或多個容器。

       2. 相對於虛擬機,容器較輕量級,而且容器啟動非常快————與虛擬機運行在完整的作業系統之上相比,容器會共享其所在主機的作業系統/內核(一個很簡單是證明方法就是在容器內部查看下進程,在容器所在主機的作業系統上也能找到容器內部運行的進程(由於容器擁有隔離的PID,所以進程號會不同,但是進程確是相同的))。

       3. Docker在創建容器的時候會為每個容器分配一個唯一的標識符,也會分配一個人性化的名稱(如果用戶沒有指定名稱的話)。

       4. Docker容器有四種狀態:運行中(Up)、暫停中(Paused)、已退出(Exited)、重新啟動中(一種臨時狀態),狀態轉移圖如下:

           

 

       5. 常用操作

          

 

       6. 重啟策略(--restart  重啟策略)

           1. always:除非容器被明確停止,否則會一直嘗試重啟處於停止狀態的容器。當Docker daemon重啟的時候,停止的容器也會被重啟

           2. unless-stopped:unless-stopped 和 always 最大區別的就是使用 unless-stopped 策略並處於已退出狀態的容器,不會在Docker daemon重啟的時候被重啟。

           3. on-failure退出容器並且返回值不是0的時候重啟容器,就算容器處於已退出狀態,在Docker daemon重啟的時候,容器也會重啟。

           

 

    三、Docker 網路

       1. 網路容器模型:Closed容器、Bridged容器(默認)、Joined容器、Open容器,所有的Docker容器都要符合這四種模型中的一種。這些模型定義了一個容器如何與其他的本地容器、主機網路進行通訊。

          

 

       2. Closed 容器:不允許任何的網路流量,運行在這種容器中的進程只能訪問本地迴環介面

1 # 可以看到,Closed容器只有一個迴環介面
2 [root@server ~]# docker run --name centos centos:latest ip a
3 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
4     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
5     inet 127.0.0.1/8 scope host lo
6        valid_lft forever preferred_lft forever

 

       3. Bridged 容器:默認的網路容器模型,有兩個介面,一個是本地迴環介面,另一個介面通過網橋連接到主機網路。可以通過主機網路訪問任何主機網路能訪問的外部網路。

 1 # 一個本地迴環介面,一個橋接到主機網路的介面
 2 [root@server ~]#  docker run --network bridge centos:latest ip a;
 3 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
 4     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
 5     inet 127.0.0.1/8 scope host lo
 6        valid_lft forever preferred_lft forever
 7 255: eth0@if256: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
 8     link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
 9     inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
10        valid_lft forever preferred_lft forever
11 [root@server ~]#  ping -c 2 www.baidu.com
12 PING www.a.shifen.com (180.101.49.12) 56(84) bytes of data.
13 64 bytes from 180.101.49.12 (180.101.49.12): icmp_seq=1 ttl=50 time=29.0 ms
14 64 bytes from 180.101.49.12 (180.101.49.12): icmp_seq=2 ttl=50 time=28.4 ms

 

       4. Joined 容器:所有容器共享一個網路棧,容器之間沒有任何網路隔離。Joined容器通過將某一個容器介面的訪問許可權提供給另外一個新的容器來構建。

 1 # 創建一個closed容器,看下其內部網路狀態,可以看到容器內部監聽的是39439埠
 2 [root@server ~]# docker run -d --name join-base-container --network none centos:latest
 3 e2907c7a889d209734f63309a5351687ac2761489e129cd6a7d6a392234a3cde
 4 [root@server ~]# docker exec join-base-container netstat -al
 5 Active Internet connections (servers and established)
 6 Proto Recv-Q Send-Q Local Address           Foreign Address         State       
 7 tcp        0      0 0.0.0.0:39439           0.0.0.0:*               LISTEN      
 8 Active UNIX domain sockets (servers and established)
 9 Proto RefCnt Flags       Type       State         I-Node Path
10 
11 # 創建一個基於上面容器的joined容器,發現其共享了上面的close容器中的網路
12 [root@server ~]# docker run --network container:join-base-container centos:latest netstat -al
13 Active Internet connections (servers and established)
14 Proto Recv-Q Send-Q Local Address           Foreign Address         State       
15 tcp        0      0 0.0.0.0:39439           0.0.0.0:*               LISTEN      
16 Active UNIX domain sockets (servers and established)
17 Proto RefCnt Flags       Type       State         I-Node Path

 

       5. Open容器:沒有網路容器,共享主機網路,並且對主機網路有完全的訪問權。

 1 # 發現open容器里能訪問主機所有的網路介面
 2 [root@server ~]#  docker run --network host centos:latest ip a
 3 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
 4     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
 5     inet 127.0.0.1/8 scope host lo
 6        valid_lft forever preferred_lft forever
 7     inet6 ::1/128 scope host 
 8        valid_lft forever preferred_lft forever
 9 2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
10     link/ether 8c:ec:4b:ab:6d:38 brd ff:ff:ff:ff:ff:ff
11     inet 10.55.2.40/24 brd 10.55.2.255 scope global noprefixroute dynamic eno1
12        valid_lft 522693sec preferred_lft 522693sec
13     inet6 fe80::7b57:66c8:6d06:833d/64 scope link noprefixroute 
14        valid_lft forever preferred_lft forever
15 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
16     link/ether 02:42:cc:a9:3a:68 brd ff:ff:ff:ff:ff:ff
17     inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
18        valid_lft forever preferred_lft forever
19     inet6 fe80::42:ccff:fea9:3a68/64 scope link 
20        valid_lft forever preferred_lft forever
21 4: vboxnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
22     link/ether 0a:00:27:00:00:00 brd ff:ff:ff:ff:ff:ff
23     inet 192.168.99.1/24 brd 192.168.99.255 scope global vboxnet0
24        valid_lft forever preferred_lft forever
25     inet6 fe80::800:27ff:fe00:0/64 scope link 
26        valid_lft forever preferred_lft forever

 

       6. 常用操作

          

 

    四、Docker 卷和數據持久化

       1. 簡介:

           1. 術語:一個主機或容器的目錄樹是由一組掛載點創建而成,這些掛載點描述了如何能構建出一個或多個文件系統。存儲卷是容器目錄樹上的掛載點,提供了容器無關的數據管理方式。

           2. 個人理解:將主機磁碟的某個目錄掛載到容器的文件系統(主機上的這個目錄就稱為存儲卷),那麼在容器內對這個掛載點的操作實際上都是對主機上那個目錄的操作。比如將主機目錄 /opt/soft 掛載到容器的 /soft 目錄,那麼容器中對 /soft 的所有操作實際上都是對主機目錄 /opt/soft 的操作。

 

       2. 類型

           1. 綁定掛載存儲卷:使用用戶提供的主機目錄或文件,在啟動容器時需要加入選項 -v  <主機位置>:<容器掛載點>。

           2. 管理存儲卷:使用 Docker 的管理空間,在啟動容器時需要加入選項 -v  <容器掛載點>。Docker 守護進程會自動在主機文件系統(/var/lib/docker/volumes)中創建一個目錄來掛載到容器中指定的掛載掉點。

                

 

       3. 常用操作

 1 # 創建數據卷
 2 [root@server ~]# docker volume create --name volume1  [-d  指定位置]
 3 volume1
 4 
 5 # 查看數據卷列表資訊
 6 [root@server ~]# docker volume ls
 7 DRIVER              VOLUME NAME
 8 local               412e102c656ee75de3db150c41fc9c3c21e2861ff9028a53aa49b25504e1e001
 9 local               81ad13949b48f53ab4917848fdaa8473ee9523bb18353b38925969f323bc166d
10 local               volume1
11 
12 # 查看數據卷詳細資訊
13 [root@server ~]# docker volume inspect volume1
14 [
15     {
16         "Name": "volume1",
17         "Driver": "local",
18         "Mountpoint": "/var/lib/docker/volumes/volume1/_data",
19         "Labels": {},
20         "Scope": "local"
21     }
22 ]
23 
24 # 刪除數據卷
25 [root@server ~]# docker volume rm volume1
26 volume1
27 
28 # 掛載宿主機文件或目錄到容器數據卷
29 ## 掛載文件
30 [root@server ~]# cat /opt/test.txt 
31 hello world!!!
32 [root@server ~]# docker run -it --name centos-file -v /opt/test.txt:/opt/test.txt:ro centos:latest 
33 [root@d62e52a32a07 /]# cat /opt/test.txt 
34 hello world!!!
35 
36 ## 掛載目錄
37 [root@server ~]# ll /tmp/
38 total 0
39 drwx------ 2 root root 6 May 29 16:14 tmp.fJOTUQbyx3
40 drwx------ 2 root root 6 May 29 16:48 tmp.kt4W6bwra4
41 drwx------ 2 root root 6 May 29 16:10 tmp.xmy3qeNyIx
42 [root@server ~]# docker run --name centos-dir -v /tmp/:/opt/ centos:latest  ls -l /opt/                            
43 total 0
44 drwx------ 2 root root 6 May 29 16:14 tmp.fJOTUQbyx3
45 drwx------ 2 root root 6 May 29 16:48 tmp.kt4W6bwra4
46 drwx------ 2 root root 6 May 29 16:10 tmp.xmy3qeNyIx
47 
48 # 共享數據卷
49 [root@server ~]# docker run --name centos-shared -v /tmp/:/opt/ centos:latest
50 [root@server ~]# docker run --name centos --volumes-from centos-shared  centos:latest ls -l /opt/
51 total 0
52 drwx------ 2 root root 6 May 29 16:14 tmp.fJOTUQbyx3
53 drwx------ 2 root root 6 May 29 16:48 tmp.kt4W6bwra4
54 drwx------ 2 root root 6 May 29 16:10 tmp.xmy3qeNyIx
55 
56 # 備份數據卷
57 [root@server ~]# docker run --name centos-shared -v /tmp/:/opt/ centos:latest 
58 [root@server ~]# docker run --rm --volumes-from centos-shared -v $(pwd):/backup centos:latest tar cvf /backup/centos.tar /opt/                         
59 tar: Removing leading `/' from member names
60 /opt/
61 /opt/.ICE-unix/
62 /opt/.Test-unix/
63 /opt/.X11-unix/
64 /opt/.XIM-unix/
65 /opt/.font-unix/
66 /opt/ks-script-Rl3Umm
67 /opt/yum.log

 

    五、Docker 資源限制

       1. 簡介

           1. cgroup:是將任意進程進行分組化管理的Linux內核功能,限制某個或者某些進程的分配資源

           2. subsystem:用於控制cgroup中的進程行為的內核組件。

           3. hierarchy:由cgroup組成的層級樹,每個hierarchy都對應一個cgroup虛擬文件系統,都有系統上的所有task,此外低 level 的hierarchy 不能超過高 level 設定的資源上限。

 

       2. subsystem資源控制器

           1. blkio:控制塊設備的訪問,比如頻寬等。

           2. cpu:控制進程佔用cpu的多少。

           3. cpuacct:記錄cgroup 中進程使用的 CPU 情況。

           4. cpuset:為 cgroup 中的進程分配 CPU 和記憶體節點。

           5. devices:控制進程對設備的訪問。

           6. freezer:掛起或者恢復 cgroup 中的進程。

           7. memory:設定 cgroup 中進程的記憶體限制,統計使用的記憶體資源。

           8. net_cls:使用等級識別符(classid)標記網路數據包,使得Linux 流量控制程式(tc)識別具體 cgroup 中的數據包。

 

       3. 常用操作

 1 # CPU 資源配額控制
 2 ## CPU 份額配置
 3 [root@server ~]# docker run -itd --name cpu512 -c 512 centos:latest 
 4 426e23ed9c96b9482cd167d17ca79c57e140be2359191372a5a0bdfd10d73173
 5 [root@server ~]# top -p  $(docker inspect -f {{.State.Pid}} da8d71c623ce)
 6 top - 15:43:49 up 1 day, 23:51,  1 user,  load average: 0.00, 0.01, 0.05
 7 Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie
 8 %Cpu(s):  0.3 us,  0.1 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
 9 KiB Mem :  8176044 total,  1236396 free,  1157452 used,  5782196 buff/cache
10 KiB Swap:        0 total,        0 free,        0 used.  6711724 avail Mem
11 
12 ## CPU 周期控制
13 docker run -tid --cpu-period 100000(周期) --cpu-quota200000(配額) centos:latest
14 <容器的完整長ID>
15 [root@server ~]# cat /sys/fs/cgroup/cpu/docker/<容器的完整長ID>/cpu.cfs_period_us
16 100000
17 [root@server ~]# cat /sys/fs/cgroup/cpu/docker/<容器的完整長ID>/cpu.cfs_quota_us
18 200000
19 
20 ## CPU 內核控制
21 [root@server ~]# docker run -itd --name cupset --cpuset-cpus="0,1" centos:latest
22 da8d71c623ce35105201d824234d476b065e8bd6e87b416d262599b7d2ac333f
23 [root@server ~]# cat /sys/fs/cgroup/cpuset/docker/<容器的完整長ID>/cpuset.cpus
24 0-1
25 
26 # 記憶體資源配額控制
27 -m 設置記憶體的使用限額
28 --memory-swap 設置記憶體和swap的使用限額
29 [root@server ~]# docker run -m 200M --memory-swap=300M centos:latest
30 
31 # Block IO 的限制
32 ## 限制 block IO(默認500) 
33 [root@server ~]# docker run -itd --name B --blkio-weight 300 centos:latest
34 
35 ## 限制 bps 和 iops
36 bps 是 byte per second,每秒讀寫的數據量。
37 iops 是 io per second,每秒 IO 的次數。
38 [root@server ~]# docker run -itd --device-write-bps /dev/sda:30MB centos:latest

 

    六、Docker API

       1. 種類

           1. Docker Registry API:docker鏡像倉庫的api,通過操作這套API,你可以自由的自動化、程式化的管理你的鏡像倉庫。

           2. Docker Hub API:用戶管理操作的API,docker hub是使用校驗和公共 namespaces 的方式來存儲賬戶資訊、認證賬戶、進行賬戶授權。API同時也允許操作相關的用戶倉庫和 library 倉庫。

           3. Docker Remote API:用於控制主機 Docker 服務端的 API,等價於 docker命令行客戶端。 有了它,你能遠程操作docker容器,更重要的是你可以通過程式自動化運維docker進程。

 

       2. 配置(需要重啟 Docker)

           1. 在 /etc/sysconfig/docker 文件中添加 OPTIONS=’ -H tcp://0.0.0.0:2357 -H unix:///var/run/docker.sock

           2. 在 /usr/lib/systemd/system/docker.service 文件中 ExecStart 後面添加 -H tcp://0.0.0.0:2357 -H unix:///var/run/docker.sock

 

       3. 使用

 1 #### 查看
 2 # 查看 docker 版本資訊
 3 curl http://localhost:2357/version | python -mjson.tool
 4 
 5 # 查看 docker 詳細資訊
 6 curl http://localhost:2357/info | python -mjson.tool
 7 
 8 # 列出所有鏡像
 9 curl http://localhost:2357/images/json | python -mjson.tool
10 
11 # 列出指定鏡像
12 curl http://localhost:2357/images/images_id/json | python -mjson.tool
13 
14 # 列出所有容器
15 curl http://localhost:2357/containers/json | python -mjson.tool
16 
17 # 列出指定容器
18 curl http://localhost:2357/containers/contianer_id/json | python -mjson.tool
19 
20 # 查看 docker 系統文件的變更情況
21 curl http://localhost:2357/containers/contianer_id/changes/json | python -mjson.tool
22 
23 #### 生命周期
24 # 創建容器(mariadb資料庫的容器,設置了密碼是123456,監聽埠是3306)
25 curl -X POST -H "Content-Type: application/json" -d '{
26     "Image": "mariadb",
27     "Env": ["MYSQL_ROOT_PASSWORD=123456"],
28     "ExposedPorts": {
29         "3306/tcp": {}
30     },
31     "HostConfig": {
32         "PortBindings": {
33             "3306/tcp": [{"HostIp": "","HostPort": "3306"}]
34         }
35     },
36     "NetworkSettings": {
37         "Ports": {
38             "5000/tcp": [{"HostIp": "0.0.0.0","HostPort": "3306"}]
39         }
40     }
41 }' //localhost:2357/containers/create
42 
43 # 啟動容器
44 curl -X POST http://127.0.0.1:8088/containers/{id}/start  
45 
46 # 停止容器
47 curl -X POST http://127.0.0.1:8088/containers/{id}/stop
48 
49 # 刪除容器
50 curl -X POST http://127.0.0.1:8088/containers/{id}/rm

 

三:Docker 實例

    一、應用容器化技術

       1. supermin5 構建鏡像

 1 # 安裝
 2 [root@server ~]# yum install -y supermin5
 3 Loaded plugins: fastestmirror
 4 Loading mirror speeds from cached hostfile
 5 Resolving Dependencies
 6 --> Running transaction check
 7 ---> Package supermin5.x86_64 0:5.1.10-1.2.el7 will be installed
 8 --> Finished Dependency Resolution
 9 
10 # 預裝鏡像
11 [root@server ~]# supermin5 -v –prepare bash yum net-tools initscripts vi coreutils -o supermin.d
12 supermin: version: 5.1.10
13 supermin: rpm: detected RPM version 4.11
14 supermin: package handler: fedora/rpm
15 supermin: prepare: bash net-tools initscripts vi coreutils
16 supermin: packages specified on the command line:
17   - bash-4.2.46-12.el7.x86_64
18   - net-tools-2.0-0.17.20131004git.el7.x86_64
19   - initscripts-9.49.39-1.el7_4.1.x86_64
20   - coreutils-8.22-11.el7.x86_64
21 ...
22 supermin: renaming supermin.d.9ohzr3uh to supermin.d
23 
24 # 構建鏡像
25 [root@server ~]# supermin5 -v --build --format chroot supermin.d/ -o appliance.d
26 supermin: version: 5.1.10
27 supermin: rpm: detected RPM version 4.11
28 supermin: package handler: fedora/rpm
29 supermin: build: supermin.d/
30 supermin: build: visiting supermin.d/base.tar.gz type gzip base image (tar)
31 supermin: build: visiting supermin.d/packages type uncompressed packages
32 ...
33 supermin: renaming appliance.d.t7dbj8kr to appliance.d
34 
35 # 使用yum安裝軟體
36 [root@server ~]# echo 7 > appliance.d/etc/yum/vars/releasever
37 
38 # 構建網路(如果需要)
39 [root@server ~]# cp /etc/resolv.conf appliance.d/etc
40 
41 # 將構建鏡像歸檔
42 [root@server ~]# tar --numeric-owner -cpf centos-7.tar -C appliance.d/ .
43 
44 # 從歸檔文件啟動鏡像並設置tag
45 [root@server ~]# cat centos-7.tar | docker import - 192.168.200.105:5000/centos-7:latest
46 sha256:b1e7942497d9372d43ad7bc0bfc27687dad6e77f100e7242139592efc2ab4e62
47 
48 # 將鏡像上傳到倉庫
49 [root@server ~]# docker push 192.168.200.105:5000/centos-7:latest
50 The push refers to a repository [192.168.200.51:5000/centos-7]
51 11f2f8c2668b: Pushed 
52 latest: digest: sha256:fc47a231f23c189dd93ceeb1bba5aceca50f394003425eaabfbb2062b2feaa9c size: 528
53 
54 # 查看鏡像資訊
55 [root@server ~]# docker images 192.168.200.105:5000/centos-7:latest
56 REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
57 192.168.200.51:5000/centos-7   latest              5e83db682966        2 minutes ago       213.4 MB

 

       2. Dockerfile 創建鏡像

           1. 簡介

              1. Dockerfile是一個包含用於組合映像的命令的文本文檔,可以在命令行中調用任何命令。 Docker 通過讀取 Dockerfile 中的指令自動生成映像。

              2. Docker build命令用於從 Dockerfile 構建映像,可以使用 -f 標誌指向文件系統中任何位置的Dockerfile。

 

           2. 常用命令

              

 

           3. 示例

 1 # This my first nginx Dockerfile
 2 # Version 1.0
 3 
 4 # Base images 基礎鏡像
 5 FROM centos
 6 
 7 # MAINTAINER 維護者資訊
 8 LABLE maintainer="[email protected]" 
 9 
10 # ENV 設置環境變數
11 ENV PATH /usr/local/nginx/sbin:$PATH
12 
13 # ADD  文件放在當前目錄下,拷過去會自動解壓
14 ADD nginx-1.8.0.tar.gz /usr/local/  
15 ADD epel-release-latest-7.noarch.rpm /usr/local/  
16 
17 # RUN 執行以下命令 
18 RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
19 RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
20 RUN useradd -s /sbin/nologin -M www
21 
22 # WORKDIR 相當於cd
23 WORKDIR /usr/local/nginx-1.8.0 
24 
25 RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install
27 RUN echo "daemon off;" >> /etc/nginx.conf
28 
29 # EXPOSE 暴露埠
30 EXPOSE 80
31 
32 # CMD 運行以下命令
33 CMD ["nginx"]

 

    二、

    三、

    四、

    五、

    六、

    七、