史上最全Docker教程,從容器發展史到實操演練(一)

Linux运维技术栈發表於2024-06-03

前言:今天我們所說的容器是一種 IT 技術。容器其實是一種沙盒技術。顧名思義,沙盒就是能夠像一個集裝箱一樣,把你的應用裝起來。這樣,應用與應用之間就有了邊界而不會相互干擾;同時裝在沙盒裡面的應用,也可以很方便的被搬來搬去,這也是 PaaS 想要的最理想的狀態(可移植性,標準化,隔離性)。容器是軟體工業上的集裝箱的技術,裝箱的標準化,減少了包裝成本,大大提高貨物運輸和裝卸效率,是傳統運輸行業的重大變革。早期的軟體專案中軟體更新,釋出低效,開發測試釋出週期很長,很難敏捷。有容器術,就可以利用其標準化的特點,大幅提高生產效率。容器技術是虛擬化、雲端計算、大資料之後的一門新興的並且是炙手可熱的新技術, 容器技術提高了硬體資源利用率、 方便了企業的業務快速橫向擴容(可以達到秒級快速擴容)、 實現了業務當機自愈功能(配合K8S可以實現,但OpenStack無此功能),因此未來數年會是一個容器愈發流行的時代 ,這是一個對於 IT 行業來說非常有影響和價值的技術,而對於IT行業的從業者來說, 熟練掌握容器,進而掌握雲原生技術,對個人的發展很有前景。

"下面我將幾年前的筆記和實操資料整理出來並展示給大家作為參考":

1 容器簡介

Docker是一個開源的引擎,可以輕鬆的為任何應用建立一個輕量級的、可移植的、自給自足的容器。開發者在筆記本上編譯測試透過的容器可以批次地在生產環境中部署,包括VMs(虛擬機器)、 bare metal、OpenStack 叢集和其他的基礎應用平臺。

1.1.1 什麼是Docker?

Docker (碼頭工人)是一個開源專案,誕生於 2013 年初,最初是 dotCloud 公司(後由於 Docker 開源後大受歡迎就將公司改名為 Docker Inc ,總部位於美國加州的舊金山)內部的一個開源的 PAAS 服務(Platform as a ServiceService )的業餘專案。它基於 Google 公司推出的 Go 語言實現。 專案後來加入了 Linux 基金會,遵從了 Apache 2.0 協議,專案程式碼在 GitHub 上進行維護。

Docker 是基於 linux 核心實現,Docker 最早採用 LXC 技術 ,LXC 是 Linux 原生支援的容器技術 ,可以提供輕量級的虛擬化 ,可以說 docker 就是基於 LXC 發展起來 的,提供 LXC 的高階封裝,標準的配置方法,在LXC的基礎之上,docker提供了一系列更強大的功能。而虛擬化技術 KVM(KernelKernelbased Virtual Machine Machine) 基於 模組實現, 後來Docker 改為自己研發並開源的 runc 技術執行容器,徹底拋棄了LXC。

Docker 相比虛擬機器的交付速度更快,資源消耗更低,Docker 採用客戶端/服務端架構,使用遠端API來管理和建立容器,其可以輕鬆的建立一個輕量級的、可移植的、自給自足的容器,docker 的三大理念是build(構建)、ship(運輸)、 run(執行),Docker遵從apache 2.0協議,並透過(namespace及cgroup等)來提供容器的資源隔離與安全保障等,所以Docke容器在執行時不需要類似虛擬機器(空執行的虛擬機器佔用物理機6-8%效能)的額外資源開銷,因此可以大幅提高資源利用率,總而言之Docker是一種用了新穎方式實現的輕量級虛擬機器.類似於VM但是在原理和應用上和VM的差別還是很大的,並且docker的專業叫法是應用容器(Application Container)。
Docker的主要目標
Build, Ship and Run Any App, Anywhere,即透過對應用元件的封裝(Packaging)、分發(Distribution)、部署(Deployment)、執行(Runtime)等生命週期的管理,達到應用元件級別的“一次封裝,到處執行”。這裡的應用元件,既可以是一個Web應用,也可以是一套資料庫服務,甚至是一個作業系統。將應用執行在Docker 容器上,可以實現跨平臺,跨伺服器,只需一次配置準備好相關的應用環境,即可實現到處執行,保證研發和生產環境的一致性,解決了應用和執行環境的相容性問題,從而極大提升了部署效率,減少故障的可能性

1.1.1.1 Docker通常用場景:

  • web應用的自動化打包和釋出;
  • 自動化測試和持續整合、釋出;
  • 在服務型環境中部署和調整資料庫或其他的後臺應用;
  • 從頭編譯或者擴充套件現有的OpenShift或Cloud Foundry平臺來搭建自己的PaaS環境;

1.1.1.2 容器發展歷史

雖然 docker 把容器技術推向了巔峰,但容器技術卻不是從 docker 誕生的。實際上,容器技術連新技術都算不上,因為它的誕生和使用確實有些年頭了。下面的一串名稱可能有的你都沒有聽說過,但它們的確都是容器技術的應用:

1、Chroot Jail
就是我們常見的 chroot 命令的用法。它在 1979 年的時候就出現了,被認為是最早的容器化技術之一。它可以把一個程序的檔案系統隔離起來。

2、The FreeBSD Jail
Freebsd Jail 實現了作業系統級別的虛擬化,它是作業系統級別虛擬化技術的先驅之一。

3、Linux VServer
使用新增到 Linux 核心的系統級別的虛擬化功能實現的專用虛擬伺服器。

4、Solaris Containers
它也是作業系統級別的虛擬化技術,專為 X86 和 SPARC 系統設計。Solaris 容器是系統資源控制和透過"區域" 提供邊界隔離的組合。

5、OpenVZ
OpenVZ 是一種 Linux 中作業系統級別的虛擬化技術。 它允許建立多個安全隔離的 Linux 容器,即VPS。

6、Process Containers
Process 容器由 Google 的工程師開發,一般被稱為 cgroups。

7、LXC
LXC為Linux Container的簡寫。可以提供輕量級的虛擬化,以便隔離程序和資源,而且不需要提供指令解釋機制以及全虛擬化的其他複雜性。容器有效地將由單個作業系統管理的資源劃分到孤立的組中,以更好地在孤立的組之間平衡有衝突的資源使用需求Linux Container提供了在單一可控主機節點上支援多個相互隔離的server container同時執行的機制。Linux Container有點像chroot,提供了一個擁有自己程序和網路空間的虛擬環境,但又有別於虛擬機器,因為lxc是一種作業系統層次上的資源的虛擬化。

8、Warden
在最初階段,Warden 使用 LXC 作為容器執行時。 如今已被 CloudFoundy 取代。

9、LMCTFY
LMCTY 是 Let me contain that for you 的縮寫。它是 Google 的容器技術棧的開源版本。Google 的工程師一直在與 docker 的 libertainer 團隊合作,並將 libertainer 的核心概念進行抽象並移植到此專案中。該專案的進展不明,估計會被 libcontainer 取代。

10、Docker
Docker 是一個可以將應用程式及其依賴打包到幾乎可以在任何伺服器上執行的容器的工具。

11、RKT
RKT 是 Rocket 的縮寫,它是一個專注於安全和開放標準的應用程式容器引擎。正如我們所看到的,docker 並不是第一個容器化技術,但它的確是最知名的一個。
使用Docker 容器化封裝應用程式的意義:
傳統的部署方式分別需要在開發、測試和生產環境上安裝、配置和維護應用程式;而使用容器只需要拉取映象,工作量幾乎縮小了三倍,而且不需要考慮作業系統、服務應用等相容性的問題。

  • 統一基礎設施環境-docker環境
    硬體的組成配置
    作業系統的版本
    執行時環境的異構
  • 統一程式打包(裝箱)方式-docker映象
    java程式
    python程式
    nodejs程式
  • 統一程式部署(執行)方式-docker容器
    java-jar...→ docker run...
    python manage.py runserver... → docker run...
    npm run dev ... → docker run...

Docker 的組成
docker 官網: http://www.docker.com
幫助文件連結: https://docs.docker.com/
docker 映象: https://hub.docker.com/
docker 中文網站: http://www.docker.org.cn/

  • Docker 主機(Host): 一個物理機或虛擬機器,用於執行Docker服務程序和容器,也稱為宿主機,node節點
  • Docker 服務端(Server): Docker守護程序,執行docker容器
  • Docker 客戶端(Client): 客戶端使用docker 命令或其他工具呼叫docker API
  • Docker 倉庫(Registry): 儲存映象的倉庫,官方倉庫: https://hub.docker.com/,可以搭建私有倉庫harbor
  • Docker 映象(Images): 映象可以理解為建立例項使用的模板,相當於RPM或DEB包
  • Docker 容器(Container): 容器是從映象生成對外提供服務的一個或一組服務 ,相當於將RPM包中的程式執行起來

1.1.2 容器管理工具

1.1.2.1 LXC

lxc啟動容器依賴於模板,清華模板源: https://mirrors.tuna.tsinghua.edu.cn/help/lxc-images/,但是做模板相對較難,需要手動一步步創構建檔案系統、準備基礎目錄及可執行程式等,而且在大規模使用容器的場景很難橫向擴充套件,另外後期程式碼升級也需要重新從頭構建模板,基於以上種種原因便有了docker

1.1.2.2 docker

Docker 啟動一個容器也需要一個外部模板,也稱為映象,docke的映象可以儲存在一個公共的地方共享使用,只要把映象下載下來就可以使用,最主要的是可以在映象基礎之上做自定義配置並且可以再把其提交為一個映象,一個映象可以被啟動為多個容器。
Docker的映象是分層的,映象底層為庫檔案且只讀層即不能寫入也不能刪除資料,從映象載入啟動為一個容器後會生成一個可寫層,其寫入的資料會複製到宿主機上對應容器的目錄,但是容器內的資料在刪除容器後也會被隨之刪除。

1.1.2.3 pouch

專案網點: https://github.com/alibaba/pouch
Pouch (小袋子)起源於 2011 年,並於2017年11月19日上午,在中國開源年會現場,阿里巴巴正式開源了基於 Apache 2.0 協議的容器技術 Pouch。Pouch 是一款輕量級的容器技術,擁有快速高效、可移植性高、資源佔用少等特性,主要幫助阿里更快的做到內部業務的交付,同時提高超大規模下資料中心的物理資源利用率

目前的容器方案大多基於 Linux 核心提供的 cgroup 和 namespace 來實現隔離,然後這樣輕量級方案存在弊端:

  • 容器間,容器與宿主間,共享同一個核心
  • 核心實現的隔離資源,維度不足

面對如此的核心現狀,阿里巴巴採取了三個方面的工作,來解決容器的安全問題:

  • 使用者態增強容器的隔離維度,比如網路頻寬、磁碟使用量等
  • 給核心提交 patch,修復容器的資源可見性問題,cgroup 方面的 bug
  • 實現基於 Hypervisor 的容器,透過建立新核心來實現容器隔離

1.1.2.4 Podman

官網地址: https://podman.io/
專案地址: https://github.com/containers/libpod
雖然目前 Docker 是管理 Linux 容器最好的工具,注意沒有之一,但是podman的橫空出現即將改變這一點

Podman即Pod Manager tool,從名稱上可以看出和kubernets的pod的密切聯絡,不過就其功能來說,簡而言之: alias docker = podman

Podman是一個 為 Kubernetes 而生的開源的容器管理工具,原來是 CRI-O(即容器執行時介面CRI 和開放容器計劃OCI) 專案的一部分,後來被分離成一個單獨的專案叫 libpod。其可在大多數Linux平臺上使用,它是一種無守護程式的容器引擎,用於在Linux系統上開發,管理和執行任何符合Open Container Initiative(OCI)標準的容器和容器映象。

Podman 提供了一個與Docker相容的命令列前端,Podman 裡面87%的指令都和Docker CLI 相同,因此可以簡單地為Docker CLI別名,即“ alias docker = podman”,事實上,podman使用的一些庫也是docker的一部分。

Podman 和docker不同之處:

  • docker 需要在我們的系統上執行一個守護程序(docker daemon),這會產生一定的開銷,而podman 不需要
  • 啟動容器的方式不同:
    docker cli 命令透過API跟 Docker Engine(引擎) 互動告訴它我想建立一個container,然後docker Engine 才會呼叫 OCI container runtime(runc) 來啟動一個container。這代表container的process(程序)不會是 Docker CLI 的 child process(子程序) ,而是 Docker Engine 的 child process 。Podman 是直接給 OCI containner runtime(runc) 進行互動來建立container的,所以container process 直接是 podman 的 child process 。
  • 因為docke有docker daemon,所以docker啟動的容器支援 --restart 策略,但是podman不支援
  • docker需要使用root使用者來建立容器。 這可能會產生安全風險,尤其是當使用者知道docker run命令的--privileged選項時。podman既可以由root使用者執行,也可以由非特權使用者執行
  • docker在Linux上作為守護程序執行扼殺了容器社群的創新。 如果要更改容器的工作方式,則需要更改docker守護程式並將這些更改推送到上游。 沒有守護程序,容器基礎結構更加模組化,更容易進行更改。 podman的無守護程序架構更加靈活和安全。

1.1.3 docker(容器)的核心技術

1.1.3.1 容器規範

容器技術除了的docker之外,還有coreOS的rkt,還有阿里的Pouch,為了保證容器生態的標準性和健康可持續發展,包括Linux 基金會、Docker、微軟、紅帽、谷歌和IBM等公司在2015年6月共同成立了一個叫open container(OCI)的組織,其目的就是制定開放的標準的容器規範,目前OCI一共釋出了兩個規範,分別是runtime spec和 image format spec,有了這兩個規範,不同的容器公司開發的容器只要相容這兩個規範,就可以保證容器的可移植性和相互可操作性。

1.1.3.2 容器 runtime

runtime是真正執行容器的地方,因此為了執行不同的容器runtime需要和作業系統核心緊密合作相互在支援,以便為容器提供相應的執行環境

範例:

[root@ubuntu1804 ~]#docker info 
Client:
 Debug Mode: false
Server:
 Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
 Images: 1
 Server Version: 19.03.5
 Storage Driver: overlay2
 Backing Filesystem: extfs
 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  #runtime
 Init Binary: docker-init
 containerd version: b34a5c8af56e510852c35414db4c1f4fa6172339
 runc version: 3e425f80a8c931f88e6d94a8c831b9d5aa481657
 init version: fec3683
 Security Options:
 apparmor
 seccomp
   Profile: default
 Kernel Version: 4.15.0-29-generic
 Operating System: Ubuntu 18.04.1 LTS
 OSType: linux
 Architecture: x86_64
 CPUs: 1

1.1.3.3 容器管理工具

管理工具連線runtime與使用者,對使用者提供圖形或命令方式操作,然後管理工具將使用者操作傳遞給runtime執行。

  • lxc 是lxd 的管理工具
  • Runc的管理工具是docker engine,docker engine包含後臺deamon和cli兩部分,大家經常提到的Docker就是指的docker engine
  • Rkt的管理工具是rkt cli

範例:檢視docker engine

[root@ubuntu1804 ~]#docker version
Client: Docker Engine - Community
 Version:           19.03.5
 API version:       1.40
 Go version:       go1.12.12
 Git commit:       633a0ea838
 Built:             Wed Nov 13 07:29:52 2019
 OS/Arch:           linux/amd64
 Experimental:      false
Server: Docker Engine - Community
 Engine:
 Version:          19.03.5
 API version:      1.40 (minimum version 1.12)
 Go version:       go1.12.12
 Git commit:       633a0ea838
 Built:           Wed Nov 13 07:28:22 2019
 OS/Arch:         linux/amd64
 Experimental:     false
 containerd:
 Version:          1.2.10
 GitCommit:       b34a5c8af56e510852c35414db4c1f4fa6172339
 runc:
 Version:          1.0.0-rc8+dev
 GitCommit:       3e425f80a8c931f88e6d94a8c831b9d5aa481657
 docker-init:
 Version:          0.18.0
 GitCommit:       fec3683

1.1.3.4 容器定義工具

  • 容器定義工具允許使用者定義容器的屬性和內容,以方便容器能夠被儲存、共享和重建。
  • Docker image: 是docker 容器的模板,runtime依據docker image建立容器
  • Dockerfile: 包含N個命令的文字檔案,透過dockerfile建立出docker image
  • ACI(App container image): 與docker image類似,是CoreOS開發的rkt容器的映象格式

1.1.3.5 映象倉庫 Registry
統一儲存映象而且是多個不同映象版本的地方,叫做映象倉庫

  • Docker hub: docker官方的公共倉庫,已經儲存了大量的常用映象,可以方便大家直接使用
  • 阿里雲,網易等第三方映象倉庫
  • Image registry: docker 官方提供的私有倉庫部署工具,無web管理介面,目前使用較少
  • Harbor: vmware 提供的自帶web介面自帶認證功能的映象倉庫,目前有很多公司使用

範例: 映象地址格式

10.0.0.8/project/centos:7.2.1511
10.0.0.8/project/centos: latest
10.0.0.8/project/java-7.0.59:v1
10.0.0.8/project/java-7.0.59:v2

1.1.3.6 編排工具
當多個容器在多個主機執行的時候,單獨管理容器是相當複雜而且很容易出錯,而且也無法實現某一臺主機當機後容器自動遷移到其他主機從而實現高可用的目的,也無法實現動態伸縮的功能,因此需要有一種工具可以實現統一管理、動態伸縮、故障自愈、批次執行等功能,這就是容器編排引擎

容器編排通常包括容器管理、排程、叢集定義和服務發現等功能

  • Docker swarm: docker 開發的容器編排引擎
  • Kubernetes: google領導開發的容器編排引擎,內部專案為Borg,且其同時支援docker和CoreOS
  • Mesos+Marathon: Mesos是Apache下的開源分散式資源管理框架,它被稱為是分散式系統的核心。Mesos最初是由加州大學伯克利分校的AMPLab開發的,後在Twitter得到廣泛使用。通用的叢集組員排程平臺,mesos(資源分配)與marathon(容器編排平臺)一起提供容器編排引擎功能

1.2 Docker 安裝及基礎命令介紹

1.2.1 Docker 安裝準備

OS系統版本選擇:
Docker 目前已經支援多種作業系統的安裝執行,比如Ubuntu、CentOS、Redhat、Debian、Fedora,甚至是還支援了Mac和Windows,在linux系統上需要核心版本在3.10或以上

Docker版本選擇:
docker版本號之前一直是0.X版本或1.X版本,但是從2017年3月1號開始改為每個季度釋出一次穩定版,其版本號規則也統一變更為YY.MM,例如17.09表示是2017年9月份釋出的

