Docker總結

一:Docker 簡介php

    1、Docker 是什麼?html

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

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

       3. Docker 經過對應用組件的封裝、分發、部署、運行等生命週期的管理,達到應用組件級別的「一次封裝,處處運行」。這裏應用組件,便可以是Web應用,也能夠是一套數據庫服務,甚至是一個操做系統或編譯器。mysql

    2、爲何要使用 Docker?linux

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

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

       3. 響應式部署和擴展(docker容器幾乎能夠在任意平臺上運行,包括物理機、虛擬機、公有云、私有云、我的電腦、服務器等。能夠在不一樣的平臺輕鬆地遷移應用)。git

       4. 更簡單的更新管理(使用Dockerfile,只須要修改小小的配置,就能夠替代以往大量的更新工做)。web

           1. 與傳統的虛擬機對比

               

           2. 傳統開發流程

               

           3. Docker開發流程

                 

    3、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)

    4、安裝部署(Centos7)

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

1 [root@docker ~]# uname -r

2 3.10.0-327.el7.x86_64  # 必須是3.10版本以上

  1. 卸載舊版本 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 http://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

  1. 安裝 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

  1. 啓動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": ["https://78ssvya7.mirror.aliyuncs.com"]

6 }

8 [root@docker ~]# systemctl daemon-reload

9 [root@docker ~]# systemctl restart docker

二:Docker 核心操做

    1、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. 經常使用操做

           

 

 

    2、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重啓的時候,容器也會重啓。

           

    3、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. 經常使用操做

           

    4、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

    5、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

   6、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 }' http://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、應用容器化技術

       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="mj_1028@qq.com"

 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"]

2、Dockerfile 構建 MySQL

  1 # 編寫數據庫建表腳本

  2 [root@server mysql]# cat build_table.sh

  3 #!/bin/bash

  4 mysqld_safe &

  5 sleep 5

  6 mysql -uroot -e "GRANT ALL PRIVILEGES ON *.* TO '$MYSQL_USER'@'%' IDENTIFIED BY '$MYSQL_PASS'  WITH GRANT OPTION;"

  7 mysql -uroot -e "GRANT ALL PRIVILEGES ON *.* TO '$MYSQL_USER'@'localhost' IDENTIFIED BY '$MYSQL_PASS'  WITH GRANT OPTION;"

  8 mysql -e "create database chinaskills;"

  9 mysql -e "create table chinaskills.company(name char(20) not null,years int not null)DEFAULT CHARSET=utf8;"

 10 mysql -e "insert into chinaskills.company values('mm',2020),('dd',2020);"

 11

 12 # 編寫 yum 源文件

 13 [root@server mysql]# cat local.repo

 14 [centos]

 15 name=centos

 16 baseurl=file:///opt/centos

 17 gpgcheck=0

 18 enabled=1

 19 [pass]

 20 name=pass

 21 baseurl=file:///opt/pass/docker

 22 gpgcheck=0

 23 enabled=1

 24

 25 # 編寫 Dockerfile

 26 [root@server mysql]# cat Dockerfile

 27 # 基礎鏡像

 28 FROM 192.168.200.51:5000/centos-7:latest

 29 # 維護者信息

 30 LABLE maintainer="mj_1028@qq.com"

 31 # 使用當前系統的 yum 源文件

 32 RUN rm -f /etc/yum.repos.d/*

 33 ADD local.repo /etc/yum.repos.d/

 34 # 安裝MySQL服務,初始化數據庫,設置用戶名和密碼,支持中文

 35 RUN yum install -y mariadb-server

 36 RUN mysql_install_db --user=mysql

 37 ENV MYSQL_USER xiandian

 38 ENV MYSQL_PASS xiandian

 39 ENV LC_ALL en_US.UTF-8

 40 # 運行並修改數據庫腳本

 41 ADD build_table.sh /docker/mysql/build_table.sh

 42 RUN chmod +x /docker/mysql/build_table.sh

 43 RUN /docker/mysql/build_table.sh

 44 # 暴露3306端口,並之後檯安全模式啓動

 45 EXPOSE 3306

 46 CMD mysqld_safe

 47

 48 # 構建鏡像

 49 [root@server mysql]# docker build -t mysql:latest .

 50 Sending build context to Docker daemon 5.632 kB

 51 Step 1 : FROM 192.168.200.51:5000/centos-7:latest

 52  ---> 6300524e4fcb

 53 Step 2 : LABEL maintainer "mj_1028@qq.com"

 54  ---> Using cache

 55  ---> 297bb01a36e7

 56 Step 3 : RUN rm -f /etc/yum.repos.d/*

 57  ---> Using cache

 58  ---> 5cd2c60db6e4

 59 Step 4 : ADD local.repo /etc/yum.repos.d/

 60  ---> Using cache

 61  ---> 6bf93249441b

 62 Step 5 : RUN yum install -y mariadb-server

 63  ---> Using cache

 64  ---> c032f3770d64

 65 Step 6 : RUN mysql_install_db --user=mysql

 66  ---> Using cache

 67  ---> cebd6468488a

 68 Step 7 : ENV MYSQL_USER xiandian

 69  ---> Using cache

 70  ---> 4f0a879d55cd

 71 Step 8 : ENV MYSQL_PASS xiandian

 72  ---> Using cache

 73  ---> 168de6eb69ab

 74 Step 9 : ENV LC_ALL en_US.UTF-8

 75  ---> Using cache

 76  ---> a8fa8e895f78

 77 Step 10 : ADD build_table.sh /docker/mysql/build_table.sh

 78  ---> Using cache

 79  ---> 31201ac69e2a

 80 Step 11 : RUN chmod +x /docker/mysql/build_table.sh

 81  ---> Using cache

 82  ---> 27069a74cb3d

 83 Step 12 : RUN /docker/mysql/build_table.sh

 84  ---> Using cache

 85  ---> 41f7ef5e31a7

 86 Step 13 : EXPOSE 3306

 87  ---> Using cache

 88  ---> 0e4dab8114cf

 89 Step 14 : CMD mysqld_safe

 90  ---> Using cache

 91  ---> 1835da94d00e

 92 Successfully built 1835da94d00e

 93

 94 # 啓動容器,登陸數據庫,查看數據庫列表

 95 [root@server mysql]# docker run -itP --name mysql -e MYSQL_ROOT_PASSWORD=000000 mysql:latest /bin/bash

 96 bash-4.2# mysql -uxiandian -pxiandian

 97 Welcome to the MariaDB monitor.  Commands end with ; or \g.

 98 Your MariaDB connection id is 4

 99 Server version: 5.5.56-MariaDB MariaDB Server

100

101 Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

102

103 Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

104

105 MariaDB [(none)]> show databases;

106 +--------------------+

107 | Database           |

108 +--------------------+

109 | information_schema |

110 | mysql              |

111 | performance_schema |

112 | test              |

113 | chinaskills            |

114 +--------------------+

115 4 rows in set (0.01 sec)

3、Dockerfile 構建 Apache+PHP

  1 # 編寫 PHP 遠程訪問 MySQL

  2 [root@server ~]# cat test.php

  3 <?php

  4   $con = mysql_connect(getenv("MYSQL_ADDR"),getenv("MYSQL_USER"),getenv("MYSQL_PASS"));

  5   if (!$con)

  6     {

  7       die('Could not connect: ' . mysql_error());

  8     }

  9   mysql_select_db("chinaskills", $con);

 10   $result = mysql_query("SELECT * FROM company");

 11   echo "<table border='1'>

 12   <tr>

 13   <th>NAME</th>

 14   <th>YEARS</th>

 15   </tr>";

 16   while($row = mysql_fetch_array($result))

 17     {

 18       echo "<tr>";

 19       echo "<td>" . $row['name'] . "</td>";

 20       echo "<td>" . $row['years'] . "</td>";

 21       echo "</tr>";

 22     }

 23     echo "</table>";

 24  

 25   mysql_close($con);

 26 ?>

 27

 28 # 編寫 Dockerfile

 29 [root@server ~]# cat Dockerfile

 30 FROM 192.168.200.51:5000/centos-7:latest

 31 LABEL maintainer="mj_1028@qq.com"

 32 RUN rm -f /etc/yum.repos.d/*

 33 ADD local.repo /etc/yum.repos.d/local.repo

 34 WORKDIR /root/

 35 RUN yum install -y httpd php php-mysql

 36 RUN mkdir -p /var/log/httpd

 37 RUN mkdir -p /var/www/html

 38 ENV MYSQL_ADDR 172.17.0.5

 39 ENV MYSQL_USER xiandian

 40 ENV MYSQL_PASS xiandian

 41 ENV TERM linux

 42 ENV LC_ALL en_US.UTF-8

 43 ADD test.php /var/www/html/test.php

 44 EXPOSE 80

 45 ADD run.sh /root/run.sh

 46 RUN chmod u+x /root/run.sh

 47 CMD /root/run.sh

 48

 49 # 構建

 50 [root@server ~]# docker build -t apache-php:laetst .

 51 Sending build context to Docker daemon 32.77 kB

 52 Step 1 : FROM 192.168.200.51:5000/centos-7:latest

 53  ---> 6300524e4fcb

 54 Step 2 : LABEL maintainer "mj_1028@qq.com"

 55  ---> Using cache

 56  ---> 297bb01a36e7

 57 Step 3 : RUN rm -f /etc/yum.repos.d/*

 58  ---> Using cache

 59  ---> 5cd2c60db6e4

 60 Step 4 : ADD local.repo /etc/yum.repos.d/local.repo

 61  ---> Using cache

 62  ---> 6bf93249441b

 63 Step 5 : WORKDIR /root/

 64  ---> Using cache

 65  ---> 86be0e478fd9

 66 Step 6 : RUN yum install -y httpd php php-mysql

 67  ---> Using cache

 68  ---> 40756572de7f

 69 Step 7 : RUN mkdir -p /var/log/httpd

 70  ---> Using cache

 71  ---> 457d374ff59a

 72 Step 8 : RUN mkdir -p /var/www/html

 73  ---> Using cache

 74  ---> 738f8d821172

 75 Step 9 : ENV MYSQL_ADDR 172.17.0.5

 76  ---> Using cache

 77  ---> 6348e4d33a2b

 78 Step 10 : ENV MYSQL_USER xiandian

 79  ---> Using cache

 80  ---> d3ba7946fb52

 81 Step 11 : ENV MYSQL_PASS xiandian

 82  ---> Using cache

 83  ---> 3d40f9cfe126

 84 Step 12 : ENV TERM linux

 85  ---> Using cache

 86  ---> 1a6ad56ec0e8

 87 Step 13 : ENV LC_ALL en_US.UTF-8

 88  ---> Using cache

 89  ---> ed9fdc4a238b

 90 Step 14 : ADD test.php /var/www/html/test.php

 91  ---> Using cache

 92  ---> 3d45b3c49b07

 93 Step 15 : EXPOSE 80

 94  ---> Using cache

 95  ---> 1609552d6493

 96 Step 16 : ADD run.sh /root/run.sh

 97  ---> Using cache

 98  ---> 7b00521525e8

 99 Step 17 : RUN chmod u+x /root/run.sh

100  ---> Using cache

101  ---> 411bd471e1ee

102 Step 18 : CMD /root/run.sh

103  ---> Using cache

104  ---> c719019aa274

105 Successfully built c719019aa274

106

107 # 訪問

108 [root@server ~]# curl http://192.168.200.51:8096/test.php

109 <table border='1'>

110    <tr>

111      <th>NAME</th>

112      <th>YEARS</th>

113    </tr>

114    <tr>

115       <td>mm</td>

116       <td>2020</td>

117     </tr>

118     <tr>

119       <td>dd</td>

120       <td>2020</td>

121     </tr>

122 </table>

4、Dockerfile 構建 Tomcat

 1 # 編輯 Dockerfile

 2 [root@server ~]# cat Dockerfile

 3 FROM 192.168.200.51:5000/centos-7:latest

 4 LABEL maintainer="mj_1028@qq.com"

 5 RUN rm -f /etc/yum.repos.d/

 6 ADD local.repo /etc/yum.repos.d/local.repo

 7 RUN yum install -y java unzip

 8 ENV LC_ALL en_US.UTF-8

 9 ADD apache-tomcat.zip  /root/apache-tomcat.zip

10 RUN unzip /root/apache-tomcat.zip -d /root/

11 EXPOSE 8080

12 RUN chmod u+x /root/apache-tomcat-6/bin/

13 ADD index.html /root/apache-tomcat-6/webapps/ROOT/index.html

14 CMD /root/apache-tomcat-6/bin/catalina.sh

15

16 # 構建

17 [root@server ~]# docker build -t tomcat:v1.0 .

18 Sending build context to Docker daemon 5.055 MB

19 Step 1 : FROM 192.168.200.51:5000/centos-7:latest

20  ---> 6300524e4fcb

21 Step 2 : LABEL maintainer "mj_1028@qq.com"

22  ---> Using cache

23  ---> 297bb01a36e7

24 Step 3 : RUN rm -f /etc/yum.repos.d/

25  ---> Using cache

26  ---> 5cd2c60db6e4

27 Step 4 : ADD local.repo /etc/yum.repos.d/local.repo

28  ---> Using cache

29  ---> 65c3b9a5e36c

30 Step 5 : RUN yum install -y java unzip

31  ---> Using cache

32  ---> c52f6b212a3e

33 Step 6 : ENV LC_ALL en_US.UTF-8

34  ---> Using cache

35  ---> c79e93ff2f1a

36 Step 7 : ADD apache-tomcat.zip /root/apache-tomcat.zip

37  ---> Using cache

38  ---> 1d9559d21467

39 Step 8 : RUN unzip /root/apache-tomcat.zip -d /root/

40  ---> Using cache

41  ---> cff845220459

42 Step 9 : EXPOSE 8080

43  ---> Using cache

44  ---> 3c7b78ef3e32

45 Step 10 : RUN chmod u+x /root/apache-tomcat-6/bin/

46  ---> Using cache

47  ---> db348be4e9a7

48 Step 11 : ADD index.html /root/apache-tomcat-6/webapps/ROOT/index.html

49  ---> Using cache

50  ---> 8f1be41345b2

51 Step 12 : CMD /root/apache-tomcat-6/bin/catalina.sh

52  ---> Using cache

53  ---> d1fadb90c70f

54 Successfully built d1fadb90c70f57

58 #  訪問並查看JDK及Tomcat版本信息

59 [root@server ~]# curl 192.168.200.51:8080

60 Xiandian WEB

61

62 bash-4.2# java -version

63 openjdk version "1.8.0_102"

64 OpenJDK Runtime Environment (build 1.8.0_102-b14)

65 OpenJDK 64-Bit Server VM (build 25.102-b14, mixed mode)

66                                                        71 OS Name:        Linux   

67 bash-4.2# ./version.sh                                  72 OS Version:     3.10.0-229.el7.x86_64

68 Server version: Apache Tomcat/6.0.20                   73 Architecture:   amd64

69 Server built:   May 14 2009 01:13:50                    74 JVM Version:    1.8.0_102-b14

70 Server number:  6.0.20.0                               75 JVM Vendor:     Oracle Corporation

相關文章
相關標籤/搜索