Docker 入門到精通 (圖解+秒懂+史上最全)


文章很長,而且持續更新,建議收藏起來,慢慢讀!瘋狂創客圈總目錄 博客園版 為您奉上珍貴的學習資源 :

免費贈送 :《尼恩Java面試寶典》 持續更新+ 史上最全 + 面試必備 2000頁+ 面試必備 + 大廠必備 +漲薪必備
免費贈送 經典圖書:《Java高並發核心編程(卷1)加強版》 面試必備 + 大廠必備 +漲薪必備 加尼恩免費領
免費贈送 經典圖書:《Java高並發核心編程(卷2)加強版》 面試必備 + 大廠必備 +漲薪必備 加尼恩免費領
免費贈送 經典圖書:《Java高並發核心編程(卷3)加強版》 面試必備 + 大廠必備 +漲薪必備 加尼恩免費領
免費贈送 經典圖書:尼恩Java面試寶典 最新版 面試必備 + 大廠必備 +漲薪必備 加尼恩免費領
免費贈送 資源寶庫: Java 必備 百度網盤資源大合集 價值>10000元 加尼恩領取


背景:

下一個視頻版本,從架構師視角,尼恩為大家打造高可用、高並發中間件的原理與實操。

目標:通過視頻和博客的方式,為各位潛力架構師,徹底介紹清楚架構師必須掌握的高可用、高並發環境,包括但不限於:

  • 高可用、高並發nginx架構的原理與實操

  • 高可用、高並發mysql架構的原理與實操

  • 高可用、高並發nacos架構的原理與實操

  • 高可用、高並發rocketmq架構的原理與實操

  • 高可用、高並發es架構的原理與實操

  • 高可用、高並發minio架構的原理與實操

在這里插入圖片描述

why 高可用、高並發中間件的原理與實操:

  • 實際的開發過程中,很多小伙伴,常常是埋頭苦干,聚焦crud開發,復雜一點的環境出了問題,都不能自己去啟動,出了問題,就想熱鍋上的螞蟻,無從下手
  • 常常的現象是: 大家 低頭看路的時間多,抬頭看天的時間少,技術視野比較狹窄。常常是埋頭苦干業務開發,很少投入精力進行技術提升。
  • 作為架構師,或者未來想走向高端開發,或者做架構,必須掌握高可用、高並發中間件的原理,掌握其實操。

本系列博客的具體內容,請參見 瘋狂創客圈總目錄 語雀版 | 總目錄 碼雲版| 總目錄 博客園版


Docker 簡介

img

Docker 是一個開源的應用容器引擎,基於 Go 語言 並遵從 Apache2.0 協議開源。

Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實現虛擬化。

容器是完全使用沙箱機制,相互之間不會有任何接口(類似 iPhone 的 app),更重要的是容器性能開銷極低。

Docker 從 17.03 版本之后分為 CE(Community Edition: 社區版) 和 EE(Enterprise Edition: 企業版),我們用社區版就可以了

Docker的應用場景

  • Web 應用的自動化打包和發布。
  • 自動化測試和持續集成、發布。
  • 在服務型環境中部署和調整數據庫或其他的后台應用。
  • 從頭編譯或者擴展現有的 OpenShift 或 Cloud Foundry 平台來搭建自己的 PaaS 環境。

說明:本文會以pdf格式持續更新,更多最新尼恩3高pdf筆記,請從下面的鏈接獲取:語雀 或者 碼雲

Docker 架構

Docker 包括三個基本概念:

  • 鏡像(Image):Docker 鏡像(Image),就相當於是一個 root 文件系統。比如官方鏡像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系統的 root 文件系統。
  • 容器(Container):鏡像(Image)和容器(Container)的關系,就像是面向對象程序設計中的類和實例一樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器可以被創建、啟動、停止、刪除、暫停等。
  • 倉庫(Repository):倉庫可看成一個代碼控制中心,用來保存鏡像。

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

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