Docker之前沒有區分版本,但是2017年推出(將docker更名為)新的專案Moby,github地址: https://github.com/moby/moby,Moby專案屬於Docker專案的全新上游,Docker將是一個隸屬於的Moby的子產品,而且之後的版本之後開始區分為 CE(Docker Community Edition,社群版本)和 EE(Docker Enterprise Edition,企業收費版),CE社群版本和EE企業版本都是每個季度釋出一個新版本,但是EE
版本提供後期安全維護1年,而CE版本是4個月,以下為官方原文:
https://blog.docker.com/2017/03/docker-enterprise-edition/

如果要佈署到kubernetes上,需要檢視相關kubernetes對docker版本要求的說明,比如:
https://github.com/kubernetes/kubernetes/blob/v1.17.2/CHANGELOG-1.17.md

1.2.2 安裝和刪除方法

1.2.2.1 Ubuntu 安裝和刪除Docker

官方文件: https://docs.docker.com/install/linux/docker-ce/ubuntu/

Ubuntu 14.04/16.04/18.04/20.04 安裝 docker

# step 1: 安裝必要的一些系統工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安裝GPG證書
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 寫入軟體源資訊
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新並安裝Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce

# 安裝指定版本的Docker-CE:
# Step 1: 查詢Docker-CE的版本:
apt-cache madison docker-ce 
 docker-ce | 5:19.03.5~3-0~ubuntu-bionic | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:19.03.4~3-0~ubuntu-bionic | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:19.03.3~3-0~ubuntu-bionic | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:19.03.2~3-0~ubuntu-bionic | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:19.03.1~3-0~ubuntu-bionic | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:19.03.0~3-0~ubuntu-bionic | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:18.09.9~3-0~ubuntu-bionic | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:18.09.8~3-0~ubuntu-bionic | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:18.09.7~3-0~ubuntu-bionic | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:18.09.6~3-0~ubuntu-bionic | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:18.09.5~3-0~ubuntu-bionic | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:18.09.4~3-0~ubuntu-bionic | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:18.09.3~3-0~ubuntu-bionic | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:18.09.2~3-0~ubuntu-bionic | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:18.09.1~3-0~ubuntu-bionic | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:18.09.0~3-0~ubuntu-bionic | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 18.06.3~ce~3-0~ubuntu | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 18.06.2~ce~3-0~ubuntu | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 18.06.1~ce~3-0~ubuntu | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 18.06.0~ce~3-0~ubuntu | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 18.03.1~ce~3-0~ubuntu | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages

# Step 2: 安裝指定版本的Docker-CE: (VERSION例如上面的17.03.1~ce-0~ubuntu-xenial)**
sudo apt-get -y install docker-ce=[VERSION] docker-ce-cli=[VERSION]

刪除docker

[root@ubuntu ~]#apt purge docker-ce
[root@ubuntu ~]#rm -rf /var/lib/docker

範例: 檢視docker相關檔案

[root@ubuntu1804 ~]#dpkg -L docker-ce
/.
/etc
/etc/default
/etc/default/docker
/etc/init
/etc/init/docker.conf
/etc/init.d
/etc/init.d/docker
/lib
/lib/systemd
/lib/systemd/system
/lib/systemd/system/docker.service
/lib/systemd/system/docker.socket
/usr
/usr/bin
/usr/bin/docker-init
/usr/bin/docker-proxy
/usr/bin/dockerd
/usr/share
/usr/share/doc
/usr/share/doc/docker-ce
/usr/share/doc/docker-ce/README.md
/usr/share/doc/docker-ce/changelog.Debian.gz
/var
/var/lib
/var/lib/docker-engine
/var/lib/docker-engine/distribution_based_engine.json

1.2.2.2 CentOS 安裝和刪除Docker
官方文件: https://docs.docker.com/install/linux/docker-ce/centos/

  • CentOS 6 因核心太舊,即使支援安裝docker,但會有各種問題,不建議安裝
  • CentOS 7 的 extras 源雖然可以安裝 docker,但包比較舊,建議從官方源或映象源站點下載安裝docker
  • CentOS 8 有新技術 podman 代替 docker
    因此建議在CentOS 7 上安裝 docker

#extras 源中包名為docker

[root@centos7 ~]#yum list docker
Loaded plugins: fastestmirror
Repository base is listed more than once in the configuration
Repository extras is listed more than once in the configuration
Loading mirror speeds from cached hostfile
 * base: mirrors.tuna.tsinghua.edu.cn
 * extras: mirrors.tuna.tsinghua.edu.cn
 * updates: mirrors.tuna.tsinghua.edu.cn
Available Packages
docker.x86_64      2:1.13.1-103.git7f2769b.el7.centos                           
extras

下載rpm包安裝:
官方rpm包下載地址:
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
阿里映象下載地址:
https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/
透過yum源安裝:
由於官網的yum源太慢,下面使用阿里雲的Yum源進行安裝

rm -rf /etc/yum.repos.d/*
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum clean all 
yum -y install docker-ce
systemctl enable --now docker

刪除 docker

[root@centos7 ~]#yum remove docker-ce
#刪除docker資源存放的相關檔案
[root@centos7 ~]#rm -rf /var/lib/docker

範例: CentOS 7 基於阿里雲的安裝docker方法
阿里雲說明: https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.3e221b11sUMKNV

# step 1: 安裝必要的一些系統工具
yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 新增軟體源資訊
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新並安裝Docker-CE
yum makecache fast
yum -y install docker-ce
# Step 4: 開啟Docker服務
service docker start
# 注意:  
# 官方軟體源預設啟用了最新的軟體,您可以透過編輯軟體源的方式獲取各個版本的軟體包。例如官方並沒有將測試版本的軟體源置為可用,您可以透過以下方式開啟。同理可以開啟各種測試版本等。
# vim /etc/yum.repos.d/docker-ee.repo
#   將[docker-ce-test]下方的enabled=0修改為enabled=1
#
# 安裝指定版本的Docker-CE:
# Step 1: 查詢Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
#   Loading mirror speeds from cached hostfile
#   Loaded plugins: branch, fastestmirror, langpacks
#   docker-ce.x86_64           17.03.1.ce-1.el7.centos           docker-ce-stable
#   docker-ce.x86_64           17.03.1.ce-1.el7.centos           @docker-ce-stable
#   docker-ce.x86_64           17.03.0.ce-1.el7.centos           docker-ce-stable
#   Available Packages
# Step2: 安裝指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
yum -y install docker-ce-[VERSION]

範例: 在CentOS 7上安裝docker

[root@centos7 ~]#cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 
[root@centos7 ~]#ls /etc/yum.repos.d/
backup base.repo
[root@centos7 ~]#wget -P /etc/yum.repos.d/ https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
Saving to: ‘/etc/yum.repos.d/docker-ce.repo’
100%[====================================================================>] 
2,640       --.-K/s   in 0s      
2020-05-21 21:56:21 (505 MB/s) - ‘/etc/yum.repos.d/docker-ce.repo’ saved 
[2640/2640]
[root@centos7 ~]#ls /etc/yum.repos.d/
backup base.repo docker-ce.repo
[root@centos7 ~]#yum clean all
Loaded plugins: fastestmirror
Cleaning repos: base docker-ce-stable epel extras
Cleaning up list of fastest mirrors
[root@centos7 ~]#yum repolist 
repo id                   repo name                                           
status
base                       CentOS                                               
10,019
docker-ce-stable/x86_64   Docker CE Stable - x86_64                             
   63
epel/7/x86_64             EPEL                                                 
13,513
extras/7/x86_64           extras                                                 
307
repolist: 23,902
[root@centos7 ~]#yum list docker-ce* --showduplicates | sort -r
Loading mirror speeds from cached hostfile
Loaded plugins: fastestmirror
docker-ce.x86_64                3:19.03.5-3.el7                 docker-ce-stable
docker-ce.x86_64                3:19.03.4-3.el7                 docker-ce-stable
docker-ce.x86_64                3:19.03.3-3.el7                 docker-ce-stable
docker-ce.x86_64                3:19.03.2-3.el7                 docker-ce-stable
docker-ce.x86_64                3:19.03.1-3.el7                 docker-ce-stable
docker-ce.x86_64                3:19.03.0-3.el7                 docker-ce-stable
docker-ce.x86_64                3:18.09.9-3.el7                 docker-ce-stable
docker-ce.x86_64                3:18.09.8-3.el7                 docker-ce-stable
docker-ce.x86_64                3:18.09.7-3.el7                 docker-ce-stable
docker-ce.x86_64                3:18.09.6-3.el7                 docker-ce-stable
docker-ce.x86_64                3:18.09.5-3.el7                 docker-ce-stable
docker-ce.x86_64                3:18.09.4-3.el7                 docker-ce-stable
docker-ce.x86_64                3:18.09.3-3.el7                 docker-ce-stable
docker-ce.x86_64                3:18.09.2-3.el7                 docker-ce-stable
docker-ce.x86_64                3:18.09.1-3.el7                 docker-ce-stable
docker-ce.x86_64                3:18.09.0-3.el7                 docker-ce-stable
docker-ce.x86_64                18.06.3.ce-3.el7               docker-ce-stable
docker-ce.x86_64                18.06.2.ce-3.el7               docker-ce-stable
docker-ce.x86_64                18.06.1.ce-3.el7               docker-ce-stable
docker-ce.x86_64                18.06.0.ce-3.el7               docker-ce-stable
docker-ce.x86_64                18.03.1.ce-1.el7.centos         docker-ce-stable
docker-ce.x86_64                18.03.0.ce-1.el7.centos         docker-ce-stable
docker-ce.x86_64                17.12.1.ce-1.el7.centos         docker-ce-stable
docker-ce.x86_64                17.12.0.ce-1.el7.centos         docker-ce-stable
docker-ce.x86_64                17.09.1.ce-1.el7.centos         docker-ce-stable
docker-ce.x86_64                17.09.0.ce-1.el7.centos         docker-ce-stable
docker-ce.x86_64                17.06.2.ce-1.el7.centos         docker-ce-stable
docker-ce.x86_64                17.06.1.ce-1.el7.centos         docker-ce-stable
docker-ce.x86_64                17.06.0.ce-1.el7.centos         docker-ce-stable
docker-ce.x86_64                17.03.3.ce-1.el7               docker-ce-stable
docker-ce.x86_64                17.03.2.ce-1.el7.centos         docker-ce-stable
docker-ce.x86_64                17.03.1.ce-1.el7.centos         docker-ce-stable
docker-ce.x86_64                17.03.0.ce-1.el7.centos         docker-ce-stable
docker-ce-selinux.noarch        17.03.3.ce-1.el7               docker-ce-stable
docker-ce-selinux.noarch        17.03.2.ce-1.el7.centos         docker-ce-stable
docker-ce-selinux.noarch        17.03.1.ce-1.el7.centos         docker-ce-stable
docker-ce-selinux.noarch        17.03.0.ce-1.el7.centos         docker-ce-stable
docker-ce-cli.x86_64            1:19.03.5-3.el7                 docker-ce-stable
docker-ce-cli.x86_64            1:19.03.4-3.el7                 docker-ce-stable
docker-ce-cli.x86_64            1:19.03.3-3.el7                 docker-ce-stable
docker-ce-cli.x86_64            1:19.03.2-3.el7                 docker-ce-stable
docker-ce-cli.x86_64            1:19.03.1-3.el7                 docker-ce-stable
docker-ce-cli.x86_64            1:19.03.0-3.el7                 docker-ce-stable
docker-ce-cli.x86_64            1:18.09.9-3.el7                 docker-ce-stable
docker-ce-cli.x86_64            1:18.09.8-3.el7                 docker-ce-stable
docker-ce-cli.x86_64            1:18.09.7-3.el7                 docker-ce-stable
docker-ce-cli.x86_64            1:18.09.6-3.el7                 docker-ce-stable
docker-ce-cli.x86_64            1:18.09.5-3.el7                 docker-ce-stable
docker-ce-cli.x86_64            1:18.09.4-3.el7                 docker-ce-stable
docker-ce-cli.x86_64            1:18.09.3-3.el7                 docker-ce-stable
docker-ce-cli.x86_64            1:18.09.2-3.el7                 docker-ce-stable
docker-ce-cli.x86_64            1:18.09.1-3.el7                 docker-ce-stable
docker-ce-cli.x86_64            1:18.09.0-3.el7                 docker-ce-stable
Available Packages
[root@centos7 ~]#yum -y install docker-ce-18.09.9-3.el7 docker-ce-cli-18.09.9-3.el7
Dependencies Resolved
================================================================================
=========
 Package                         Arch             Version                   
Repository                 Size
================================================================================
=========
Installing:
 docker-ce                       x86_64           3:18.09.9-3.el7           
docker-ce-stable            21 M
 docker-ce-cli                   x86_64           1:18.09.9-3.el7           
docker-ce-stable            16 M
Installing for dependencies:
 audit-libs-python               x86_64           2.8.4-4.el7               
base                        76 k
 checkpolicy                     x86_64           2.5-8.el7                 
base                       295 k
 container-selinux               noarch           2:2.107-3.el7             
extras                      39 k
 containerd.io                   x86_64           1.2.10-3.2.el7           
docker-ce-stable            23 M
 libcgroup                       x86_64           0.41-20.el7               
base                        66 k
 libsemanage-python               x86_64           2.5-14.el7               
base                       113 k
 policycoreutils-python           x86_64           2.5-29.el7               
base                       456 k
 python-IPy                       noarch           0.75-6.el7               
base                        32 k
 setools-libs                     x86_64           3.3.8-4.el7               
base                       620 k
Transaction Summary
================================================================================
==============================
Install  2 Packages (+9 Dependent packages)
Total download size: 62 M
Installed size: 258 M
Downloading packages:
(1/4): container-selinux-2.107-3.el7.noarch.rpm                                   
    |  39 kB  00:00:00     
warning: /var/cache/yum/x86_64/7/docker-ce-stable/packages/containerd.io-1.2.10-3.2.el7.x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID 621e9f35: NOKEY
Public key for containerd.io-1.2.10-3.2.el7.x86_64.rpm is not installed
(2/4): containerd.io-1.2.10-3.2.el7.x86_64.rpm                                   
      |  23 MB  00:00:03     
(3/4): docker-ce-18.09.9-3.el7.x86_64.rpm                                         
    |  21 MB  00:00:04     
(4/4): docker-ce-cli-18.09.9-3.el7.x86_64.rpm                                     
    |  16 MB  00:00:01                
Complete!
[root@centos7 ~]#docker version
Client:
 Version:           18.09.9
 API version:       1.39
 Go version:       go1.11.13
 Git commit:       039a7df9ba
 Built:             Wed Sep  4 16:51:21 2019
 OS/Arch:           linux/amd64
 Experimental:      false
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker 
daemon running?
[root@centos7 ~]#systemctl enable --now docker
[root@centos7 ~]#docker version
Client:
 Version:           18.09.9
 API version:       1.39
 Go version:       go1.11.13
 Git commit:       039a7df9ba
 Built:             Wed Sep  4 16:51:21 2019
 OS/Arch:           linux/amd64
 Experimental:      false
Server: Docker Engine - Community
 Engine:
 Version:          18.09.9
 API version:      1.39 (minimum version 1.12)
 Go version:       go1.11.13
 Git commit:       039a7df
 Built:           Wed Sep  4 16:22:32 2019
 OS/Arch:         linux/amd64
 Experimental:     false
[root@centos7 ~]#

1.2.2.3 Linux 二進位制安裝
本方法適用於無法上網(如部分公司的內網隔離環境)或無法透過包安裝方式安裝的主機上安裝docker
安裝文件: https://docs.docker.com/install/linux/docker-ce/binaries/
二進位制安裝下載路徑
https://download.docker.com/linux/
https://mirrors.aliyun.com/docker-ce/linux/static/stable/x86_64/
範例:

[root@centos8 ~]#wget 
https://download.docker.com/linux/static/stable/x86_64/docker-19.03.5.tgz
[root@centos8 ~]#tar xvf docker-19.03.5.tgz 
docker/
docker/docker-init
docker/docker
docker/dockerd
docker/runc
docker/ctr
docker/docker-proxy
docker/containerd
docker/containerd-shim
[root@centos8 ~]#cp docker/* /usr/bin/
#建立組
[root@centos8 ~]#groupadd -r docker
#將Ubuntu1804或CentOS7基於包方式安裝的相關檔案複製到相應目錄下
[root@ubuntu1804 ~]#scp /lib/systemd/system/docker.* 
/lib/systemd/system/containerd.service 10.0.0.8:/lib/systemd/system/
root@10.0.0.8's password: 
docker.service                                             100% 1683   650.8KB/s 
  00:00  
docker.socket                                              100%  197   303.3KB/s 
  00:00 
containerd.service                                         100%  487   516.6KB/s 
  00:00 
[root@centos8 ~]#systemctl daemon-reload
[root@centos8 ~]#systemctl enable --now docker
[root@centos8 ~]#docker version
Client: Docker Engine - Community
 Version:           19.03.5
 API version:       1.40
 Go version:       go1.12.12
 Git commit:       633a0ea838
 Built:             Wed Nov 13 07:22:05 2019
 OS/Arch:           linux/amd64
 Experimental:      false
Server: Docker Engine - Community
 Engine:
 Version:          19.03.5
 API version:      1.40 (minimum version 1.12)
 Go version:       go1.12.12
 Git commit:       633a0ea838
 Built:           Wed Nov 13 07:28:45 2019
 OS/Arch:         linux/amd64
 Experimental:     false
 containerd:
 Version:         v1.2.10
 GitCommit:       b34a5c8af56e510852c35414db4c1f4fa6172339
 runc:
 Version:          1.0.0-rc8+dev
 GitCommit:       3e425f80a8c931f88e6d94a8c831b9d5aa481657
 docker-init:
 Version:          0.18.0
 GitCommit:       fec3683
[root@centos8 ~]#docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete 
Digest: sha256:9572f7cdcee8591948c2963463447a53466950b3fc15a247fcad1917ca215a2f
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
   (amd64)
3. The Docker daemon created a new container from that image which runs the
   executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
   to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/
For more examples and ideas, visit:
 https://docs.docker.com/get-started/
[root@centos8 ~]#pstree -p #檢視docker結構

1.2.2.4 在不同系統上實現一鍵安裝 docker 指令碼

1.2.2.4.1 基於 ubuntu 1804和20.04 的 一鍵安裝 docker 指令碼

[root@ubuntu1804 ~]#cat install_docker_ubuntu.sh
#!/bin/bash
#Description: Install docker on Ubuntu18.04 and 20.04
#Version:1.0
#Date:2020-01-22
COLOR="echo -e \\033[1;31m"
END="\033[m"
DOCKER_VERSION="5:19.03.5~3-0~ubuntu-bionic"
install_docker(){
dpkg -s docker-ce &> /dev/null && ${COLOR}"Docker已安裝,退出"${END} && exit
apt update
apt  -y install apt-transport-https ca-certificates curl software-properties-common
#curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key 
add -
#add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu/gpg | 
sudo apt-key add -
add-apt-repository "deb [arch=amd64] 
https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu $(lsb_release -cs)
stable"
apt update
${COLOR}"Docker有以下版本"${END}
apt-cache madison docker-ce
${COLOR}"5秒後即將安裝: docker-"${DOCKER_VERSION}" 版本....."${END}
${COLOR}"如果想安裝其它Docker版本,請按ctrl+c鍵退出,修改版本再執行"${END}
sleep 5
apt -y install docker-ce=${DOCKER_VERSION} docker-ce-cli=${DOCKER_VERSION}
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://si7y70hh.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl enable --now docker
docker version && ${COLOR}"Docker 安裝成功"${END} ||  ${COLOR}"Docker 安裝失敗"${END}
}
install_docker

1.2.2.4.2 基於 CentOS 7 實現一鍵安裝docker 指令碼

[root@centos7 ~]#cat install_docker_for_centos7.sh 
#!/bin/bash
COLOR="echo -e \\033[1;31m"
END="\033[m"
VERSION="19.03.5-3.el7"
wget -P /etc/yum.repos.d/ https://mirrors.tuna.tsinghua.edu.cn/dockerce/linux/centos/docker-ce.repo || { ${COLOR}"網際網路連線失敗,請檢查網路配
置!"${END};exit; }

yum clean all 
yum -y install docker-ce-$VERSION docker-ce-cli-$VERSION || { ${COLOR}"Base,Extras的yum源失敗,請檢查yum源配置"${END};exit; }

#使用阿里做映象加速
mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://si7y70hh.mirror.aliyuncs.com"]
 }
EOF

systemctl enable --now docker
docker version && ${COLOR}"Docker安裝成功"${END} || ${COLOR}"Docker安裝失敗"${END}

1.2.3 docker 命令幫助

官方文件: https://docs.docker.com/reference/
docker 命令是最常使用的docker 客戶端命令,其後面可以加不同的引數以實現不同的功能,
docker 命令有很多子命令,可以用下面方法檢視幫助

#docker 命令幫助
man docker 
docker
docker  --help

#docker 子命令幫助
man docker-COMMAND
docker COMMAND --help

1.2.4 驗證 docker 資訊

[root@ubuntu1804 ~]#docker info
Client:
 Debug Mode: false     #client 端是否開啟 debug
Server:
 Containers: 2   #當前主機執行的容器總數
 Running: 0     #有幾個容器是正在執行的
 Paused: 0      #有幾個容器是暫停的
 Stopped: 2     #有幾個容器是停止的
 Images: 4       #當前伺服器的映象數
 Server Version: 19.03.5   #服務端版本
 Storage Driver: overlay2  #正在使用的儲存引擎
 Backing Filesystem: extfs   #後端檔案系統,即伺服器的磁碟檔案系統
 Supports d_type: true  #是否支援 d_type
 Native Overlay Diff: true  #是否支援差異資料儲存
 Logging Driver: json-file   #日誌型別
 Cgroup Driver: cgroupfs  #Cgroups 型別
 Plugins:                  #外掛
 Volume: local            #卷
 Network: bridge host ipvlan macvlan null overlay # overlay 跨主機通訊
 Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog  #日 志型別
 Swarm: inactive    #是否支援 swarm
 Runtimes: runc     #已安裝的容器執行時
 Default Runtime: runc   #預設使用的容器執行時
 Init Binary: docker-init   #初始化容器的守護程序,即 pid 為 1 的程序
 containerd version: b34a5c8af56e510852c35414db4c1f4fa6172339 #版本
 runc version: 3e425f80a8c931f88e6d94a8c831b9d5aa481657  #runc 版本
 init version: fec3683  #init 版本
 Security Options:   #安全選項
 apparmor     #安全模組,https://docs.docker.com/engine/security/apparmor/
 seccomp  #安全計算模組,即制容器操作,
https://docs.docker.com/engine/security/seccomp/
   Profile: default  #預設的配置檔案
 Kernel Version: 4.15.0-29-generic  #宿主機核心版本
 Operating System: Ubuntu 18.04.1 LTS  #宿主機作業系統
 OSType: linux    #宿主機作業系統型別
 Architecture: x86_64   #宿主機架構
 CPUs: 1    #宿主機 CPU 數量
 Total Memory: 962MiB   #宿主機總記憶體
 Name: ubuntu1804.magedu.org #宿主機 hostname
 ID: IZHJ:WPIN:BRMC:XQUI:VVVR:UVGK:NZBM:YQXT:JDWB:33RS:45V7:SQWJ #宿主機 ID
 Docker Root Dir: /var/lib/docker  #宿主機關於docker資料的儲存目錄
 Debug Mode: false   #server 端是否開啟 debug
 Registry: https://index.docker.io/v1/  #倉庫路徑
 Labels:
 Experimental: false  #是否測試版
 Insecure Registries:
  127.0.0.0/8 : #非安全的映象倉庫
 Registry Mirrors:
 https://si7y70hh.mirror.aliyuncs.com/   #映象倉庫
 Live Restore Enabled: false  #是否開啟活動重啟 (重啟docker-daemon 不關閉容器 )
WARNING: No swap limit support  #系統警告資訊 (沒有開啟 swap 資源限制 )

範例: 解決上述SWAP報警提示

[root@ubuntu1804 ~]# vim /etc/default/grub
GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=2
GRUB_DISTRIBUTOR=`lsb_ release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT=""
GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0 swapaccount=1"  #修改此行
[root@ubuntu1804 ~]# update-grub
[root@ubuntu1804 ~]# reboot

1.3 映象管理

1.3.1 映象結構和原理
映象即建立容器的模版,含有啟動容器所需要的檔案系統及所需要的內容,因此映象主要用於方便和快速的建立並啟動容器

映象含裡面是一層層的檔案系統,叫做 Union FS(聯合檔案系統),聯合檔案系統,可以將幾層目錄掛載到一起(就像千層餅,洋蔥頭,俄羅斯套娃一樣),形成一個虛擬檔案系統,虛擬檔案系統的目錄結構就像普通 linux 的目錄結構一樣,映象透過這些檔案再加上宿主機的核心共同提供了一個 linux 的虛擬環境,每一層檔案系統叫做一層layer,聯合檔案系統可以對每一層檔案系統設定三種許可權,只讀(readonly)、讀寫(readwrite)和寫出(whiteout-able),但是映象中每一層檔案系統都是隻讀的,
構建映象的時候,從一個最基本的作業系統開始,每個構建提交的操作都相當於做一層的修改,增加了一層檔案系統,一層層往上疊加,上層的修改會覆蓋底層該位置的可見性,這也很容易理解,就像上層把底層遮住了一樣,當使用映象的時候,我們只會看到一個完全的整體,不知道里面有幾層,實際上也不需要知道里面有幾層。

檢視映象的分層結構命令:docker pull nginx
檢視映象分層歷史命令:docker image history nginx

1.3.2 搜尋映象

1.3.2.1 搜尋映象
1.3.2.1.1 官方網站進行映象的搜尋
官網: http://hub.docker.com

1.3.2.2.2 執行docker search命令進行搜尋
命令:docker search centos
範例: 選擇性的查詢映象
#搜尋點贊100個以上的映象

#舊語法
[root@ubuntu1804 ~]#docker search -s 100 centos
Flag --stars has been deprecated, use --filter=stars=3 instead       
......  
#新語法
[root@ubuntu1804 ~]#docker search --filter=stars=100 centos
NAME                     DESCRIPTION                                     STARS   
            OFFICIAL           AUTOMATED
centos                   The official build of CentOS.                   6096   
            [OK]                
ansible/centos7-ansible   Ansible on Centos7                              132   
                                  [OK]
consol/centos-xfce-vnc   Centos container with "headless" VNC session…   117   
                                  [OK]
jdeathe/centos-ssh       OpenSSH / Supervisor / EPEL/IUS/SCL Repos - …   115   
                                  [OK]

1.3.3 下載映象
從docker 倉庫將映象下載到本地,命令格式如下:

docker pull [OPTIONS] NAME[:TAG|@DIGEST]
Options:
  -a, --all-tags              ` Download all tagged images in the repository`
      --disable-content-trust  ` Skip image verification (default true)`
      --platform string         `Set platform if server is multi-platform capable`
  -q, --quiet                    `Suppress verbose output`

NAME: 是映象名,一般的形式 倉庫伺服器:埠/專案名稱/映象名稱
:TAG: 即版本號,如果不指定 :TAG 則下載最新版映象,latest

映象下載說明

[root@ubuntu1804 ~]#docker pull hello-world
Using default tag: latest   #預設下載最新版本
latest: Pulling from library/hello-world
1b930d010525: Pull complete  #分層下載
Digest: sha256:9572f7cdcee8591948c2963463447a53466950b3fc15a247fcad1917ca215a2f 
#摘要
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest  #下載的完整地址

映象下載儲存的路徑:/var/lib/docker/overlay2/映象ID
注意: 映象下載完成後,會自動解壓縮,比官網顯示的可能會大很多,如: centos8.1.1911下載時只有70MB,下載完後顯示237MB
範例: 從docker官網下載映象

docker pull hello-world
docker pull alpine
docker pull busybox
docker pull nginx    
docker pull centos
docker pull centos:centos7.7.1908
docker pull docker.io/library/mysql:5.7.30
docker pull mysql:5.6.47

範例: 指定 TAG下載特定版本的映象

[root@ubuntu1804 ~]#docker pull docker.io/library/mysql:5.7.30
5.7.29: Pulling from library/mysql
804555ee0376: Pull complete 
c53bab458734: Pull complete
ca9d72777f90: Pull complete 
2d7aad6cb96e: Pull complete 
8d6ca35c7908: Pull complete 
6ddae009e760: Pull complete 
327ae67bbe7b: Pull complete 
9e05241b7707: Pull complete 
e822978df8f0: Pull complete 
14ca71ed53be: Pull complete 
026afe6fd35e: Pull complete 
Digest: sha256:2ca675966612f34b4036bbcfa68cb049c03e34b561fba0f88954b03931823d29
Status: Downloaded newer image for mysql:5.7.30
docker.io/library/mysql:5.7.30
[root@ubuntu1804 ~]#docker pull mysql:5.6.47

1.3.4 docker 映象加速配置

1. 安裝/升級Docker客戶端
推薦安裝1.10.0以上版本的Docker客戶端,參考文件 docker-ce
    
2. 配置映象加速器
修改daemon配置檔案/etc/docker/daemon.json來使用加速器
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://si7y70hh.mirror.aliyuncs.com"]
}
EOF
#網易雲: http://hub-mirror.c.163.com/
#騰訊雲: https://mirror.ccs.tencentyun.com
systemctl daemon-reload
systemctl restart docker

範例: 利用阿里雲實現映象加速

[root@ubuntu1804 ~]#docker info |tail
WARNING: the overlay storage-driver is deprecated, and will be removed in a future release.
 ID: IZHJ:WPIN:BRMC:XQUI:VVVR:UVGK:NZBM:YQXT:JDWB:33RS:45V7:SQWJ
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false
[root@ubuntu1804 ~]#vim /etc/docker/daemon.json 
[root@ubuntu1804 ~]#cat /etc/docker/daemon.json
{
  "storage-driver": "overlay",
  "registry-mirrors": ["https://si7y70hh.mirror.aliyuncs.com"] 
}
[root@ubuntu1804 ~]#systemctl daemon-reload 
[root@ubuntu1804 ~]#systemctl restart docker
[root@ubuntu1804 ~]#docker info |tail
WARNING: the overlay storage-driver is deprecated, and will be removed in a future release.
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Registry Mirrors:
 https://si7y70hh.mirror.aliyuncs.com/
 Live Restore Enabled: false

1.3.5 檢視本地映象
docker images 可以檢視下載至本地的映象,格式:

docker images [OPTIONS] [REPOSITORY[:TAG]]
常用選項:  
-q, --quiet     Only show numeric IDs
-a, --all Show all images (default hides intermediate images)
--digests       Show digests
--no-trunc     Don't truncate output

執行結果的顯示資訊說明:

REPOSITORY      #映象所屬的倉庫名稱
TAG         #映象版本號(識別符號),預設為latest
IMAGE ID       #映象唯一ID標識,如果ID相同,說明是同一個映象有多個名稱
CREATED       #映象建立時間
VIRTUAL SIZE    #映象的大小

範例:

[root@ubuntu1804 ~]#docker images 
REPOSITORY         TAG                 IMAGE ID           CREATED             
SIZE
alpine              3.11.3             e7d92cdc71fe        7 days ago         
5.59MB
centos             centos8.1.1911     470671670cac        7 days ago         
237MB
busybox             latest             6d5fcfe5ff17        4 weeks ago         
1.22MB
hello-world         latest             fce289e99eb9        12 months ago       
1.84kB
[root@ubuntu1804 ~]#docker images -q
e7d92cdc71fe
470671670cac
6d5fcfe5ff17
fce289e99eb9
#顯示完整的ImageID
[root@ubuntu1804 ~]#docker images --no-trunc
REPOSITORY         TAG                 IMAGE ID                                 
                                CREATED             SIZE
tomcat              9.0.37-v1           
sha256:b8d669ebf99e65d5ed69378d0d53f054e7de4865d335ab7aa0a7a5508e1369f7   47
hours ago       652MB
tomcat             latest             
sha256:df72227b40e1985fa5ad529b9ca6582612a41d8f1ddf3a1bea1aa2cfcfa8fb07   5 days 
ago         647MB
nginx               latest             
sha256:0901fa9da894a8e9de5cb26d6749eaffb67b373dc1ff8a26c46b23b1175c913a   11
days ago         132MB
ubuntu             latest             
sha256:adafef2e596ef06ec2112bc5a9663c6a4f59a3dfd4243c9cabe06c8748e7f288   2
weeks ago         73.9MB
busybox             latest             
sha256:c7c37e472d31c1685b48f7004fd6a64361c95965587a951692c5f298c6685998   3
weeks ago         1.22MB
alpine             latest             
sha256:a24bb4013296f61e89ba57005a7b3e52274d8edd3ae2077d04395f806b63d83e   7
weeks ago         5.57MB
redis               5.0.9-alpine3.11   
sha256:3661c84ee9d0f6312a076b69eb2bd112674cadb70ef7e1594c4f00193f8df08e   2
months ago        29.8MB
#只檢視指定REPOSITORY的映象
[root@ubuntu1804 ~]#docker images tomcat
REPOSITORY         TAG                 IMAGE ID           CREATED             
SIZE
tomcat              9.0.37-v1           b8d669ebf99e        47 hours ago       
652MB
tomcat             latest             df72227b40e1        5 days ago         
647MB
#檢視指定映象的資訊
[root@centos8 ~]#podman image inspect alpine
[
   {
        "Id": 
"e7d92cdc71feacf90708cb59182d0df1b911f8ae022d29e8e95d75ca6a99776a",
        "Digest": 
"sha256:ddba4d27a7ffc3f86dd6c2f92041af252a1f23a8e742c90e6e1297bfa1bc0c45",
        "RepoTags": [
            "docker.io/library/alpine:latest"
       ],
        "RepoDigests": [
           
"docker.io/library/alpine@sha256:ddba4d27a7ffc3f86dd6c2f92041af252a1f23a8e742c9e6e1297bfa1bc0c45"
       ],
        "Parent": "",
        "Comment": "",
        "Created": "2020-01-18T01:19:37.187497623Z",
        "Config": {
            "Env": [
               
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
           ],
            "Cmd": [
                "/bin/sh"
           ]
       },
        "Version": "18.06.1-ce",
        "Author": "",
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 5859847,
        "VirtualSize": 5859847,
        "GraphDriver": {
            "Name": "overlay",
            "Data": {
                "MergedDir": 
"/var/lib/containers/storage/overlay/5216338b40a7b96416b8b9858974bbe4acc3096ee60acbc4dfb1ee02aecceb10/merged",
                "UpperDir": 
"/var/lib/containers/storage/overlay/5216338b40a7b96416b8b9858974bbe4acc3096ee60acbc4dfb1ee02aecceb10/diff",
......省略

範例: 檢視映象的名稱和TAG

[root@centos7 ~]#docker image ls --format "{{.Repository}}:{{.Tag}}"
busybox:latest
ubuntu:latest
alpine:3.13.5
centos:centos8.3.2011
centos:latest

1.3.6 映象匯出
利用docker save命令可以將從本地映象匯出問為一個打包 tar檔案,然後複製到其他伺服器進行匯入使用,格式:

docker save [OPTIONS] IMAGE [IMAGE...]
選項:  
-o, --output string   Write to a file, instead of STDOUT
#說明:
Docker save 使用IMAGE ID匯出,在匯入後的映象沒有REPOSITORY和TAG,顯示為<none>

常見用法:
docker save IMAGE -o /path/file.tar
docker save IMAGE > /path/file.tar
範例:

[root@ubuntu1804 ~]#docker save mysql:5.7.30 -o /data/mysql5.7.29.tar
[root@ubuntu1804 ~]#docker save alpine:3.11.3 > /data/alpine.tar
[root@ubuntu1804 ~]#scp /data/mysql5.7.29.tar /data/alpine.tar   10.0.0.7:/data
The authenticity of host '10.0.0.7 (10.0.0.7)' can't be established.
ECDSA key fingerprint is SHA256:5bc0+A46C5m0zxT3WKIBg/i+oVUq9avVRjO9dy9gz2k.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.0.7' (ECDSA) to the list of known hosts.
root@10.0.0.7's password: 
mysql5.7.29.tar                                  100% 420MB  32.2MB/s   00:13   
alpine.tar                                       100% 5728KB  39.1MB/s   00:00  

範例: 匯出所有映象至不同的檔案中

[root@centos8 ~]#docker images | awk 'NR!=1{print $1,$2}' | while read repo tag ;do docker save   $repo:$tag -o /opt/$repo-$tag.tar ;done
[root@centos8 ~]#ls /opt/*.tar
/opt/alpine-3.13.5.tar /opt/busybox-latest.tar /opt/centos-centos8.3.2011.tar 
/opt/centos-latest.tar /opt/ubuntu-latest.tar

1.3.7 映象匯入
利用docker load命令可以將映象匯出的壓縮檔案再匯入,格式:

docker load [OPTIONS]
#選項
-i, --input string   Read from tar archive file, instead of STDIN
-q, --quiet         Suppress the load output

常見用法:
docker load -i /path/file.tar
docker load < /path/file.tar
範例:

#方法1: 使用image ID匯出映象,在匯入後的映象沒有REPOSITORY和TAG,顯示為<none>
[root@ubuntu1804 ~]#docker save `docker images -qa` -o all.tar
[root@ubuntu1804 ~]#scp all.tar 10.0.0.7:
[root@centos7 ~]#docker load -i all.tar
[root@centos7 ~]#docker images
REPOSITORY         TAG                 IMAGE ID           CREATED             
SIZE
<none>             <none>             a77dce18d0ec        10 days ago         
1.24MB
<none>             <none>             389fef711851        3 weeks ago         
5.58MB
<none>             <none>             300e315adb2f        4 weeks ago         
209MB
<none>             <none>             f643c72bc252        6 weeks ago         
72.9MB
#方法2: 將所有映象匯入到一個檔案中,此方法匯入後可以看REPOSITORY和TAG
[root@ubuntu1804 ~]#docker save `docker images | awk 'NR!=1{print $1":"$2}'` -o backup.tar
[root@ubuntu1804 ~]#scp backup.tar 10.0.0.200:
root@ubuntu2004:~# docker load -i backup.tar 
root@ubuntu2004:~# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
busybox     uclibc   a77dce18d0ec   10 days ago   1.24MB
alpine       latest   389fef711851   3 weeks ago   5.58MB
centos       latest   300e315adb2f   4 weeks ago   209MB
ubuntu       latest   f643c72bc252   6 weeks ago   72.9MB

1.3.8 刪除映象
docker rmi 命令可以刪除本地映象,格式:

docker rmi [OPTIONS] IMAGE [IMAGE...]
#選項:
-f, --force     Force removal of the image
    --no-prune   Do not delete untagged parents

範例: 刪除多個映象
[root@ubuntu1804 ~]#docker rmi nginx tomcat
範例: 強制刪除正在使用的映象,也會刪除對應的容器

[root@ubuntu1804 ~]#docker ps -a
CONTAINER ID       IMAGE                   COMMAND                 CREATED     
        STATUS                       PORTS                     NAMES
b5a0d2e1e1d0       centos:centos8.1.1911   "bash"                   41 minutes 
ago     Up 41 minutes                                           jolly_burnell
[root@ubuntu1804 ~]#docker rmi centos:centos8.1.1911
Error response from daemon: conflict: unable to remove repository reference 
"centos:centos8.1.1911" (must force) - container b5a0d2e1e1d0 is using its 
referenced image 470671670cac
[root@ubuntu1804 ~]#docker rmi -f centos:centos8.1.1911
Untagged: centos:centos8.1.1911
Untagged: 
centos@sha256:fe8d824220415eed5477b63addf40fb06c3b049404242b31982106ac204f6700
[root@ubuntu1804 ~]#docker ps -a
CONTAINER ID       IMAGE               COMMAND                 CREATED         
    STATUS                       PORTS                     NAMES

1.3.9 映象打標籤
docker tag 可以給映象打標籤,類似於起別名,格式:
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
TAG預設為latest
範例:

[root@ubuntu1804 ~]#docker images 
REPOSITORY         TAG                 IMAGE ID           CREATED             
SIZE
alpine             latest             e7d92cdc71fe        11 days ago         
5.59MB
centos             centos7.7.1908     08d05d1d5859        2 months ago       
204MB
[root@ubuntu1804 ~]#docker tag alpine alpine:3.11
[root@ubuntu1804 ~]#docker images 
REPOSITORY         TAG                 IMAGE ID           CREATED             
SIZE
alpine              3.11               e7d92cdc71fe        11 days ago         
5.59MB
alpine             latest             e7d92cdc71fe        11 days ago         
5.59MB
centos             centos7.7.1908     08d05d1d5859        2 months ago       
204MB

總結: 企業使用映象及常見操作: 搜尋、下載、匯出、匯入、刪除
命令總結:

docker search centos
docker pull alpine
docker images
docker save > /opt/centos.tar #centos #匯出映象
docker load -i /opt/centos.tar  #匯入本地映象
docker rmi 映象ID/映象名稱  #刪除指定ID的映象,此映象對應容器正啟動映象不能被刪除,除非將容器全部關閉

1.4 容器操作基礎命令
1.4.1 啟動容器
docker run 可以啟動容器,進入到容器,並隨機生成容器ID和名稱
1.4.1.1 啟動容器用法
幫助: man docker-run
命令格式:

docker run [選項] [映象名] [shell命令] [引數]
選項:  
-i, --interactive   Keep STDIN open even if not attached,通常和-t一起使用
-t, --tty           分配pseudo-TTY,通常和-i一起使用,注意對應的容器必須執行shell才支援進入
-d, --detach         Run container in background and print container ID,臺後執行,預設前臺
--name string       Assign a name to the container
--rm                 Automatically remove the container when it exits
-p, --publish list   Publish a container's port(s) to the host
-P, --publish-all   Publish all exposed ports to random ports
--dns list           Set custom DNS servers
--entrypoint string Overwrite the default ENTRYPOINT of the image
--restart policy  
--privileged         Give extended privileges to container,此選項慎用
-e, --env=[] Set environment variables
--env-file=[]       Read in a line delimited file of environment variables

注意: 容器啟動後,如果容器內沒有前臺執行的程序,將自動退出停止
從容器內退出,並停止容器:exit
從容器內退出,且容器不停止:同時按三個鍵,ctrl+p+q
範例: 執行容器
#啟動容器,自動隨機字元作為容器名

[root@ubuntu1804 ~]#docker run alpine 
[root@ubuntu1804 ~]#docker ps -a
CONTAINER ID       IMAGE               COMMAND             CREATED             
STATUS                     PORTS               NAMES
95967eaefd6a       alpine              "/bin/sh"           8 seconds ago       
Exited (0) 6 seconds ago                       confident_elion

範例: 一次性執行容器中命令
#啟動的容器在執行完shell命令就退出,用於測試

[root@ubuntu1804 ~]#docker run busybox echo "Hello laowang"
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
91f30d776fb2: Pull complete 
Digest: sha256:9ddee63a712cea977267342e8750ecbc60d3aab25f04ceacfa795e6fce341793
Status: Downloaded newer image for busybox:latest 
Hello laowang
[root@ubuntu1804 ~]#docker ps 
CONTAINER ID       IMAGE               COMMAND             CREATED             
STATUS             PORTS               NAMES
[root@ubuntu1804 ~]#docker ps -a
CONTAINER ID       IMAGE               COMMAND                 CREATED         
    STATUS                     PORTS               NAMES
7873aed1b5dd       busybox             "echo 'Hello laowang'"   19 seconds ago 
    Exited (0) 18 seconds ago                       pedantic_varahamihira

範例: 指定容器名稱
#,注意每個容器的名稱要唯一

root@ubuntu1804 ~]#docker run --name alpine1 alpine 
[root@ubuntu1804 ~]#docker ps 
CONTAINER ID       IMAGE               COMMAND             CREATED             
STATUS             PORTS               NAMES
[root@ubuntu1804 ~]#docker ps -a
CONTAINER ID       IMAGE               COMMAND             CREATED             
STATUS                     PORTS               NAMES
edd2ac2690e6       alpine              "/bin/sh"           9 seconds ago       
Exited (0) 8 seconds ago                       alpine1

什麼是守護式容器:

  • 能夠長期執行
  • 無需互動式會話
  • 適合執行應用程式和服務
    範例: 啟動前臺守護式容器
[root@ubuntu1804 ~]#docker run nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
6ec8c9369e08: Pull complete 
d3cb09a117e5: Pull complete 
7ef2f1459687: Pull complete 
e4d1bf8c9482: Pull complete 
795301d236d7: Pull complete 
Digest: sha256:0e188877aa60537d1a1c6484b8c3929cfe09988145327ee47e8e91ddf6f76f5c
Status: Downloaded newer image for nginx:latest
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-bydefault.sh
10-listen-on-ipv6-by-default.sh: Getting the checksum of 
/etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: Enabled listen on IPv6 in
/etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-ontemplates.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
172.17.0.1 - - [28/Jul/2020:13:09:19 +0000] "GET / HTTP/1.1" 200 612 "-"
"curl/7.58.0" "-"
172.17.0.4 - - [28/Jul/2020:13:12:49 +0000] "GET / HTTP/1.1" 200 612 "-" "Wget"
"-"

[root@ubuntu1804 ~]#docker run --rm --name b1 busybox wget -qO - 172.17.0.3
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
.......省略

範例: 啟動後臺守護式容器

[root@ubuntu1804 ~]#docker run -d nginx 
888685a2487cf8150d264cb3086f78d0c3bddeb07b8ea9786aa3a564157a4cb8
[root@ubuntu1804 ~]#docker ps -l
CONTAINER ID       IMAGE               COMMAND                 CREATED         
    STATUS             PORTS               NAMES
888685a2487c       nginx               "/docker-entrypoint.…"   8 seconds ago   
    Up 6 seconds        80/tcp             busy_goodall
#有些容器後臺啟動不會持續執行
[root@ubuntu1804 ~]#docker run -d --name alpine4 alpine 
3a05bbf66dac8a6ac9829c876bdb5fcb70832bf4a2898d68f6979cd8e8c517cb
[root@ubuntu1804 ~]#docker ps -a
CONTAINER ID       IMAGE               COMMAND             CREATED             
STATUS                         PORTS               NAMES
3a05bbf66dac       alpine              "/bin/sh"           3 seconds ago       
Exited (0) 2 seconds ago                           alpine4
df428caf7128       alpine              "/bin/sh"           30 seconds ago       
Up 28 seconds                                       alpine3
6d64f47a83e6       alpine              "/bin/sh"           48 seconds ago       
Exited (0) 41 seconds ago                           alpine2
edd2ac2690e6       alpine              "/bin/sh"           About a minute ago   
Exited (0) About a minute ago                       alpine1
[root@ubuntu1804 ~]#docker run -td --name alpine5 alpine 
868b33da850cfcc7db8b84150fb9c7686b577889f10425bb4c5e17f28cf68a29
[root@ubuntu1804 ~]#docker ps -a
CONTAINER ID       IMAGE               COMMAND             CREATED             
STATUS                         PORTS               NAMES
868b33da850c       alpine              "/bin/sh"           2 seconds ago       
Up 1 second                                         alpine5
3a05bbf66dac       alpine              "/bin/sh"           23 seconds ago       
Exited (0) 23 seconds ago                           alpine4
df428caf7128       alpine              "/bin/sh"           50 seconds ago       
Up 49 seconds                                       alpine3
......省略

範例: 開機自動執行容器
#預設容器不會自動啟動

[root@ubuntu1804 ~]#docker run -d --name nginx -p 80:80 nginx 
bce473b8b1d2f728847cdc32b664cca1bd7578bf7bdac850b501e2e5557a718a
[root@ubuntu1804 ~]#docker ps 
CONTAINER ID       IMAGE                 COMMAND                 CREATED       
      STATUS             PORTS                                           NAMES
bce473b8b1d2       nginx                 "nginx -g 'daemon of…"   3 seconds ago 
      Up 2 seconds        0.0.0.0:80->80/tcp  
[root@ubuntu1804 ~]#reboot
[root@ubuntu1804 ~]#docker ps
CONTAINER ID       IMAGE       COMMAND     CREATED   STATUS       PORTS         
NAMES
#設定容器總是執行
[root@ubuntu1804 ~]#docker run -d --name nginx --restart=always -p 80:80 nginx
[root@ubuntu1804 ~]#reboot
[root@ubuntu1804 ~]#docker ps 
CONTAINER ID   IMAGE       COMMAND     CREATED       STATUS     PORTS   
NAMES
dbdba90076e1 nginx"nginx -g 'daemon of…" About a minute agoUp 49
seconds0.0.0.0:80->80/tcp   ng

1.4.2 檢視容器資訊
1.4.2.1 顯示當前存在容器
格式:docker ps [OPTIONS]
選項:

-a, --all             Show all containers (default shows just running)
-q, --quiet           Only display numeric IDs
-s, --size           Display total file sizes
-f, --filter filter   Filter output based on conditions provided
-l, --latest         Show the latest created container (includes all states)
-n, --last int       Show n last created containers (includes all states) 
(default -1)

範例:
#顯示執行的容器

[root@ubuntu1804 ~]#docker ps  
CONTAINER ID       IMAGE               COMMAND             CREATED             
STATUS             PORTS               NAMES
d7ece7f62532       centos              "/bin/bash"         23 seconds ago     
Up 22 seconds                           ecstatic_franklin
#顯示全部容器,包括退出狀態的容器
[root@ubuntu1804 ~]#docker ps -a
CONTAINER ID       IMAGE               COMMAND                 CREATED         
    STATUS                     PORTS               NAMES
d7ece7f62532       centos              "/bin/bash"              27 seconds ago 
    Up 26 seconds                                 ecstatic_franklin
dcdf71d17177       busybox             "/bin/echo 'hello wo…"   8 minutes ago   
    Exited (0) 8 minutes ago                       cool_jepsen
#只檢視退出的容器
[root@ubuntu1804 ~]#docker ps -f "status=exited"
CONTAINER ID       IMAGE               COMMAND             CREATED             
STATUS                       PORTS               NAMES
0794bff71f5b       centos              "/bin/bash"         10 minutes ago     
Exited (130) 6 minutes ago                       centos01
#只顯示容器ID
[root@ubuntu1804 ~]#docker ps -a -q
d7ece7f62532
dcdf71d17177
#顯示容器大小
[root@ubuntu1804 ~]#docker ps -a -s
CONTAINER ID       IMAGE               COMMAND                 CREATED         
    STATUS                     PORTS               NAMES               SIZE
d7ece7f62532       centos              "/bin/bash"              51 seconds ago 
    Up 50 seconds                                 ecstatic_franklin   0B 
(virtual 237MB)
dcdf71d17177       busybox             "/bin/echo 'hello wo…"   8 minutes ago   
    Exited (0) 8 minutes ago                       cool_jepsen         0B 
(virtual 1.22MB)
[root@ubuntu1804 ~]   
#顯示最新建立的容器(停止的容器也能顯示)
[root@ubuntu1804 ~]#docker ps -l

範例: 顯示指定狀態的容器

[root@ubuntu1804 ~]#docker ps -a
CONTAINER ID       IMAGE               COMMAND                 CREATED         
    STATUS                       PORTS               NAMES
dd002f947cbe       nginx               "nginx -g 'daemon of…"   19 minutes ago 
    Exited (137) 11 minutes ago                       nginx2
1f3f82995e05       nginx               "nginx -g 'daemon of…"   19 minutes ago 
    Up 2 minutes                  80/tcp             nginx1
[root@ubuntu1804 ~]#docker ps 
CONTAINER ID       IMAGE               COMMAND                 CREATED         
    STATUS             PORTS               NAMES
1f3f82995e05       nginx               "nginx -g 'daemon of…"   19 minutes ago 
    Up 2 minutes        80/tcp             nginx1
[root@ubuntu1804 ~]#docker ps -f 'status=exited'
CONTAINER ID       IMAGE               COMMAND                 CREATED         
    STATUS                       PORTS               NAMES
dd002f947cbe       nginx               "nginx -g 'daemon of…"   19 minutes ago 
    Exited (137) 11 minutes ago                       nginx2

1.4.2.2 檢視容器內的程序
docker top CONTAINER [ps OPTIONS]
範例:

[root@ubuntu1804 ~]#docker run -d httpd
db144f1978148242dc20bd0be951628f1c00371b2c69dee53d84469c52995d8f
[root@ubuntu1804 ~]#docker top db144f19
UID       PID   PPID C   STIME TTY   TIME     CMD
root      9821  9797  3   22:02 ?     00:00:00 httpd -DFOREGROUND
daemon    9872  9821  0   22:02 ?     00:00:00 httpd -DFOREGROUND
daemon    9873  9821  0   22:02 ?     00:00:00 httpd -DFOREGROUND
daemon    9874  9821  0   22:02 ?     00:00:00 httpd -DFOREGROUND
[root@ubuntu1804 ~]#docker run -d alpine /bin/sh -c 'i=1;while true;do echo 
hello$i;let i++;sleep 1;done'
9997053f9766d4adf709d46161d7ec6739eacafbe8d4721133874b89112ad1a6
[root@ubuntu1804 ~]#docker top 9997
UID                 PID                 PPID               C                   
STIME               TTY                 TIME               CMD
root                10023               9997                3                   
22:03               ?                   00:00:00           /bin/sh -c i=1;while 
true;do echo hello$i;let i++;sleep 1;done
root                10074               10023               0                   
22:03               ?                   00:00:00            sleep 1

1.4.2.3 檢視容器資源使用情況

docker stats [OPTIONS] [CONTAINER...]
Display a live stream of container(s) resource usage statistics
Options:
-a, --all             Show all containers (default shows just running)
    --format string   Pretty-print images using a Go template
    --no-stream       Disable streaming stats and only pull the first result
    --no-trunc       Do not truncate output

範例:

[root@ubuntu1804 ~]#docker stats 251c7c7cf2aa
CONTAINER ID NAME CPU % MEM USAGE / LIMIT     MEM % NET I/O   BLOCK I/O 
PIDS
251c7c7cf2aa busy_l0.00%  3.742MiB / 1.924GiB   0.19%  1.29kB / 0B0B / 8.19kB 
2
CONTAINER ID NAME CPU % MEM USAGE / LIMIT     MEM % NET I/O   BLOCK I/O 
PIDS
251c7c7cf2aa busy_l0.00%  3.742MiB / 1.924GiB   0.19%  1.29kB / 0B0B / 8.19kB 
2
#預設啟動elasticsearch會使用較多的記憶體
[root@ubuntu1804 ~]#docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 
-e "discovery.type=single-node" elasticsearch:7.6.2
[root@ubuntu1804 ~]#curl 10.0.0.100:9200
{
  "name" : "29282e91d773",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "w5lp_XmITliWa2Yc-XwJFw",
  "version" : {
    "number" : "7.6.2",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
    "build_date" : "2020-03-26T06:34:37.794943Z",
    "build_snapshot" : false,
    "lucene_version" : "8.4.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
 },
  "tagline" : "You Know, for Search"
}
#檢視所有容器
[root@ubuntu1804 ~]#docker stats
CONTAINER ID NAME   CPU %   MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O     PIDS
5e470e7970f6 suspi  0.00%   3.992MiB / 1.924Gi0.20% 656B / 0B9.2MB / 8.19kB    2
829bcebbc9f6 elast  0.58%   1.24GiB / 1.924GiB64.43%2.97kB / 512kB / 729kB    47
#限制記憶體使用大小
[root@ubuntu1804 ~]#docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 
-e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx128m" 
elasticsearch:7.6.2
[root@ubuntu1804 ~]#docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT     MEM % NET I/O   BLOCK     PIDS
29282e91d773 elasti254.23310.5MiB / 1.924GiB   15.76% 766B / 0B 766kB /46kB 22

今天先整理到這裡了,後續有時間了從"檢視容器的詳細資訊"開始整理更新

相關文章