概念 說明
Docker 鏡像(Images) Docker 鏡像是用於創建 Docker 容器的模板,比如 Ubuntu 系統。
Docker 容器(Container) 容器是獨立運行的一個或一組應用,是鏡像運行時的實體。
Docker 客戶端(Client) Docker 客戶端通過命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 與 Docker 的守護進程通信。
Docker 主機(Host) 一個物理或者虛擬的機器用於執行 Docker 守護進程和容器。
Docker Registry Docker 倉庫用來保存鏡像,可以理解為代碼控制中的代碼倉庫。Docker Hub(https://hub.docker.com) 提供了龐大的鏡像集合供使用。一個 Docker Registry 中可以包含多個倉庫(Repository);每個倉庫可以包含多個標簽(Tag);每個標簽對應一個鏡像。通常,一個倉庫會包含同一個軟件不同版本的鏡像,而標簽就常用於對應該軟件的各個版本。我們可以通過 <倉庫名>:<標簽> 的格式來指定具體是這個軟件哪個版本的鏡像。如果不給出標簽,將以 latest 作為默認標簽。

docker的守護進程查看

systemctl status docker

docker 鏡像查看

docker image ls

docker 容器查看

docker ps

Docker Registry配置和查看

cat /etc/docker/daemon.json

配置私有倉庫

cat>/etc/docker/daemon.json<<EOF

{

  "registry-mirrors":["http://10.24.2.30:5000","https://tnxkcso1.mirrors.aliyuncs.com"],

  "insecure-registries":["10.24.2.30:5000"]

}

EOF

在線安裝docker

1、Docker 要求 CentOS 系統的內核版本高於 3.10 ,查看本頁面的前提條件來驗證你的CentOS 版本是否支持 Docker 。

通過 uname -r 命令查看你當前的內核版本

 $ uname -r

2、使用 root 權限登錄 Centos。確保 yum 包更新到最新。

$ sudo yum update

3、卸載舊版本(如果安裝過舊版本的話)

$ sudo yum remove docker  docker-common docker-selinux docker-engine

4、安裝需要的軟件包, yum-util 提供yum-config-manager功能,另外兩個是devicemapper驅動依賴的

$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2

5、設置yum源

$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

img

注意,以上的yum 在國外,網速太慢。

所以我們使用阿里雲的yum源

我寫了個shell 腳本,一鍵切換

sudo sh /vagrant/3G-middleware/yum_set_alibaba.sh

[root@cdh2 ~]# sudo sh /vagrant/3G-middleware/yum_set_alibaba.sh
===========set yum source .....================
mv: cannot move ‘bak’ to a subdirectory of itself, ‘bak/bak’
--2021-11-18 20:56:49--  http://mirrors.aliyun.com/repo/Centos-7.repo
Resolving mirrors.aliyun.com (mirrors.aliyun.com)... 45.253.17.226, 103.43.210.115, 45.253.17.217, ...
Connecting to mirrors.aliyun.com (mirrors.aliyun.com)|45.253.17.226|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2523 (2.5K) [application/octet-stream]
Saving to: ‘Centos-7.repo’

100%[=========================================================================================>] 2,523       --.-K/s   in 0s

2021-11-18 20:56:49 (81.2 MB/s) - ‘Centos-7.repo’ saved [2523/2523]

--2021-11-18 20:56:49--  http://mirrors.aliyun.com/repo/epel-7.repo
Resolving mirrors.aliyun.com (mirrors.aliyun.com)... 103.43.210.114, 45.253.17.226, 45.253.17.216, ...
Connecting to mirrors.aliyun.com (mirrors.aliyun.com)|103.43.210.114|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 664 [application/octet-stream]
Saving to: ‘epel-7.repo’

100%[=========================================================================================>] 664         --.-K/s   in 0s

2021-11-18 20:56:49 (67.6 MB/s) - ‘epel-7.repo’ saved [664/664]

Loaded plugins: fastestmirror
adding repo from: http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
grabbing file http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo
Loaded plugins: fastestmirror
Cleaning repos: base docker-ce-stable epel extras updates
Cleaning up list of fastest mirrors
Other repos take up 24 M of disk space (use --verbose for details)
Loaded plugins: fastestmirror
base                                                                                                        | 3.6 kB  00:00:00
docker-ce-stable                                                                                            | 3.5 kB  00:00:00
epel                                                                                                        | 4.7 kB  00:00:00
extras                                                                                                      | 2.9 kB  00:00:00
updates                                                                                                     | 2.9 kB  00:00:00
(1/9): epel/x86_64/group_gz                                                                                 |  96 kB  00:00:00
(2/9): base/7/x86_64/group_gz                                                                               | 153 kB  00:00:00
(3/9): docker-ce-stable/7/x86_64/updateinfo                                                                 |   55 B  00:00:00
(4/9): docker-ce-stable/7/x86_64/primary_db                                                                 |  69 kB  00:00:00
(5/9): epel/x86_64/updateinfo                                                                               | 1.0 MB  00:00:00
(6/9): extras/7/x86_64/primary_db                                                                           | 243 kB  00:00:00
(7/9): base/7/x86_64/primary_db                                                                             | 6.1 MB  00:00:02
(8/9): epel/x86_64/primary_db                                                                               | 7.0 MB  00:00:02
(9/9): updates/7/x86_64/primary_db                                                                          |  12 MB  00:00:02
Determining fastest mirrors
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
repo id                                             repo name                                                                status
base/7/x86_64                                       CentOS-7 - Base - mirrors.aliyun.com                                     10,072
docker-ce-stable/7/x86_64                           Docker CE Stable - x86_64                                                   135
epel/x86_64                                         Extra Packages for Enterprise Linux 7 - x86_64                           13,685
extras/7/x86_64                                     CentOS-7 - Extras - mirrors.aliyun.com                                      500
updates/7/x86_64                                    CentOS-7 - Updates - mirrors.aliyun.com                                   2,963

6、可以查看所有倉庫中所有docker版本,並選擇特定版本安裝

$ yum list docker-ce --showduplicates | sort -r

img

7、安裝docker

$ sudo yum install docker-ce  #由於repo中默認只開啟stable倉庫,故這里安裝的是最新穩定版17.12.0
$ sudo yum install <FQPN>  # 例如:sudo yum install docker-ce-18.03.1.ce-1.el7.centos

output:

[root@cdh2 ~]# sudo yum install docker-ce-18.03.1.ce-1.el7.centos
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
Resolving Dependencies
--> Running transaction check
---> Package docker-ce.x86_64 0:18.03.1.ce-1.el7.centos will be installed
--> Processing Dependency: libseccomp >= 2.3 for package: docker-ce-18.03.1.ce-1.el7.centos.x86_64
--> Processing Dependency: container-selinux >= 2.9 for package: docker-ce-18.03.1.ce-1.el7.centos.x86_64
--> Processing Dependency: pigz for package: docker-ce-18.03.1.ce-1.el7.centos.x86_64
--> Processing Dependency: libcgroup for package: docker-ce-18.03.1.ce-1.el7.centos.x86_64
--> Processing Dependency: libltdl.so.7()(64bit) for package: docker-ce-18.03.1.ce-1.el7.centos.x86_64
--> Processing Dependency: libseccomp.so.2()(64bit) for package: docker-ce-18.03.1.ce-1.el7.centos.x86_64
--> Running transaction check
---> Package container-selinux.noarch 2:2.119.2-1.911c772.el7_8 will be installed
--> Processing Dependency: selinux-policy-targeted >= 3.13.1-216.el7 for package: 2:container-selinux-2.119.2-1.911c772.el7_8.noarch
--> Processing Dependency: selinux-policy-base >= 3.13.1-216.el7 for package: 2:container-selinux-2.119.2-1.911c772.el7_8.noarch
-->

8、啟動並加入開機啟動

$ sudo systemctl start docker
$ sudo systemctl enable docker

9、驗證安裝是否成功(有client和service兩部分表示docker安裝啟動都成功了)

$ docker version

img

離線安裝docker

一、基礎環境
1、操作系統:CentOS 7.3
2、Docker版本:19.03.9 官方下載地址
3、官方參考文檔:https://docs.docker.com/install/linux/docker-ce/binaries/#install-static-binaries

二、Docker安裝

1、下載

wget https://download.docker.com/linux/static/stable/x86_64/docker-19.03.9.tgz

注意:如果事先下載好了可以忽略這一步

2、解壓

把壓縮文件存在指定目錄下(如root),並進行解壓

tar -zxvf docker-19.03.6.tgz

直接從虛擬機的共享目錄,解壓到root

tar -zxvf /vagrant/3G-middleware/docker-19.03.6.tar.gz -C /root/

cd root
[root@localhost ~]# tar -zxvf /vagrant/3G-middleware/docker-19.03.6.tar.gz -C /root/
docker/
docker/containerd
docker/docker
docker/ctr
docker/dockerd
docker/runc
docker/docker-proxy
docker/docker-init
docker/containerd-shim

3、將解壓出來的docker文件內容移動到 /usr/bin/ 目錄下

cp /root/docker/* /usr/bin/

4、將docker注冊為service

cat /etc/systemd/system/docker.service

vi /etc/systemd/system/docker.service

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID

# Having non-zero Limit*s causes performance problems due to accounting overhead

# in the kernel. We recommend using cgroups to do container-local accounting.

LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity

# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0

# set delegate yes so that systemd does not reset the cgroups of docker containers

Delegate=yes

# kill only the docker process, not all processes in the cgroup

KillMode=process

# restart the docker process if it exits prematurely

Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s


[Install]
WantedBy=multi-user.target

5、啟動

chmod +x /etc/systemd/system/docker.service #添加文件權限並啟動docker

systemctl daemon-reload #重載unit配置文件

systemctl start docker #啟動Docker

systemctl enable docker.service #設置開機自啟

[root@localhost ~]# vi /etc/systemd/system/docker.service
[root@localhost ~]# chmod +x /etc/systemd/system/docker.service
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl start docker
[root@localhost ~]# systemctl enable docker.service
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /etc/systemd/system/docker.service.

6、驗證

systemctl status docker #查看Docker狀態

docker -v #查看Docker版本

docker info

[root@localhost ~]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/etc/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2021-10-09 15:25:44 CST; 29s ago
     Docs: https://docs.docker.com
 Main PID: 1916 (dockerd)
   CGroup: /system.slice/docker.service
           ├─1916 /usr/bin/dockerd
           └─1927 containerd --config /var/run/docker/containerd/containerd.toml --log-level info

Oct 09 15:25:43 localhost.localdomain dockerd[1916]: time="2021-10-09T15:25:43.671407996+08:00" level=info msg="scheme \"unix\" not r...e=grpc
Oct 09 15:25:43 localhost.localdomain dockerd[1916]: time="2021-10-09T15:25:43.671440368+08:00" level=info msg="ccResolverWrapper: se...e=grpc
Oct 09 15:25:43 localhost.localdomain dockerd[1916]: time="2021-10-09T15:25:43.671462935+08:00" level=info msg="ClientConn switching ...e=grpc
Oct 09 15:25:43 localhost.localdomain dockerd[1916]: time="2021-10-09T15:25:43.750687781+08:00" level=info msg="Loading containers: start."
Oct 09 15:25:44 localhost.localdomain dockerd[1916]: time="2021-10-09T15:25:44.072960862+08:00" level=info msg="Default bridge (docke...dress"
Oct 09 15:25:44 localhost.localdomain dockerd[1916]: time="2021-10-09T15:25:44.153444071+08:00" level=info msg="Loading containers: done."
Oct 09 15:25:44 localhost.localdomain dockerd[1916]: time="2021-10-09T15:25:44.175249299+08:00" level=info msg="Docker daemon" commit...9.03.6
Oct 09 15:25:44 localhost.localdomain dockerd[1916]: time="2021-10-09T15:25:44.175337834+08:00" level=info msg="Daemon has completed ...ation"
Oct 09 15:25:44 localhost.localdomain systemd[1]: Started Docker Application Container Engine.
Oct 09 15:25:44 localhost.localdomain dockerd[1916]: time="2021-10-09T15:25:44.195084106+08:00" level=info msg="API listen on /var/ru....sock"
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost ~]# docker -v
Docker version 19.03.6, build 369ce74a3c
[root@localhost ~]# docker info

使用docker

調整鏡像倉庫

修改docker的registry
修改/etc/docker目錄下的daemon.json文件

在文件中加入

{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}
 


保存退出

重新啟動docker

chmod +x /etc/systemd/system/docker.service #添加文件權限並啟動docker

systemctl daemon-reload #重載unit配置文件

systemctl start docker #啟動Docker

systemctl restart docker #重新啟動Docker

systemctl enable docker.service #設置開機自啟

[root@localhost ~]# vi /etc/systemd/system/docker.service
[root@localhost ~]# chmod +x /etc/systemd/system/docker.service
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl start docker
[root@localhost ~]# systemctl enable docker.service
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /etc/systemd/system/docker.service.

發現內網的環境, 改成了阿里雲的,但是沒有啥用

[root@localhost ~]# cat /etc/docker/daemon.json
{
  "registry-mirrors": ["https://ku39pxyp.mirror.aliyuncs.com"],
  "insecure-registries": ["hub.company.com"]
}


確保鏡像倉庫可以ping通

[root@localhost ~]# curl https://ku39pxyp.mirror.aliyuncs.com
curl: (6) Could not resolve host: ku39pxyp.mirror.aliyuncs.com; Unknown error

[root@localhost ~]# ping ku39pxyp.mirror.aliyuncs.com
ping: ku39pxyp.mirror.aliyuncs.com: Name or service not known

開源的鏡像倉庫Harbor概述

Habor是由VMWare公司開源的容器鏡像倉庫。事實上,Habor是在Docker Registry上進行了相應的
企業級擴展,從而獲得了更加廣泛的應用,這些新的企業級特性包括:管理用戶界面,基於角色的訪
問控制 ,AD/LDAP集成以及審計日志等,足以滿足基本企業需求。
官方地址:https://vmware.github.io/harbor/cn/

1、什么是Harbor
• Harbor是VMware公司開源的企業級Docker Registry項目,其目標是幫助用戶迅速搭建一個企業級的Docker Registry服務

• Harbor以 Docker 公司開源的Registry 為基礎,提供了圖形管理UI、基於角色的訪問控制(Role Based AccessControl)、AD/LDAP集成、以及審計日志(Auditlogging)等企業用戶需求的功能,同時還原生支持中文

• Harbor的每個組件都是以Docker 容器的形式構建的,使用docker-compose 來對它進行部署。用於部署Harbor 的docker- compose模板位於harbor/ docker- compose.yml

2、Harbor的特性
1.基於角色控制: 用戶和倉庫都是基於項目進行組織的,而用戶在項目中可以擁有不同的權限

2.基於鏡像的復制策略: 鏡像可以在多個Harbor實例之間進行復制(同步)

3.支持LDAP/AD: Harbor 可以集成企業內部有的AD/LDAP (類似數據庫的一-張表),用於對已經存在的用戶認證和管理

4.鏡像刪除和垃圾回收: 鏡像可以被刪除,也可以回收鏡像占用的空間

5.圖形化用戶界面: 用戶可以通過瀏覽器來瀏覽,搜索鏡像倉庫以及對項目進行管理

6.審計管理: 所有針對鏡像倉庫的操作都可以被記錄追溯,用於審計管理

7.支持RESTful API: RESTful API提供給管理員對於Harbor 更多的操控,使得與其它管理軟件集成變得更容易

8.Harbor 和docker registry的 關系: Harbor實質 上是對docker registry做 了封裝,擴展了自己的業務模板

3、Harbor的構成
Harbor在架構上主要有Proxy、 Registry、 Core services、 Database (Harbor-db) 、Log collector ( Harbor-log)、Job services六個組件

● Proxy: Harbor 的Registry、 UI、Token 服務等組件,都處在nginx 反向代理后邊。該代理將來自瀏覽器、docker clients的請求轉發到后端不同的服務上

● Registry:負責儲存Docker 鏡像,並處理Docker push/pull命令。由於要對用戶進行訪問控制,即不同用戶對Docker 鏡像有不同的讀寫權限,Registry 會指向一個Token 服務,強制用戶的每次Docker pull/push 請求都要攜帶一個合法的Token,Registry會通過公鑰對Token進行解密驗證

● Core services: Harbor的核心功能,主要提供以下3個服務:
1.UI (harbor-ui) :提供圖形化界面,幫助用戶管理Registry. 上的鏡像( image),並對用戶進行授權
2.WebHook: 為了及時獲取Registry.上image 狀態變化的情況,在Registry. 上配置 Webhook,把狀態變化傳遞給UI模塊
3.Token 服務:負責根據用戶權限給每個Docker push/pull 命令簽發Token。 Docker 客戶端向Registry服務發起的請求,
如果不包含Token,會被重定向到Token服務,獲得Token后再重新向Registry 進行請求

● Database (harbor-db) :為core services提供數據庫服務,負責儲存用戶權限、審計日志、Docker 鏡像分組信息等數據

● Job services: 主要用於鏡像復制,本地鏡像可以被同步到遠程Harbor 實例上

● Log collector (harbor-log) :負責收集其他組件的日志到一個地方

• Harbor的每個組件都是以Docker 容器的形式構建的,因此,使用Docker Compose 來對它進行部署。

• 總共分為7個容器運行,通過在docker-compose.yml所在目錄中執行docker-compose ps命令來查看,
名稱分別為: nginx、 harbor-jobservice、 harbor-ui、 harbor-db、harbor-adminserver、registry、 harbor-log.
其中harbor-adminserver主要是作為一個后端的配置數據管理,並沒有太多的其他功能。harbor-ui所要操作的所有數據都通過harbor-adminserver這樣一個數據配置管理中心來完成。

docker 鏡像倉庫Harbor_Harbor

不安全的鏡像倉庫

[root@localhost ~]# cat  /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

172.11.1.107    hub.company.com


發現內網的環境, 改成了阿里雲的,但是沒有啥用

[root@localhost ~]# cat /etc/docker/daemon.json
{
  "registry-mirrors": ["http://hub.company.co"],
  "insecure-registries": ["hub.company.com"]
}


查看docker info 的引擎信息

[root@localhost ~]# docker info
Client:
 Debug Mode: false

Server:
 Containers: 14
  Running: 7
  Paused: 0
  Stopped: 7
 Images: 19
 Server Version: 19.03.6
 Storage Driver: overlay2
  Backing Filesystem: xfs
  Supports d_type: true
  Native Overlay Diff: true
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: b34a5c8af56e510852c35414db4c1f4fa6172339
 runc version: 3e425f80a8c931f88e6d94a8c831b9d5aa481657
 init version: fec3683
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 3.10.0-1062.el7.x86_64
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 4
 Total Memory: 15.49GiB
 Name: localhost.localdomain
 ID: I5KF:Y5JA:VCWG:DJYG:PGZO:PZVA:FYXQ:F624:RWH6:4S6R:BI6Z:L2MT
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  hub.gsafety.com
  127.0.0.0/8
 Registry Mirrors:
  https://ku39pxyp.mirror.aliyuncs.com/
 Live Restore Enabled: false




查看docker相關的進程

[root@localhost ~]# ps -ef | grep docker
root       1460      1  0 Jun23 ?        04:45:43 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root       2249   1460  0 Jun23 ?        00:00:09 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 5433 -container-ip 172.26.0.2 -container-port 5432
root       2280   1460  0 Jun23 ?        00:00:09 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 5432 -container-ip 172.26.0.3 -container-port 5432
root       2310   1455  0 Jun23 ?        00:09:35 containerd-shim -namespace moby -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/moby/78dc6aacc7d9490fa7c7252dd6b4df01af3b68c2adb69767fb0d51974ea0728c -address /run/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-runc
root       2311   1455  0 Jun23 ?        00:16:19 containerd-shim -namespace moby -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/moby/d6ec26035ca0428d5c3bd1cc154a76b356cf3a7d0746b0455d81223c7b9ab7fd -address /run/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-runc
root       2483   1460  0 Jun23 ?        00:00:32 /usr/bin/docker-proxy -proto tcp -host-ip 127.0.0.1 -host-port 1514 -container-ip 172.21.0.4 -container-port 10514
root       2538   1455  0 Jun23 ?        02:25:41 containerd-shim -namespace moby -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/moby/98500167fb283c56fd43f42d3357c52b393481fdcca2bc7a87128ac35e19fa5a -address /run/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-runc
root       2571   1455  0 Jun23 ?        02:17:17 containerd-shim -namespace moby -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/moby/412652067b159ca617625c315940ce6865534e80fa94b93ef3174f653d21b826 -address /run/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-runc
root       7077   1460  0 Jun23 ?        00:00:09 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 3306 -container-ip 172.19.0.2 -container-port 3306
root       7085   1455  0 Jun23 ?        00:09:39 containerd-shim -namespace moby -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/moby/976bb8cd43729535a74d1583a758be937b6cf8f7a3329a1737fcb722576d1fea -address /run/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-runc
root       7354   1460  0 Jun23 ?        00:00:09 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 3308 -container-ip 172.19.0.3 -container-port 3306
root       7386   1455  0 Jun23 ?        00:09:45 containerd-shim -namespace moby -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/moby/14112371b62521a9b52968a6b0d275700343afeceaac478cfb7a90241dfcdf61 -address /run/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-runc
root       7402   1460  0 Jun23 ?        00:00:09 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 3307 -container-ip 172.19.0.4 -container-port 3306
root       7431   1455  0 Jun23 ?        00:10:30 containerd-shim -namespace moby -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/moby/a0c6a5d5f891d293ae19e0bc3413729ac41cf38cc7e58d5a547b0f0df87fd6c4 -address /run/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-runc
root      28336  21582  0 15:32 pts/0    00:00:00 grep --color=auto docker

說明:本文會以pdf格式持續更新,更多最新尼恩3高pdf筆記,請從下面的鏈接獲取:語雀 或者 碼雲

Docker本地鏡像載入與載出

兩種辦法

  • 保存鏡像(保存鏡像載入后獲得跟原鏡像id相同的鏡像)
  • 保存容器(保存容器載入后獲得跟原鏡像id不同的鏡像)

拉取鏡像

通過命令可以從鏡像倉庫中拉取鏡像,默認從Docker Hub 獲取。

命令格式:

docker image pull :

docker image pull rancher/rke-tools:v0.1.52

[rancher/rke-tools:v0.1.52

保存鏡像

  • docker save 鏡像id -o /home/mysql.tar
  • docker save 鏡像id > /home/mysql.tar

docker save docker.io/rancher/rancher-agent -o /home/rancher-agent .tar

docker save f29ece87a195 -o /home/rancher-agent.tar

docker save docker.io/rancher/rke-tools -o /home/rke-tools-v0.1.52.tar

載入鏡像

  • docker load -i mysql.tar

docker load -i /usr/local/rancher-v2.3.5.tar

docker load -i /usr/local/rancher-agent.tar

docker inspect f29ece87a1954772accb8a2332ee8c3fe460697e3f102ffbdc76eb9bc4f4f1d0

docker load -i /usr/local/rke-tools-v0.1.52.tar

docker load -i mysql.tar

[root@localhost ~]# docker load -i /usr/local/rancher-v2.3.5.tar
43c67172d1d1: Loading layer [==================================================>]  65.57MB/65.57MB
21ec61b65b20: Loading layer [==================================================>]  991.2kB/991.2kB
1d0dfb259f6a: Loading layer [==================================================>]  15.87kB/15.87kB
f55aa0bd26b8: Loading layer [==================================================>]  3.072kB/3.072kB
e0af200d6950: Loading layer [==================================================>]  126.1MB/126.1MB
088ed892f9ad: Loading layer [==================================================>]  6.656kB/6.656kB
6aa3142b4130: Loading layer [==================================================>]   34.5MB/34.5MB
f4e84c05ab29: Loading layer [==================================================>]  70.41MB/70.41MB
11a6e4332b53: Loading layer [==================================================>]  224.8MB/224.8MB
46d1ac556da7: Loading layer [==================================================>]  3.072kB/3.072kB
0f8b224a5802: Loading layer [==================================================>]  57.87MB/57.87MB
519eba7d586a: Loading layer [==================================================>]  99.58MB/99.58MB
3f8bb7c0c150: Loading layer [==================================================>]  4.608kB/4.608kB
c22c9a5a8211: Loading layer [==================================================>]  3.072kB/3.072kB
Loaded image: rancher/rancher:v2.3.5

打個tag

docker tag f29ece87a1954772accb8a2332ee8c3fe460697e3f102ffbdc76eb9bc4f4f1d0 rancher/rancher-agent:v2.3.5

docker tag f29ece87a195 172.18.8.104/rancher/rancher-agent:v2.3.5

docker tag 6e421b8753a2 172.18.8.104/rancher/rke-tools:v0.1.52

83fe4871cf67

docker rmi image_name

docker rmi -f 172.18.8.104/rancher/coredns-coredns:1.6.5

docker rmi -f 172.18.8.104/rancher/coredns-coredns:v3.4.3-rancher1

docker rmi hub.doge.net/ubuntu:latest

保存鏡像

  • docker export 鏡像id -o /home/mysql-export.tar
  • docker save 鏡像tag -o /home/mysql-export.tar

載入鏡像

  • docker import mysql-export.tar

Docker本地容器相關的操作

創建容器

創建名為"centos6"的容器,並在容器內部和宿主機中查看容器中的進程信息

 docker run -itd -p 6080:80 -p 6022:22 docker.io/lemonbar/centos6-ssh:latest

結果如下

[root@VM-4-17-centos ~]#    docker run -itd -p 80:80 -p 6022:22 docker.io/lemonbar/centos6-ssh:latest
Unable to find image 'lemonbar/centos6-ssh:latest' locally
latest: Pulling from lemonbar/centos6-ssh
a3ed95caeb02: Pull complete
f79eb1f22352: Pull complete
67c1aaa530c8: Pull complete
80447774eee7: Pull complete
6d67b3a80e5a: Pull complete
f1819e4b2f8f: Pull complete
09712b5b9acc: Pull complete
8bc987c5494f: Pull complete
c42b021d0ff2: Pull complete
Digest: sha256:093c2165b3c6fe05d5658343456f9b59bb7ecc690a7d3a112641c86083227dd1
Status: Downloaded newer image for lemonbar/centos6-ssh:latest
a4f1c9b8abcda78c8764cc285183dfa56cd1aa4ce6d111d4d9e77f3a57f3d5fc


查看活躍容器

docker ps

CONTAINER ID        IMAGE                                     COMMAND                  CREATED             STATUS                          PORTS                                              NAMES
a4f1c9b8abcd        lemonbar/centos6-ssh:latest               "/bin/sh -c '/usr/sb…"   32 seconds ago      Up 31 seconds                   0.0.0.0:6022->22/tcp, 0.0.0.0:6080->80/tcp         determined_curie

查看全部容器

docker ps -a

停止容器

docker stop id

刪除容器

docker rm id

查看容器的進程信息

docker top :查看容器中運行的進程信息,支持 ps 命令參數。

語法

docker top [OPTIONS] CONTAINER [ps OPTIONS]

容器運行時不一定有/bin/bash終端來交互執行top命令,而且容器還不一定有top命令,可以使用docker top來實現查看container中正在運行的進程。

Docker 1.11開始,Docker容器運行已經不是簡單的通過Docker daemon來啟動,而是集成了containerd、runC等多個組件。Docker服務啟動之后,我們也可以看見系統上啟動了dockerd、docker-containerd等進程,本文主要介紹新版Docker(1.11以后)每個部分的功能和作用。

查找容器名稱的命令

[root@localhost ~]# docker ps --format "{{.Names}}"

結果如下:

[root@VM-4-17-centos ~]# docker ps --format "{{.Names}}"
determined_curie
redis
nginx_slave
nginx_master
nginx_empty
loving_agnesi
pxc_proxy
pxc03
pxc02
pxc01
affectionate_austin
nostalgic_blackwell

說明:本文會以pdf格式持續更新,更多最新尼恩3高pdf筆記,請從下面的鏈接獲取:語雀 或者 碼雲

在容器內部和宿主機中查看容器中的進程信息

docker exec -it determined_curie  ps -ef

結果如下:

[root@VM-4-17-centos ~]# docker exec -it determined_curie  ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 08:14 pts/0    00:00:00 /usr/sbin/sshd -D
root         5     0  0 08:16 pts/1    00:00:00 ps -ef

我們可以使用docker exec命令進入容器PID名空間,並執行應用。

通過ps -ef命令,可以看到每個determined_curie 容器都包含一個PID為1的進程,"/usr/sbin/sshd",它是容器的啟動進程,具有特殊意義。

利用docker top命令,可以讓我們從宿主機操作系統中看到容器的進程信息。

[root@VM-4-17-centos ~]# docker top determined_curie
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                27880               27866               0                   16:14               pts/0               00:00:00            /usr/sbin/sshd -D
[root@VM-4-17-centos ~]#

查看其父進程信息

root     17205  1414  0 16:37 pts/0    00:00:00 grep --color=auto 27866
root     27866  5587  0 16:14 ?        00:00:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/a4f1c9b8abcda78c8764cc285183dfa56cd1aa4ce6d111d4d9e77f3a57f3d5fc -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root     27880 27866  0 16:14 pts/0    00:00:00 /usr/sbin/sshd -D

查看子進程信息

[root@VM-4-17-centos ~]#  ps aux | grep 27880
root     17777  0.0  0.0 115928  1008 pts/0    S+   16:38   0:00 grep --color=auto 27880
root     27880  0.0  0.0  66664  3072 pts/0    Ss+  16:14   0:00 /usr/sbin/sshd -D

總計三個命令

ps -ef | grep 4948 #查看父進程
ps aux | grep 27880 #查看子進程(容器)
docker ps -a | grep determined_curie   #定位容器id

再啟動一個 centos 容器

 docker run -itd  --name centos6-2  -p 6081:80 -p 6021:22 docker.io/lemonbar/centos6-ssh:latest

輸出如下:

[root@VM-4-17-centos ~]# docker run -itd  --name centos6-2  -p 6081:80 -p 6021:22 docker.io/lemonbar/centos6-ssh:latest
460d688239304172f39bb9586bfc5959e0c3db64e7c3a0937f1003f94408ebbd

查看進程信息

利用docker top命令,可以讓我們從宿主機操作系統中看到容器的進程信息。

[root@VM-4-17-centos ~]# docker top centos6-2
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                4962                4948                0                   16:24               pts/0               00:00:00            /usr/sbin/sshd -D


查看其父進程信息

[root@VM-4-17-centos ~]# ps -ef | grep 4948
root      4948  5587  0 16:24 ?        00:00:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/460d688239304172f39bb9586bfc5959e0c3db64e7c3a0937f1003f94408ebbd -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      4962  4948  0 16:24 pts/0    00:00:00 /usr/sbin/sshd -D

查看子進程信息

[root@VM-4-17-centos ~]# ps aux | grep 4962
root      4962  0.0  0.0  66664  3068 pts/0    Ss+  16:24   0:00 /usr/sbin/sshd -D
root     15311  0.0  0.0 115932  1008 pts/0    S+   16:35   0:00 grep --color=auto 4962

總計三個命令

ps -ef | grep 4948 #查看父進程
ps aux | grep 4962 #查看子進程(容器)
docker ps -a | grep centos6-2  #定位容器id

進程的對應關系

Linux通過進程ID查看文件路徑

子進程的文件路徑

[root@VM-4-17-centos ~]#  ls -l /proc/27880
total 0
dr-xr-xr-x 2 root root 0 Nov  3 16:41 attr
-rw-r--r-- 1 root root 0 Nov  3 16:41 autogroup
-r-------- 1 root root 0 Nov  3 16:41 auxv
-r--r--r-- 1 root root 0 Nov  3 16:14 cgroup
--w------- 1 root root 0 Nov  3 16:41 clear_refs
-r--r--r-- 1 root root 0 Nov  3 16:15 cmdline
-rw-r--r-- 1 root root 0 Nov  3 16:41 comm
-rw-r--r-- 1 root root 0 Nov  3 16:41 coredump_filter
-r--r--r-- 1 root root 0 Nov  3 16:41 cpuset
lrwxrwxrwx 1 root root 0 Nov  3 16:41 cwd -> /
-r-------- 1 root root 0 Nov  3 16:41 environ
lrwxrwxrwx 1 root root 0 Nov  3 16:14 exe -> /usr/sbin/sshd
dr-x------ 2 root root 0 Nov  3 16:14 fd
dr-x------ 2 root root 0 Nov  3 16:41 fdinfo
-rw-r--r-- 1 root root 0 Nov  3 16:41 gid_map
-r-------- 1 root root 0 Nov  3 16:41 io
-r--r--r-- 1 root root 0 Nov  3 16:41 limits
-rw-r--r-- 1 root root 0 Nov  3 16:41 loginuid
dr-x------ 2 root root 0 Nov  3 16:41 map_files
-r--r--r-- 1 root root 0 Nov  3 16:41 maps
-rw------- 1 root root 0 Nov  3 16:41 mem
-r--r--r-- 1 root root 0 Nov  3 16:14 mountinfo
-r--r--r-- 1 root root 0 Nov  3 16:41 mounts
-r-------- 1 root root 0 Nov  3 16:41 mountstats
dr-xr-xr-x 5 root root 0 Nov  3 16:41 net
dr-x--x--x 2 root root 0 Nov  3 16:14 ns
-r--r--r-- 1 root root 0 Nov  3 16:41 numa_maps
-rw-r--r-- 1 root root 0 Nov  3 16:41 oom_adj
-r--r--r-- 1 root root 0 Nov  3 16:41 oom_score
-rw-r--r-- 1 root root 0 Nov  3 16:41 oom_score_adj
-r--r--r-- 1 root root 0 Nov  3 16:41 pagemap
-r-------- 1 root root 0 Nov  3 16:41 patch_state
-r--r--r-- 1 root root 0 Nov  3 16:41 personality
-rw-r--r-- 1 root root 0 Nov  3 16:41 projid_map
lrwxrwxrwx 1 root root 0 Nov  3 16:41 root -> /
-rw-r--r-- 1 root root 0 Nov  3 16:41 sched
-r--r--r-- 1 root root 0 Nov  3 16:41 schedstat
-r--r--r-- 1 root root 0 Nov  3 16:41 sessionid
-rw-r--r-- 1 root root 0 Nov  3 16:41 setgroups
-r--r--r-- 1 root root 0 Nov  3 16:41 smaps
-r--r--r-- 1 root root 0 Nov  3 16:41 stack
-r--r--r-- 1 root root 0 Nov  3 16:14 stat
-r--r--r-- 1 root root 0 Nov  3 16:41 statm
-r--r--r-- 1 root root 0 Nov  3 16:14 status
-r--r--r-- 1 root root 0 Nov  3 16:41 syscall
dr-xr-xr-x 3 root root 0 Nov  3 16:41 task
-r--r--r-- 1 root root 0 Nov  3 16:41 timers
-rw-r--r-- 1 root root 0 Nov  3 16:14 uid_map
-r--r--r-- 1 root root 0 Nov  3 16:41 wchan

以下是/proc目錄中進程27880的信息說明:

proc/27880 pid為N的進程信息

/proc/27880/cmdline 進程啟動命令

/proc/27880/cwd 鏈接到進程當前工作目錄

/proc/27880/environ 進程環境變量列表

/proc/27880/exe 鏈接到進程的執行命令文件

/proc/27880/fd 包含進程相關的所有的文件描述符

/proc/27880/maps 與進程相關的內存映射信息

/proc/27880/mem 指代進程持有的內存,不可讀

/proc/27880/root 鏈接到進程的根目錄

/proc/27880/stat 進程的狀態

/proc/27880/statm 進程使用的內存的狀態

/proc/27880/status 進程狀態信息,比stat/statm更具可讀性

容器的PID namespace(命名空間)

在Docker中,進程管理的基礎就是Linux內核中的PID名空間技術。

在不同PID名空間中,進程ID是獨立的;即在兩個不同名空間下的進程可以有相同的PID。

在Docker中,每個Container進程缺省都具有不同的PID名空間。通過名空間技術,Docker實現容器間的進程隔離。

docker中運行的容器進程,本質上還是運行在宿主機上的,所以也會擁有相對應的PID

找出容器ID
# docker ps

輸出

[root@VM-4-17-centos ~]# docker ps
CONTAINER ID        IMAGE                                     COMMAND                  CREATED             STATUS                          PORTS                                              NAMES
460d68823930        lemonbar/centos6-ssh:latest               "/bin/sh -c '/usr/sb…"   32 minutes ago      Up 32 minutes                   0.0.0.0:6021->22/tcp, 0.0.0.0:6081->80/tcp         centos6-2

查看容器信息

docker inspect  id

輸出

[root@VM-4-17-centos ~]# docker inspect  460d68823930
[root@VM-4-17-centos ~]#  docker inspect  460d68823930
[
    {
        "Id": "460d688239304172f39bb9586bfc5959e0c3db64e7c3a0937f1003f94408ebbd",
        "Created": "2021-11-03T08:24:36.934129599Z",
        "Path": "/bin/sh",
        "Args": [
            "-c",
            "/usr/sbin/sshd -D"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 4962,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2021-11-03T08:24:37.223255812Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:efd998bd6817af509d348b488e3ce4259f9f05632644a7bf574b785bbc8950b8",
        "ResolvConfPath": "/var/lib/docker/containers/460d688239304172f39bb9586bfc5959e0c3db64e7c3a0937f1003f94408ebbd/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/460d688239304172f39bb9586bfc5959e0c3db64e7c3a0937f1003f94408ebbd/hostname",
        "HostsPath": "/var/lib/docker/containers/460d688239304172f39bb9586bfc5959e0c3db64e7c3a0937f1003f94408ebbd/hosts",
        "LogPath": "/var/lib/docker/containers/460d688239304172f39bb9586bfc5959e0c3db64e7c3a0937f1003f94408ebbd/460d688239304172f39bb9586bfc5959e0c3db64e7c3a0937f1003f94408ebbd-json.log",
        "Name": "/centos6-2",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {
                "22/tcp": [
                    {
                        "HostIp": "",
                        "HostPort": "6021"
                    }
                ],
                "80/tcp": [
                    {
                        "HostIp": "",
                        "HostPort": "6081"
                    }
                ]
            },
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "shareable",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DiskQuota": 0,
            "KernelMemory": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": false,
            "PidsLimit": 0,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0
        },
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/6835c1b48237aafe27e2efabeda92a3a6623f254f88d54b5e6acce454e560dd6-init/diff:/var/lib/docker/overlay2/7139bf0b716c6e0b6a0c709b7043466f9bbfd7024f8ae584061c00b0bd97348c/diff:/var/lib/docker/overlay2/66a3e278259cdcf50741ce30a115baa3bd6247a60c487e4118e85f2f39328f11/diff:/var/lib/docker/overlay2/20e22c4c28ebadb615eb4c7c290253d3eb91cb49722ee2931b0ee628352a5857/diff:/var/lib/docker/overlay2/a3fa9dbebc83a853083205b8f7921c632cd67f64531f4a25cab419a43172e3ae/diff:/var/lib/docker/overlay2/3af7958c9a4e54d24598058a9fa1e85eb35e3d40f766fa498a674b52724ae73e/diff:/var/lib/docker/overlay2/becb65af4396137ed41fe6d516e834e6e6e9120f4edfac8e2ca8dd67cce23268/diff:/var/lib/docker/overlay2/fef055305158cc96906514c447f0eaea05945138896b0b35ac4146b6a2a3e273/diff:/var/lib/docker/overlay2/79158cdf3ba832493ab0d02d560c784208fe51c74236a5a86f7fb4fb50ab6e44/diff:/var/lib/docker/overlay2/86258a18e1110582b819719593687f11f0404d00a41667b3432c3b974fb1ce42/diff:/var/lib/docker/overlay2/8826b2e0068653fb2c5e8a3dbf839470e2b8eef8cf752b5fe901bea1b210849f/diff:/var/lib/docker/overlay2/145301e2738a8a7581c2bbd5beb9bf7a49b247e46642b8084efbc026a1826116/diff:/var/lib/docker/overlay2/f621f37535e0db1fe44902e22dba7ef0844b9a8b562a9daa39a842a49e9cc9bb/diff:/var/lib/docker/overlay2/7b493e4a97907aaa18b97ad2e9120b5bf87c0e9908ee390a35ea6ff546d8cec6/diff",
                "MergedDir": "/var/lib/docker/overlay2/6835c1b48237aafe27e2efabeda92a3a6623f254f88d54b5e6acce454e560dd6/merged",
                "UpperDir": "/var/lib/docker/overlay2/6835c1b48237aafe27e2efabeda92a3a6623f254f88d54b5e6acce454e560dd6/diff",
                "WorkDir": "/var/lib/docker/overlay2/6835c1b48237aafe27e2efabeda92a3a6623f254f88d54b5e6acce454e560dd6/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [],
        "Config": {
            "Hostname": "460d68823930",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "22/tcp": {},
                "80/tcp": {}
            },
            "Tty": true,
            "OpenStdin": true,
            "StdinOnce": false,
            "Env": [
                "HOME=/",
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "/usr/sbin/sshd -D"
            ],
            "Image": "docker.io/lemonbar/centos6-ssh:latest",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {}
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "ea66261fb6d8089d5b2d585a2dc32b2003365df7118f5f5e898a152fb5b35773",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "22/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "6021"
                    }
                ],
                "80/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "6081"
                    }
                ]
            },
            "SandboxKey": "/var/run/docker/netns/ea66261fb6d8",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "09ad719a4e9115ee56c5fb0f5b0d39c50bf5acaf0a1afacedc13969c82a2969f",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.6",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:06",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "2586283d16a08210c955d705f05e0f6999b59523a84b0c163e33f535af809ddd",
                    "EndpointID": "09ad719a4e9115ee56c5fb0f5b0d39c50bf5acaf0a1afacedc13969c82a2969f",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.6",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:06",
                    "DriverOpts": null
                }
            }
        }
    }
]

進入相應目錄

# cd /sys/fs/cgroup/memory/docker/460d688239304172f39bb9586bfc5959e0c3db64e7c3a0937f1003f94408ebbd/

輸出

 cd /sys/fs/cgroup/memory/docker/460d688239304172f39bb9586bfc5959e0c3db64e7c3a0937f1003f94408ebbd/
[root@VM-4-17-centos 460d688239304172f39bb9586bfc5959e0c3db64e7c3a0937f1003f94408ebbd]# ll
total 0
-rw-r--r-- 1 root root 0 Nov  3 16:24 cgroup.clone_children
--w--w--w- 1 root root 0 Nov  3 16:24 cgroup.event_control
-rw-r--r-- 1 root root 0 Nov  3 16:24 cgroup.procs
-rw-r--r-- 1 root root 0 Nov  3 16:24 memory.failcnt
--w------- 1 root root 0 Nov  3 16:24 memory.force_empty
-rw-r--r-- 1 root root 0 Nov  3 16:24 memory.kmem.failcnt
-rw-r--r-- 1 root root 0 Nov  3 16:24 memory.kmem.limit_in_bytes
-rw-r--r-- 1 root root 0 Nov  3 16:24 memory.kmem.max_usage_in_bytes
-r--r--r-- 1 root root 0 Nov  3 16:24 memory.kmem.slabinfo
-rw-r--r-- 1 root root 0 Nov  3 16:24 memory.kmem.tcp.failcnt
-rw-r--r-- 1 root root 0 Nov  3 16:24 memory.kmem.tcp.limit_in_bytes
-rw-r--r-- 1 root root 0 Nov  3 16:24 memory.kmem.tcp.max_usage_in_bytes
-r--r--r-- 1 root root 0 Nov  3 16:24 memory.kmem.tcp.usage_in_bytes
-r--r--r-- 1 root root 0 Nov  3 16:24 memory.kmem.usage_in_bytes
-rw-r--r-- 1 root root 0 Nov  3 16:24 memory.limit_in_bytes
-rw-r--r-- 1 root root 0 Nov  3 16:24 memory.max_usage_in_bytes
-rw-r--r-- 1 root root 0 Nov  3 16:24 memory.memsw.failcnt
-rw-r--r-- 1 root root 0 Nov  3 16:24 memory.memsw.limit_in_bytes
-rw-r--r-- 1 root root 0 Nov  3 16:24 memory.memsw.max_usage_in_bytes
-r--r--r-- 1 root root 0 Nov  3 16:24 memory.memsw.usage_in_bytes
-rw-r--r-- 1 root root 0 Nov  3 16:24 memory.move_charge_at_immigrate
-r--r--r-- 1 root root 0 Nov  3 16:24 memory.numa_stat
-rw-r--r-- 1 root root 0 Nov  3 16:24 memory.oom_control
---------- 1 root root 0 Nov  3 16:24 memory.pressure_level
-rw-r--r-- 1 root root 0 Nov  3 16:24 memory.soft_limit_in_bytes
-r--r--r-- 1 root root 0 Nov  3 16:24 memory.stat
-rw-r--r-- 1 root root 0 Nov  3 16:24 memory.swappiness
-r--r--r-- 1 root root 0 Nov  3 16:24 memory.usage_in_bytes
-rw-r--r-- 1 root root 0 Nov  3 16:24 memory.use_hierarchy
-rw-r--r-- 1 root root 0 Nov  3 16:24 notify_on_release
-rw-r--r-- 1 root root 0 Nov  3 16:24 tasks

[root@VM-4-17-centos 460d688239304172f39bb9586bfc5959e0c3db64e7c3a0937f1003f94408ebbd]# cat cgroup.procs
4962
11539
[root@VM-4-17-centos 460d688239304172f39bb9586bfc5959e0c3db64e7c3a0937f1003f94408ebbd]# cat pids.max
max
[root@VM-4-17-centos 460d688239304172f39bb9586bfc5959e0c3db64e7c3a0937f1003f94408ebbd]# cat tasks
4962
11539
[root@VM-4-17-centos 460d688239304172f39bb9586bfc5959e0c3db64e7c3a0937f1003f94408ebbd]# cat cgroup.clone_children
0
[root@VM-4-17-centos 460d688239304172f39bb9586bfc5959e0c3db64e7c3a0937f1003f94408ebbd]# pwd
/sys/fs/cgroup/pids/docker/460d688239304172f39bb9586bfc5959e0c3db64e7c3a0937f1003f94408ebbd

查看容器目錄里的進程號

進程號就存在一個文件里面

[root@VM-4-17-centos 460d688239304172f39bb9586bfc5959e0c3db64e7c3a0937f1003f94408ebbd]# 
cat cgroup.procs
4962

與前面利用docker top命令,可以讓我們從宿主機操作系統中看到容器的進程信息。

[root@VM-4-17-centos ~]# docker top centos6-2
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                4962                4948                0                   16:24               pts/0               00:00:00            /usr/sbin/sshd -D


啟動一個進程

我們下面會在 centos6-2容器中,利用docker exec命令啟動一個"sleep"進程

[root@VM-4-17-centos ]# docker exec -d  centos6-2  sleep 2000
[root@VM-4-17-centos ]# docker exec  centos6-2  ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 08:24 pts/0    00:00:00 /usr/sbin/sshd -D
root         6     0  0 09:06 ?        00:00:00 sleep 2000
root        10     0  0 09:06 ?        00:00:00 ps -ef


查看宿主機的進程號

[root@VM-4-17-centos ]#  docker top centos6-2
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                4962                4948                0                   16:24               pts/0               00:00:00            /usr/sbin/sshd -D
root                11539               4948                0                   17:06               ?                   00:00:00            sleep 2000

我們可以清楚的看到exec命令創建的sleep進程屬 centos6-2 容器的名空間,但是它的父進程是Docker 容器的啟動進程。

查看容器目錄里的進程號

進程號就存在一個文件里面

[root@VM-4-17-centos 460d688239304172f39bb9586bfc5959e0c3db64e7c3a0937f1003f94408ebbd]# cat cgroup.procs
4962
11539


 docker exec -d  centos6-2 pstree -p
 
 docker exec -d  centos6-2 ps -auxf
 
  docker exec -d  centos6-2 ll /proc

輸出

[root@VM-4-17-centos docker]#  docker exec  centos6-2  ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 08:24 pts/0    00:00:00 /usr/sbin/sshd -D
root         6     0  0 09:06 ?        00:00:00 sleep 2000
root        40     0  0 09:26 ?        00:00:00 ps -ef
[root@VM-4-17-centos docker]#  docker exec  centos6-2  ps -auxf
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root        44  0.0  0.0  13360  1012 ?        Rs   09:26   0:00 ps -auxf
root         6  0.0  0.0   4120   316 ?        Ss   09:06   0:00 sleep 2000
root         1  0.0  0.0  66664  3068 pts/0    Ss+  08:24   0:00 /usr/sbin/sshd -D
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
[root@VM-4-17-centos docker]#  docker exec  centos6-2  pstree -p
sshd(1)

說明:本文會以pdf格式持續更新,更多最新尼恩3高pdf筆記,請從下面的鏈接獲取:語雀 或者 碼雲

Docker文件目錄和容器內部操作

Docker默認的文件目錄位於Linux server的/var/lib/docker 下面。目錄結構如下

img

|-----containers:用於存儲容器信息

|-----image:用來存儲鏡像中間件及本身信息,大小,依賴信息

|-----network

|-----swarm

|-----tmp:docker臨時目錄

|-----trust:docker信任目錄

|-----volumes:docker卷目錄

還可以通過docker指令確認文件位置:

docker info

img

查看某個容器的文件目錄:

 docker exec 容器name ls

img

 docker exec centos6-2   ls /proc
[root@VM-4-17-centos containers]#  docker exec centos6-2  ls /proc
1
103
acpi
buddyinfo
bus
cgroups
cmdline
consoles
cpuinfo
crypto
devices
diskstats
dma
driver
execdomains
fb
filesystems
fs
interrupts
iomem
ioports
irq
kallsyms
kcore
key-users
keys
kmsg
kpagecount
kpageflags
loadavg
locks
mdstat
meminfo
misc
modules
mounts
mtrr
net
pagetypeinfo
partitions
sched_debug
schedstat
scsi
self
slabinfo
softirqs
stat
swaps
sys
sysrq-trigger
sysvipc
timer_list
timer_stats
tty
uptime
version
vmallocinfo
vmstat
zoneinfo

docker daemon (docker守護進程)

pidof dockerd   #查看docker守護進程pid
lsof -p 3197 | wc -l #docker守護進程打開的文件數

在兩個容器中的"centos "是兩個獨立的進程,但是他們擁有相同的父進程 Docker Daemon。

所以Docker可以父子進程的方式在Docker Daemon和Redis容器之間進行交互。

另一個值得注意的方面是,docker exec命令可以進入指定的容器內部執行命令。由它啟動的進程屬於容器的namespace和相應的cgroup。

但是這些進程的父進程是Docker Daemon而非容器的PID1進程。

我們下面會在Redis容器中,利用docker exec命令啟動一個"sleep"進程

docker@default:~$ docker exec -d redis sleep 2000
docker@default:~$ docker exec redis ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
redis        1     0  0 02:26 ?        00:00:00 redis-server *:6379
root        11     0  0 02:26 ?        00:00:00 sleep 2000
root        21     0  0 02:29 ?        00:00:00 ps -ef
docker@default:~$ docker top redis
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
999                 9955                1264                0                   02:12               ?                   00:00:00            redis-server *:6379
root                9984                1264                0                   02:13               ?                   00:00:00            sleep 2000

我們可以清楚的看到exec命令創建的sleep進程屬Redis容器的名空間,但是它的父進程是Docker Daemon。

如果我們在宿主機操作系統中手動殺掉容器的啟動進程(在上文示例中是redis-server),容器會自動結束,而容器名空間中所有進程也會退出。

docker@default:~$ PID=$(docker inspect --format="{{.State.Pid}}" redis)
docker@default:~$ sudo kill $PID
docker@default:~$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
356eca186321        redis               "/entrypoint.sh redis"   23 minutes ago      Up 4 minutes               6379/tcp            redis2
f6bc57cc1b46        redis               "/entrypoint.sh redis"   23 minutes ago      Exited (0) 4 seconds ago                       redis

通過以上示例:

  • 每個容器有獨立的PID名空間,
  • 容器的生命周期和其PID1進程一致
  • 利用docker exec可以進入到容器的名空間中啟動進程

說明:本文會以pdf格式持續更新,更多最新尼恩3高pdf筆記,請從下面的鏈接獲取:語雀 或者 碼雲

Docker Daemon 原理

作為Docker容器管理的守護進程,Docker Daemon從最初集成在docker命令中(1.11版本前),到后來的獨立成單獨二進制程序(1.11版本開始),其功能正在逐漸拆分細化,被分配到各個單獨的模塊中去。

演進:Docker守護進程啟動

從Docker服務的啟動腳本,也能看見守護進程的逐漸剝離:

在Docker 1.8之前,Docker守護進程啟動的命令為:

docker -d

這個階段,守護進程看上去只是Docker client的一個選項。

Docker 1.8開始,啟動命令變成了:

docker daemon

這個階段,守護進程看上去是docker命令的一個模塊。

Docker 1.11開始,守護進程啟動命令變成了:

dockerd

其服務的配置文件為:


[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID

此時已經和Docker client分離,獨立成一個二進制程序了。

當然,守護進程模塊不停的在重構,其基本功能和定位沒有變化。和一般的CS架構系統一樣,守護進程負責和Docker client交互,並管理Docker鏡像、容器。

OCI(Open Container Initiative)

Open Container Initiative,也就是常說的OCI,是由多家公司共同成立的項目,並由linux基金會進行管理,致力於container runtime的標准的制定和runc的開發等工作。
官方的介紹是

An open governance structure for the express purpose of creating open industry standards around container formats and runtime. – Open Containers Official Site

所謂container runtime,主要負責的是容器的生命周期的管理。oci的runtime spec標准中對於容器的狀態描述,以及對於容器的創建、刪除、查看等操作進行了定義。

目前主要有兩個標准文檔:容器運行時標准 (runtime spec)和 容器鏡像標准(image spec)。
這兩個協議通過 OCI runtime filesytem bundle 的標准格式連接在一起,OCI 鏡像可以通過工具轉換成 bundle,然后 OCI 容器引擎能夠識別這個 bundle 來運行容器。
在這里插入圖片描述

image spec

OCI 容器鏡像主要包括幾塊內容:

文件系統:以 layer 保存的文件系統,每個 layer 保存了和上層之間變化的部分,layer 應該保存哪些文件,怎么表示增加、修改和刪除的文件等
config 文件:保存了文件系統的層級信息(每個層級的 hash 值,以及歷史信息),以及容器運行時需要的一些信息(比如環境變量、工作目錄、命令參數、mount 列表),指定了鏡像在某個特定平台和系統的配置。比較接近我們使用 docker inspect <image_id> 看到的內容
manifest 文件:鏡像的 config 文件索引,有哪些 layer,額外的 annotation 信息,manifest 文件中保存了很多和當前平台有關的信息
index 文件:可選的文件,指向不同平台的 manifest 文件,這個文件能保證一個鏡像可以跨平台使用,每個平台擁有不同的 manifest 文件,使用 index 作為索引

runtime spec

OCI 對容器 runtime 的標准主要是指定容器的運行狀態,和 runtime 需要提供的命令。下圖可以是容器狀態轉換圖:
在這里插入圖片描述

Docker CLI

/usr/bin/docker

Docker 的客戶端工具,通過CLI與 dockerd API 交流。 CLI 的例子比如docker build … docker run …

Docker Daemon

/usr/bin/dockerd

當然,守護進程模塊不停的在重構,其基本功能和定位沒有變化。和一般的CS架構系統一樣,守護進程負責和Docker client交互,並管理Docker鏡像、容器。

Containerd

/usr/bin/docker-containerd

containerd是容器技術標准化之后的產物,為了能夠兼容OCI標准,將容器運行時及其管理功能從Docker Daemon剝離。理論上,即使不運行dockerd,也能夠直接通過containerd來管理容器。(當然,containerd本身也只是一個守護進程,容器的實際運行時由后面介紹的runC控制。)
最近,Docker剛剛宣布開源containerd。從其項目介紹頁面可以看出,containerd主要職責是鏡像管理(鏡像、元信息等)、容器執行(調用最終運行時組件執行)。

containerd向上為Docker Daemon提供了gRPC接口,使得Docker Daemon屏蔽下面的結構變化,確保原有接口向下兼容。向下通過containerd-shim結合runC,使得引擎可以獨立升級,避免之前Docker Daemon升級會導致所有容器不可用的問題。
在這里插入圖片描述
在這里插入圖片描述
containerd fully leverages the OCI runtime specification1, image format specifications and OCI reference implementation (runc).
containerd includes a daemon exposing gRPC API over a local UNIX socket. The API is a low-level one designed for higher layers to wrap and extend. Containerd uses RunC to run containers according to the OCI specification.

docker-shim

/usr/bin/docker-containerd-shim

每啟動一個容器都會起一個新的docker-shim的一個進程.
他直接通過指定的三個參數來創建一個容器:

  1. 容器id
  2. boundle目錄(containerd的對應某個容器生成的目錄,一般位於:/var/run/docker/libcontainerd/containerID)
  3. 運行是二進制(默認為runc)來調用runc的api(比如創建容器時,最后拼裝的命令如下:runc create 。。。)

他的作用是:

  1. 它允許容器運行時(即 runC)在啟動容器之后退出,簡單說就是不必為每個容器一直運行一個容器運行時(runC)
  2. 即使在 containerd 和 dockerd 都掛掉的情況下,容器的標准 IO 和其它的文件描述符也都是可用的
  3. 向 containerd 報告容器的退出狀態
    前兩點尤其重要,有了它們就可以在不中斷容器運行的情況下升級或重啟 dockerd(這對於生產環境來說意義重大)。

runc (OCI reference implementation)

/usr/bin/docker-runc 

OCI定義了容器運行時標准OCI Runtime Spec support (aka runC),runC是Docker按照開放容器格式標准(OCF, Open Container Format)制定的一種具體實現。

runC是從Docker的libcontainer中遷移而來的,實現了容器啟停、資源隔離等功能。

Docker默認提供了docker-runc實現,事實上,通過containerd的封裝,可以在Docker Daemon啟動的時候指定runc的實現。

我們可以通過啟動Docker Daemon時增加–add-runtime參數來選擇其他的runC現。例如:

docker daemon --add-runtime "custom=/usr/local/bin/my-runc-replacement"

Docker、containerd, containerd-shim和runc之間的關系

在這里插入圖片描述
他們之間的關系如下圖:

這里寫圖片描述

我們可以通過啟動一個Docker容器,來觀察進程之間的關聯。

通過docker 而通過runc來啟動一個container的過程

查看進程信息

利用docker top命令,可以讓我們從宿主機操作系統中看到容器的進程信息。

[root@VM-4-17-centos ~]# docker top centos6-2
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                4962                4948                0                   16:24               pts/0               00:00:00            /usr/sbin/sshd -D


查看子進程信息


[root@VM-4-17-centos containerd]# ps aux | grep 4948
root      4948  0.0  0.0  12212  3696 ?        Sl   16:24   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/460d688239304172f39bb9586bfc5959e0c3db64e7c3a0937f1003f94408ebbd -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root     27040  0.0  0.0 115932  1004 pts/0    S+   18:32   0:00 grep --color=auto 4948

查看進程樹

pstree -l -a -A 4948 -p

輸出結果如下:

[root@VM-4-17-centos containerd]# pstree -l -a -A 4948 -p
docker-containe,4948 -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/460d688239304172f39bb9586bfc5959e0c3db64e7c3a0937f1003f94408ebbd -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
  |-sshd,4962 -D
  |-{docker-containe},4949
  |-{docker-containe},4950
  |-{docker-containe},4951
  |-{docker-containe},4952
  |-{docker-containe},4953
  |-{docker-containe},4954
  `-{docker-containe},1593


雖然pstree命令截斷了命令,但我們還是能夠看出,當Docker daemon啟動之后,dockerd和docker-containerd進程一直存在。

當啟動容器之后,docker-containerd進程(也是這里介紹的containerd組件)會創建docker-containerd-shim進程,其中的參數460d688239304172f39bb9586bfc5959e0c3db64e7c3a0937f1003f94408ebbd就是要啟動容器的id。

最后docker-containerd-shim子進程,已經是實際在容器中運行的進程(既sleep 1000)。

docker-containerd-shim另一個參數,是一個和容器相關的目錄/var/run/docker/containerd/460d688239304172f39bb9586bfc5959e0c3db64e7c3a0937f1003f94408ebbd,里面的內容有:

[root@VM-4-17-centos containerd]# ll /var/run/docker/containerd/460d688239304172f39bb9586bfc5959e0c3db64e7c3a0937f1003f94408ebbd
total 0
prwx------ 1 root root 0 Nov  3 16:24 init-stdin
prwx------ 1 root root 0 Nov  3 16:24 init-stdout

其中包括了容器配置和標准輸入、標准輸出、標准錯誤三個管道文件。

docker-shim

docker-shim是一個真實運行的容器的真實墊片載體,每啟動一個容器都會起一個新的docker-shim的一個進程,
他直接通過指定的三個參數:容器id,boundle目錄(containerd的對應某個容器生成的目錄,一般位於:/var/run/docker/libcontainerd/containerID),
運行是二進制(默認為runc)來調用runc的api創建一個容器(比如創建容器:最后拼裝的命令如下:runc create 。。。。。)

RunC

OCI定義了容器運行時標准,runC是Docker按照開放容器格式標准(OCF, Open Container Format)制定的一種具體實現。

runC是從Docker的libcontainer中遷移而來的,實現了容器啟停、資源隔離等功能。Docker默認提供了docker-runc實現,事實上,通過containerd的封裝,可以在Docker Daemon啟動的時候指定runc的實現。

CRI

kubernetes在初期版本里,就對多個容器引擎做了兼容,因此可以使用docker、rkt對容器進行管理。以docker為例,kubelet中會啟動一個docker manager,通過直接調用docker的api進行容器的創建等操作。

在k8s 1.5版本之后,kubernetes推出了自己的運行時接口api–CRI(container runtime interface)。cri接口的推出,隔離了各個容器引擎之間的差異,而通過統一的接口與各個容器引擎之間進行互動。

與oci不同,cri與kubernetes的概念更加貼合,並緊密綁定。cri不僅定義了容器的生命周期的管理,還引入了k8s中pod的概念,並定義了管理pod的生命周期。

在kubernetes中,pod是由一組進行了資源限制的,在隔離環境中的容器組成。而這個隔離環境,稱之為PodSandbox。在cri開始之初,主要是支持docker和rkt兩種。其中kubelet是通過cri接口,調用docker-shim,並進一步調用docker api實現的。

如上文所述,docker獨立出來了containerd。kubernetes也順應潮流,孵化了cri-containerd項目,用以將containerd接入到cri的標准中。
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

為了進一步與oci進行兼容,kubernetes還孵化了cri-o,成為了架設在cri和oci之間的一座橋梁。通過這種方式,可以方便更多符合oci標准的容器運行時,接入kubernetes進行集成使用。可以預見到,通過cri-o,kubernetes在使用的兼容性和廣泛性上將會得到進一步加強。
在這里插入圖片描述

說明:本文會以pdf格式持續更新,更多最新尼恩3高pdf筆記,請從下面的鏈接獲取:語雀 或者 碼雲

安裝docker-compose

Docker-Compose 項目是Docker官方的開源項目,負責實現對Docker容器集群的快速編排。

Docker-Compose 項目由 Python 編寫,調用 Docker 服務提供的API來對容器進行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用Compose 來進行編排管理。

首先檢查 版本

[root@k8s-master ~]#  /usr/local/bin/docker-compose -version
docker-compose version 1.25.1, build a82fef07

如果安裝好了,就ok了,如果沒有安裝,則安裝docker

1.從github上下載docker-compose二進制文件安裝

下載最新版的docker-compose文件

# curl -L https://github.com/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

注明:離線安裝包已經提供。上傳后,復制到/usr/local/bin/即可

cp /root/docker-compose  /usr/local/bin/
 cp /vagrant/3G-middleware/docker-compose /usr/local/bin/

添加可執行權限

# chmod +x /usr/local/bin/docker-compose

測試安裝結果

 

[root@localhost ~]# docker-compose --version 
docker-compose version 1.25.1, build a82fef07


cp /root/docker-compose  /usr/local/bin/
chmod +x /usr/local/bin/docker-compose
 docker-compose --version

方式一:使用LVM進行docker磁盤擴容

背景,docker 導入鏡像,報磁盤空間沒有啦

LVM原理簡介:
LVM是 Logical Volume Manager(邏輯卷管理)的簡寫,它是Linux環境下對磁盤分區進行管理的一種機制,它由Heinz Mauelshagen在Linux 2.4內核上實現。
LVM包括Physical volume (PV)、Volume group (VG)、Logical volume(LV)、 Physical extent (PE)等概念,下圖簡單說明了物理卷(PV)、卷組(VG)、邏輯卷(LV)等關系。
在這里插入圖片描述

結合此場景,可以看出LVM在此處的作用是將多個小容量物理磁盤融合為一個大容量的卷組,然后擴容給docker

添加用於docker存儲的硬盤

在虛擬機中添加一塊物理的磁盤,重起虛擬機。

查看磁盤:

[root@cdh2 ~]# fdisk -l

Disk /dev/sda: 10.5 GB, 10485760000 bytes, 20480000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x0000ca5e

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     1026047      512000   83  Linux
/dev/sda2         1026048    20479999     9726976   8e  Linux LVM

Disk /dev/sdb: 8589 MB, 8589934592 bytes, 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mapper/centos-root: 8866 MB, 8866758656 bytes, 17317888 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mapper/centos-swap: 1048 MB, 1048576000 bytes, 2048000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

創建PV

[root@registry docker]# pvcreate /dev/sdb

創建VG

把pv加入vg中,相當於擴充vg的大小,先使用vgs查看vg組

[root@registry docker]# vgcreate datavg /dev/sdb

查看VG組(volume group):

[root@cdh2 ~]# vgs
  VG     #PV #LV #SN Attr   VSize VFree
  centos   1   2   0 wz--n- 9.27g 40.00m
  datavg   1   0   0 wz--n- 8.00g  8.00g
[

合並卷組

將卷組vg2合並到卷組vg1中:

vgmerge -v centos datavg

output


[root@cdh2 ~]# vgmerge -v centos datavg
    Checking for volume group "centos"
    Checking for volume group "datavg"
    Archiving volume group "datavg" metadata (seqno 1).
    Archiving volume group "centos" metadata (seqno 3).
    Writing out updated volume group
    Creating volume group backup "/etc/lvm/backup/centos" (seqno 4).
  Volume group "datavg" successfully merged into "centos"
[root@cdh2 ~]# vgs
  VG     #PV #LV #SN Attr   VSize  VFree
  centos   2   2   0 wz--n- 17.27g 8.04g

擴展lv

擴展lv,使用lvextend命令

lvextend -L +8G /dev/mapper/centos-root
lvextend -L +5G /dev/mapper/centos-root

output

[root@cdh2 ~]# lvextend -L +8G /dev/mapper/centos-root
  Size of logical volume centos/root changed from 8.26 GiB (2114 extents) to 16.26 GiB (4162 extents).
  Logical volume root successfully resized.
[

命令使系統重新讀取大小

xfs_growfs /dev/mapper/centos-root

xfs_growfs /dev/mapper/centos-root

output

[root@cdh2 ~]# xfs_growfs /dev/mapper/centos-root
meta-data=/dev/mapper/centos-root isize=256    agcount=4, agsize=541184 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0        finobt=0
data     =                       bsize=4096   blocks=2164736, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 2164736 to 4261888

再使用df -h查看

[root@cdh2 ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   17G  8.3G  8.1G  51% /
devtmpfs                 3.9G     0  3.9G   0% /dev
tmpfs                    3.9G  4.0K  3.9G   1% /dev/shm
tmpfs                    3.9G  8.6M  3.9G   1% /run
tmpfs                    3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/sda1                497M  164M  334M  33% /boot
tmpfs                    783M     0  783M   0% /run/user/0
none                     319G  142G  178G  45% /vagrant

方式2:將docker設置到新磁盤

背景,docker 導入鏡像,報磁盤空間沒有啦

查看磁盤

在虛擬機中添加一塊物理的磁盤,重起虛擬機。

查看磁盤:

[root@cdh2 ~]# fdisk -l

Disk /dev/sdb: 21.9 GB, 21892923392 bytes, 42759616 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/sda: 10.5 GB, 10485760000 bytes, 20480000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x0000ca5e

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     1026047      512000   83  Linux
/dev/sda2         1026048    20479999     9726976   8e  Linux LVM

Disk /dev/mapper/centos-root: 8866 MB, 8866758656 bytes, 17317888 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mapper/centos-swap: 1048 MB, 1048576000 bytes, 2048000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


磁盤分區

使用fdisk /dev/sdb進入菜單項,m是列出菜單,p是列出分區表,n是增加分區,w是保存並推出。由於這里增加的磁盤只有5G,因此5G划為一個區。

fdisk /dev/sdb

選項說明

m打印菜單
n新建分區
    p選擇主分區
    e選擇擴展分區
        1選擇分區號
            選擇初始位置,默認為1
            選擇結束為止,默認為磁盤結尾

分區創建完成,可以列表查看,保存退出

p打印分區表
w寫入分區表保存
q退出

過程的輸出

fdisk /dev/sdb
Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-42759615, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-42759615, default 42759615):
Using default value 42759615
Partition 1 of type Linux and of size 20.4 GiB is set

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

重新載入磁盤分區信息

無返回就是載入磁盤信息成功,針對磁盤進行操作

partprobe /dev/sdb

注意:
使用fdisk工具只是將分區信息寫到磁盤,
在格式化分區值前需要使用partprobe讓kernel重新讀取分區信息,如果不成功則需要重啟系統

對磁盤分區進行格式化

使用ext4文件系統

mkfs.ext4 /dev/sdb

過程的輸出

[root@cdh2 ~]# mkfs.ext4 /dev/sdb
mke2fs 1.42.9 (28-Dec-2013)
/dev/sdb is entire device, not just one partition!
Proceed anyway? (y,n) y
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
1338240 inodes, 5344952 blocks
267247 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2153775104
164 block groups
32768 blocks per group, 32768 fragments per group
8160 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

格式化完成后續優化配置,取消磁盤自檢

tune2fs -c -1 /dev/sdb

分區掛載

掛載磁盤分區到指定目錄


mkdir /var/lib/docker
 mount /dev/sdb /var/lib/docker

配置開機自動掛載分區

編輯 /etc/fstab,開機自動掛載

/etc/fstab 增加一行

vim /etc/fstab 


/dev/sdb               /var/lib/docker                ext4    errors=remount-ro 0 1

查看磁盤分區信息

[root@cdh2 ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root  8.3G  6.2G  2.2G  75% /
devtmpfs                 3.9G     0  3.9G   0% /dev
tmpfs                    3.9G   28K  3.9G   1% /dev/shm
tmpfs                    3.9G  8.6M  3.9G   1% /run
tmpfs                    3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/sda1                497M  164M  334M  33% /boot
tmpfs                    783M     0  783M   0% /run/user/0
none                     319G  142G  178G  45% /vagrant
/dev/sdb                  20G   45M   19G   1% /var/lib/docker

說明:本文會以pdf格式持續更新,更多最新尼恩3高pdf筆記,請從下面的鏈接獲取:語雀 或者 碼雲

參考文獻:

https://blog.csdn.net/qq_21222149/article/details/89201744
https://blog.csdn.net/warrior_0319/article/details/80073720
http://www.sel.zju.edu.cn/?p=840
http://alexander.holbreich.org/docker-components-explained/
https://www.cnblogs.com/sparkdev/p/9129334.htmls


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM