容器技術入門與Docker環境部署
- Docker概述
- 什么是 Docker
- Docker 的優勢
- Docker 的應用場景
- Docker 核心概念
- (1)鏡像
- (2)容器
- (3)倉庫
- Docker 安裝
- 1.關閉系統防火墻和內核
- 2.下載Docker的repo文件
- 3.替換倉庫地址
- 4.更新索引文件并安裝Docker
- 5.添加國內鏡像站
- 6.開啟Docker服務
- 7.優化內核參數
- Docker鏡像操作
- 獲取鏡像
- 查看鏡像信息
- 查看鏡像的詳細信息
- 修改鏡像標簽
- 刪除鏡像
- (1)用鏡像名刪除
- (2)用ID刪除
- 存出鏡像和載入鏡像
- (1)導出
- (2)刪除
- (3)導出
- Docker 容器操作
- 容器的創建與啟動
- (1)創建容器
- (2)查看所有的容器
- (3)容器的運行
- (4)利用容器執行命令(命令執行完之后會退出)
- (5)在啟動容器時持續在后臺運行
- (6)容器的終止
- (7)進入容器
- (8)容器導出
- (9)容器導入生成鏡像
- (10)容器刪除
Docker概述
因為 Docker 輕便、快速的特性,可以使應用達到快速迭代的目的。每次小的變更,馬上就可以看到效果,而不用將若干個小變更積攢到一定程度再變更。每次變更一小部分其實是一種非常安全的方式,在開發環境中能夠快速提高工作效率。
Docker 容器能夠幫助開發人員、系統管理員、質量管理和版本控制工程師在一個生產環節中一起協同工作。制定一套容器標準能夠使系統管理員更改容器的時候,程序員不需要關心容器的變化,而更專注自己的應用程序代碼。從而隔離開了開發和管理,簡化了開發和部署的成本。
什么是 Docker
如果要方便的創建運行在云平臺上的應用,必須要脫離底層的硬件,同時還需要任何時間地點可獲取這些資源,這正是 Docker 所能提供的。Docker 的容器技術可以在一臺主機上輕松為任何應用創建一個輕量級的、可移植的、自給自足的容器。通過這種容器打包應用程序,意味著簡化了重新部署、調試這些瑣碎的重復工作,極大的提高了工作效率。
docker 是目前較為主流的容器技術。容器技術是一種輕量級的虛擬化技術,它可以讓應用程序及其依賴項打包在一個獨立的單元中運行,從而實現應用的隔離、可移植性和資源的高效利用。以下從概念、原理、與傳統虛擬化技術的對比、優勢、應用場景等方面詳細介紹容器技術。
容器就像是一個獨立的“盒子”,這個“盒子”里裝著運行某個應用所需要的所有東西,包括代碼、運行時環境、系統工具、系統庫等。不同的容器之間相互隔離,每個容器都有自己獨立的文件系統、進程空間、網絡接口等,就好像它們是在不同的機器上運行一樣,但實際上它們是共享宿主機的操作系統內核
Docker 的優勢
Docker 容器運行速度很快,啟動和停止可以在秒級實現,比傳統虛擬機要快很多;Docker 核心解決的問題是利用容器來實現類似虛擬機的功能,從而利用更加節省的硬件資源提供給用戶更多的計算資源。因此,Docker 容器除了運行其中的應用之外,基本不消耗額外的系統資源,在保證應用性能的同時,又減小了系統開銷,使得一臺主機上同時運行數千個 Docker 容器成為可能。
傳統虛擬化技術(如 Vware、VirtualBox 等)是通過虛擬機管理程序(Hypervisor)在物理服務器上創建多個虛擬機(VM),每個虛擬機都包含完整的操作系統。而容器技術是在操作系統層面進行虛擬化,多個容器共享宿主機的操作系統內核。
容器技術和傳統虛擬化的主要區別在于:
資源占用:傳統虛擬機需要為每個虛擬機分配獨立的操作系統,這會占用大量的系統資源;而容器共享宿主機的內核,只包含應用及其依賴項,資源占用相對較少,啟動速度也更快。
隔離性:虛擬機提供了更高程度的隔離,因為每個虛擬機都有自己獨立的操作系統;容器的隔離性相對較弱,但對于大多數應用場景來說已經足夠,并且可以通過合理的配置和管理來增強隔離性。
性能:由于虛擬機存在額外的虛擬化層,會帶來一定的性能開銷;容器直接運行在宿主機的內核上,性能損耗較小,更接近原生應用的性能。
Docker 操作方便,可以通過 Dockerfile 配置文件支持靈活的自動化創建和部署。
特性 | Docker 容器 | 虛擬機 |
---|---|---|
啟動速度 | 秒級 | 分鐘級 |
計算能力損耗 | 幾乎無 | 損耗 50%左右 |
性能 | 接近原生 | 弱于 |
系統支持量(單機) | 上千個 | 幾十個 |
隔離性 | 資源限制 | 完全隔離 |
容器技術的優勢主要體現在以下幾個方面:
隔離性:不同的容器之間相互隔離,一個容器的故障或異常不會影響其他容器的運行,提高了應用的穩定性和安全性。
可移植性:容器將應用及其依賴項打包成一個獨立的單元,使得應用可以在不同的環境中(如開發環境、測試環境、生產環境)無縫遷移和運行,避免了 “在我的機器上能運行,但在你的機器上不行” 的問題。
資源高效利用:容器共享宿主機的操作系統內核,不需要為每個應用運行獨立的操作系統大大減少了資源的浪費,提高了服務器的利用率。
快速部署和擴展:容器的啟動速度非常快,通常只需要幾秒鐘,而且可以根據需要快速創建和銷毀容器,方便進行應用的快速部署和彈性擴展。
Docker之所以擁有眾多優勢,與操作系統虛擬化自身的特點是分不開的。傳統虛擬機需要有額外的虛擬機管理程序和虛擬機操作系統層,而 Docker 容器則是直接在操作系統層面之上實現的虛擬化。
傳統虛擬機架構 | |
---|---|
應用程序 | 應用程序 |
運行環境 | 運行環境 |
虛擬機OS | 虛擬機OS |
虛擬機管理程序 | |
宿主機操作系統 | |
硬件層 |
Docker架構 | |
---|---|
應用程序 | 應用程序 |
運行環境 | 運行環境 |
Docker容器 | |
宿主機操作系統 | |
硬件層 |
Docker 的應用場景
開發環境管理:開發人員可以使用容器來創建一致的開發環境,確保團隊成員之間的環境一致性,提高開發效率。
持續集成和持續部署(CI/CD):在CI/CD程中,容器可以幫助實現應用的快速打包、測試和部署,實現自動化的軟件開發流程。
微服務架構:容器技術非常適合微服務架構,每個微服務可以打包成一個獨立的容器,獨立開發、測試和部署,提高系統的可伸縮性和容錯性。
云計算:云服務提供商可以利用容器技術為用戶提供更高效、靈活的計算資源,用戶可以根據自己的需求快速創建和管理容器化的應用。
Docker 核心概念
(1)鏡像
鏡像、容器、倉庫是 Docker 的三大核心概念。其中 Docker 的鏡像是創建容器的基礎,類似虛擬機的快照,可以理解為一個面向 Docker 容器引擎的只讀模板。例如:一個鏡像可以是一個完整的 cent0s 操作系統環境,稱為一個 centos 鏡像;也可以是一個安裝了 MySQL 的應用程序,稱之為一個 MySQL鏡像等等。
Docker 提供了簡單的機制來創建和更新現有的鏡像,用戶也可以從網上下載已經創建好的鏡像直接使用。
(2)容器
Docker 的容器是從鏡像創建的運行實例,它可以被啟動、停止和刪除。所創建的每一個容器都是相互隔離、互不可見,以保證安全性的平臺。可以將容器看作是一個簡易版的 Linux 環境,Docker 利用容器來運行和隔離應用。
(3)倉庫
Docker 倉庫是用來集中保存鏡像的地方,當創建了自己的鏡像之后,可以使用 push 命令將它上傳到公有倉庫(Public)或者私有倉庫(Private)。當下次要在另外一臺機器上使用這個鏡像時,只需從倉庫獲取。
倉庫注冊服務器(Registry)是存放倉庫的地方,其中包含了多個倉庫。每個倉庫集中存放某一類鏡像,并且使用不同的標簽(tag)來區分它們。目前最大的公共倉庫是 ocker Hub,存放了數量龐大的鏡像供用戶下載使用。
Docker 安裝
Docker 支持在主流的操作系統平臺上進行使用,包括 Windows 系統、Linux 系統、以及 Macos 系統等。目前最新的 RHEL、Cent 0s 以及 Ubuntu 系統官方軟件源中都已經默認自帶了 Docker 包,可直接安裝使用,也可以用 Docker 自己的 YUM 源進行配置。
Centos 系統下安裝 Docker 可以有兩種方式:一種是使用 CURL 獲得 Docker 的安裝腳本進行安裝另一種是使用 YUM 倉庫來安裝 Docker。注意:目前 Docker 只能支持 64 位系統。
1.關閉系統防火墻和內核
systemctl stop firewalldsystemctl disable firewalld
setenforce 0
sed -i's/=enforcing/=disabled/'/etc/selinux/config
2.下載Docker的repo文件
curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.替換倉庫地址
sed -i 's/$releasever/8/g' /etc/yum.repos.d/docker-ce.repo
sed -i 's/$basearch/x86 64/g' /etc/yum.repos.d/docker-ce.repo
4.更新索引文件并安裝Docker
dnf clean all
dnf makcache
dnf -y install docker-ce
5.添加國內鏡像站
由于工信部網絡政策調整,docker.io、gcr.io 等國際鏡像站的訪問受限,無法使用這些國外的鏡像站拉取鏡像,因此我們需要設置國內的鏡像站。
vim /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],"registry-mirrors": ["https://docker.m.daocloud.io","https://docker.imgdb.de","https://docker-0.unsee.tech","https://docker.hlmirror.com"]
}
6.開啟Docker服務
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
docker version
7.優化內核參數
cat>>/etc/sysctl.conf <<EOF
net.ipv4.ip forward=1
net.bridge.bridge-nf-call-ip6tables =1
net.bridge.bridge-nf-call-iptables =1
EOF
sysctl -p
Docker鏡像操作
運行 Docker 容器前需要本地存在對應的鏡像。如果不存在本地鏡像,Docker 就會嘗試從默認鏡像倉庫下載。鏡像倉庫是由 Docker 官方維護的一個公共倉庫,可以滿足用戶的絕大部分需求。用戶也可以通過配置來使用自定義的鏡像倉庫。
獲取鏡像
docker pull nginx:1.24.0
docker pull 是 Docker 里的一個關鍵命令,其主要功能是從 Docker 鏡像倉庫(默認是 DockerHub)中拉取鏡像到本地 Docker 主機
命令語法:
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
參數說明:
OPTIONS(可選參數)
-a,–all-tags:拉取指定倉庫中的所有標簽的鏡像。
–disable-content-trust:默認值為 true,該選項用于禁用鏡像內容驗證,也就是不驗證鏡像的簽名。
NAME[:TAG|@DIGEST]
NAME:這是要拉取的鏡像的名稱,它可以包含倉庫地址和命名空間信息。例如,在DockerHub 上的鏡像,如果是官方鏡像,通常直接寫鏡像名,如 nginx;如果是用戶或組織的鏡像,則格式為 用戶名/鏡像名,像 dockerlibrary/redis 。>TAG(可選):指定要拉取的鏡像的具體標簽,用于區分同一鏡像的不同版本。若不指定標簽,默認會拉取 latest 標簽的鏡像。
DIGEST(可選):通過鏡像的摘要信息來精確指定要拉取的鏡像版本,這能確保拉取的是特定哈希值對應的精確鏡像,避免因標簽可能指向不同版本而產生混淆。格式如nginx@sha256:abcdef123456…
對于Docker 鏡像來說,如果下載鏡像時不指定標簽,則默認會下載倉庫中最新版本的鏡像,即選擇標簽為 latest 標簽,也可通過指定的標簽來下載特定版本的某一鏡像。這里標簽(tag)就是用來區分鏡像版本的。
從整個下載的過程可以看出,鏡像文件是由若干層(Layer)組成,稱之為AUFS(聯合文件系統),是實現增量保存與更新的基礎,下載過程中會輸出鏡像的各層信息。鏡像下載到本地之后就可以隨時使用該鏡像了。 用戶也可以選擇從其他注冊服務器倉庫下載,這時需要在倉庫名稱前指定完整的倉庫注冊服務器地址。
查看鏡像信息
docker images
docker images 是 Docker 中一個基礎且常用的命令,主要用于列出本地 Docker 主機上的鏡像信息。docker images 命令會列出本地 Docker 主機上所有可用的鏡像,展示鏡像的基本信息,幫助用戶了解本地鏡像的存儲情況,包括鏡像的倉庫名、標簽、鏡像 ID、創建時間和大小等。
從顯示的情況可以讀出以下信息:
REPOSITORY:鏡像屬于的倉庫;
TAG:鏡像的標簽信息,標記同一個倉庫中的不同鏡像;
IMAGE ID:鏡像的唯- ID 號,唯一標識一個鏡像;
CREATED:鏡像創建時間;
VIRTUAL SIZE:鏡像大小;
命令語法:
docker imageS [OPTIONS][REPOSITORY[:TAG]]
參數說明:
OPTIONS(可選參數)
-a,–a11:顯示所有鏡像(包括中間層鏡像)。默認情況下,docker images 只顯示頂層鏡像。
–digests:顯示鏡像的摘要信息。
-f,–filter filter:根據指定的條件過濾輸出結果。過濾條件可以是多種類型,例如 dangling=true表示只顯示虛懸鏡像(沒有標簽的鏡像)
–format string:使用 Go 模板語法自定義輸出格式。
–no-trunc:不截斷輸出信息,完整顯示鏡像ID等較長的字段。
-q,–quiet:只顯示鏡像的 ID。
REPOSITORY[:TAG](可選)
REPOSITORY:指定要顯示的鏡像倉庫名稱。
TAG:指定要顯示的鏡像標簽。如果不指定標簽,默認顯示所有標簽的鏡像
查看鏡像的詳細信息
docker inspect id
docker inspect 是 Docker 中一個非常實用的命令,它用于返回 Docker 對象(如容器、鏡像、網絡、卷等)的底層詳細信息,這些信息以 JSON 格式展示,方便用戶深入了解 Docker 對象的配置和狀態。
命令語法:
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
參數說明:
OPTIONS:可選參數,用于指定輸出格式或過濾特定信息,常見的選項有:
–format,-f:指定輸出格式,使用 Go 模板語法
–size,-s:在輸出中顯示容器的文件系統大小(僅適用于容器)。
NAME|ID:要檢査的 Docker 對象的名稱或 ID,可以指定多個對象。
可檢查的 Docker 對象
docker inspect 可以檢査多種 Docker 對象,常見的包括:
容器(Container):獲取容器的詳細信息,如運行狀態、網絡配置、掛載點等
鏡像(Image):查看鏡像的構建歷史、層信息、環境變量等。
網絡(Network):了解網絡的配置,如驅動類型、子網信息等。
卷(Volume):獲取卷的詳細信息,如掛載路徑、驅動類型等。
修改鏡像標簽
在 Docker 中,docker tag 命令用于為現有的 Docker 鏡像添加一個新的標簽(tag)。標簽本質上是鏡像的一個別名,它可以讓你更方便地引用和管理鏡像,同時也有助于區分不同版本或用途的鏡像。
命令語法:
docker tag SOURCE IMAGE[:TAG] TARGET IMAGE[:TAG]
參數說明:
SOURCE IMAGE[:TAG]:指定源鏡像的名稱和標簽。SOURCE IMAGE 是源鏡像的名稱,[:TAG]是可選的標簽,如果不指定標簽,默認使用 latest。
TARGET IMAGE[:TAG]:指定目標鏡像的名稱和標簽。這是你要為源鏡像添加的新標簽。同樣,TARGET IMAGE 是目標鏡像的名稱,[:TAG]是可選的標簽,如果不指定標簽,默認使用 latest。
docker tag 命令并不會創建一個新的鏡像,它只是為現有的鏡像添加一個額外的標簽。多個標簽可以指向同一個鏡像,這些標簽只是鏡像的不同引用方式。
刪除鏡像
(1)用鏡像名刪除
(2)用ID刪除
命令語法:
docker rmi [OPTIONS] IMAGE [IMAGE...]
參數說明:
OPTIONS(可選參數)
-f,–force:強制刪除鏡像。即使有容器正在使用該鏡像,也會嘗試刪除,但不建議輕易使用,因為可能導致容器無法正常運行。
–no-prune:默認情況下,刪除鏡像時會同時刪除該鏡像相關的未使用的父鏡像層(虛懸鏡像),使用該選項可以禁止刪除這些父鏡像層。
IMAGE
指定要刪除的鏡像,可以是鏡像的名稱、標簽、鏡像 ID,也可以同時指定多個鏡像。例如:nginx:latest、123456789abc等。
注意事項:
在刪除鏡像之前,要確保沒有正在運行或已停止的容器依賴該鏡像。可以使用 docker ps -a命令査看所有容器,使用 docker stop 和 docker rm 命令停止并刪除依賴該鏡像的容器后,再刪除鏡像。
鏡像的刪除是不可逆的操作,刪除后無法恢復,所以在執行刪除操作前要謹慎確認。
當刪除一個有多個標簽的鏡像時,刪除一個標簽只是移除該標簽的引用,只有當所有標簽都被刪除后,鏡像才會真正從磁盤上刪除。
可以使用 docker rmi 命令刪除多余的鏡像。刪除鏡像的操作有兩種方法:使用鏡像的標簽刪除鏡像;使用鏡像的 ID 刪除鏡像。
當一個鏡像有多個標簽的時候,docker rmi 命令只是刪除該鏡像多個標簽中的指定標簽,不會影響鏡像文件,相當于只刪除了鏡像 a0760f339193 的一個標簽而己。但當該鏡像只剩下一個標簽的時候,再使用刪除命令就會徹底刪除該鏡像。
當使用 docker rmi 命令后面指定了某個鏡像 ID 時,必須確保該鏡像當前沒有被任一容器使用才能進行。刪除時系統會先刪除掉所有指向該鏡像的所有標簽,然后刪除該鏡像文件本身。如果該鏡像已經被容器使用,正確的做法是先刪除依賴該鏡像的所有容器,再去刪除鏡像。
存出鏡像和載入鏡像
(1)導出
docker save -o nginx nginx:1.24.0
docker save 命令用于將一個或多個 Docker 鏡像保存為一個 tar 歸檔文件,這在需要將鏡像傳輸到其他 Docker 環境(如離線環境)時非常有用。
docker save 命令的主要作用是將本地 Docker 主機上的一個或多個鏡像打包成一個 tar 文件,方便在不同的 Docker 環境之間傳輸和共享鏡像。這個過程只是將鏡像的文件系統層和元數據保存下來,并不包含鏡像的歷史記錄和構建信息。
注意事項:
文件大小:保存的鏡像文件可能會非常大,尤其是包含多個大型鏡像時。在保存和傳輸這些文件時,要確保有足夠的磁盤空間和網絡帶寬。
鏡像版本:保存的鏡像文件中包含的是特定版本(標簽)的鏡像。在恢復鏡像時,要確保使用正確的標簽和版本。
跨平臺兼容性:雖然 Docker鏡像是設計為跨平臺的,但在不同的操作系統上保存和加載鏡像時,可能會遇到一些兼容性問題。盡量在相同或兼容的操作系統版本之間傳輸和使用鏡像。
鏡像依賴:如果保存的鏡像依賴于其他基礎鏡像,確保在目標環境中也有這些基礎鏡像,或者將它們一起保存和傳輸。
(2)刪除
docker rmi nginx:1.24.0
(3)導出
docker load<nginx
當需要把一臺機器上的鏡像遷移到另一臺機器上的時候,需要將鏡像保存成為本地文件,這一過程叫做存出鏡像,可以使用 docker save 命令進行存出操作,之后就可以拷貝該文件到其他機器。將存出的鏡像從機器 A 拷貝到機器 B后,需要在機器 B上使用該鏡像,就可以將該文件導入到機器 B 的鏡像庫中,這一過程叫做載入鏡像。使用 docker load
或者docker --input
進行載入操作。
Docker 容器操作
容器是 Docker 的另一個核心概念。簡單說,容器是鏡像的一個運行實例,是獨立運行的一個或一組應用以及它們所必需的運行環境,包括文件系統、系統類庫、shell環境等。鏡像是只讀模板,而容器會給這個只讀模板添加一個額外的可寫層。
容器的創建與啟動
Docker 的創建就是將鏡像加載到容器的過程。Docker 的容器十分輕量級,用戶可以隨時創建或者刪除。新創建的容器默認處于停止狀態,不運行任何程序,需要在其中發起一個進程來啟動容器,這個進程是該容器的唯一進程,所以當該進程結束時,容器也會完全停止。停止的容器可以重新啟動并保留原來的修改。可以使用 docker create 命令新建一個容器。
(1)創建容器
docker create -it centos:7
docker create 是 Docker 中的一個重要命令,它的主要作用是基于指定的鏡像創建一個新的容器,但并不立即啟動該容器。下面將對 docker create 命令進行詳細解釋。
命令語法:docker create[OPTIONS]IMAGE[COMMAND][ARG...]
參數說明:
OPTIONS(可選參數):dockercreate支持眾多可選參數,這些參數可以幫助你對創建的容器進行各種配置,以下是一些常用的參數:
-i,–interactive:保持標準輸入打開,即使沒有附加到容器上,常用于需要交互的應用程序。
-t,–tty:分配一個偽終端,通常與-i 一起使用,模擬一個交互式的終端環境,如docker create -it
-p,–publish list:將容器內的端口映射到宿主機的端口,格式為 宿主機端口:容器端口,例如-p 8080:80 表示將容器的 80 端口映射到宿主機的 8080 端口。
-v,–volume list:掛載數據卷,將宿主機的目錄或文件掛載到容器內,格式為 宿主機路徑:容器路徑,例如-v /host/data:/container/data。
–name string:為創建的容器指定一個自定義的名稱,方便后續管理和識別。
-e,–env list:設置容器內的環境變量,格式為變量名=變量值,例如-eDB HOST=localhost。
–network string:指定容器要加入的網絡,例如–network my network。
IMAGE
指定用于創建容器的鏡像名稱和標簽,如nginx:latest。如果本地沒有該鏡像,
Docker 會嘗試從 Docker Hub 等鏡像倉庫中拉取。
[COMMAND][ARG...](可選)
指定容器啟動時要執行的命令及其參數。如果不指定,將使用鏡像的默認啟動命令。
docker create 命令主要用于提前準備好容器的配置,創建一個處于停止狀態的容器實例。之后可以在需要的時候使用 docker start 命令啟動該容器。這種方式在一些場景下非常有用
例如:
批量創建多個配置好的容器,在需要時逐個啟動,提高部署效率。
對容器進行預配置,進行多次測試或驗證不同的啟動參數。
注意事項
創建容器時,要確保指定的鏡像存在于本地或者可以從鏡像倉庫中拉取。
使用 docker create 創建的容器處于停止狀態,需要使用 docker start 命令啟動。
對于復雜的容器配置,要仔細檢査參數的正確性,避免出現配置錯誤導致容器無法正常工作。
(2)查看所有的容器
docker ps -a
docker ps 是 Docker 中一個非常基礎且常用的命令,主要用于列出 Docker 容器的相關信息。通過該命令,用戶可以査看容器的運行狀態、ID、名稱、所使用的鏡像等關鍵內容,方便對容器進行管理和監控。
命令語法:
docker ps [OPTIONS]
參數說明:
docker ps 支持眾多可選參數,這些參數可以幫助用戶根據不同需求篩選和定制輸出信息。下面介紹一些常用的參數:
-a,–all:列出所有容器,包括正在運行的和已經停止的容器。默認情況下,docker ps僅顯示正在運行的容器
-q,–quiet:只顯示容器的D,不顯示其他詳細信息。該參數常用于腳本編寫,方便批量操作容器,比如批量停止或刪除容器
-s,–size:在輸出中顯示容器所占用的文件系統大小,包括讀寫層大小和總大小。
-f,–filter filter:根據指定的條件過濾輸出結果。過濾條件可以有多種,例如status=running 表示只顯示正在運行的容器;name=my container 表示只顯示名稱為my_container 的容器
–format string:使用 Go 模板語法自定義輸出格式,用戶可以根據自己的需求靈活定制輸出內容和樣式、
-n,–last int:顯示最近創建的n個容器(包括已停止的)。例如,docker ps -n 3
會顯示最近創建的3個容器信息。
-l,–latest:只顯示最近創建的容器(包括已停止的)
(3)容器的運行
docker start id
docker start 是 Docker 中用于啟動已創建但處于停止狀態容器的命令。docker start 命令的主要作用是將之前使用 docker create 創建好但處于停止狀態的容器,或者之前已經停止運行的容器重新啟動起來。它會重新初始化容器的運行環境,加載相關資源,讓容器內的進程繼續執行。
命令語法:
docker start [OPTIONS] CONTAINER [CONTAINER...]
參數說明:
OPTIONS(可選參數)
-a,–attach:將本地標準輸入、輸出和錯誤輸出附加到啟動的容器上,即啟動容器后進入容器的交互界面,能實時看到容器內程序的輸出信息,也可以向容器內輸入命令。
-i,–interactive:保持容器的標準輸入打開,允許你與容器內的進程進行交互。通常和-a 選項一起使用,以實現交互式操作。
–checkpoint string:指定從哪個檢査點恢復容器。檢查點功能允許你保存容器的當前狀態,之后可以從該狀態恢復容器的運行。
–checkpoint-dir string:指定檢査點文件所在的目錄。
–detach-keys string:指定從附加模式退出的鍵序列。默認情況下,使用 ctrl-p Ctrl -q組合鍵可以從附加模式退出容器,同時保持容器在后臺運行。
–publish-all,-P:發布容器內所有暴露的端口到宿主機上,宿主機端口會隨機分配。
CONTAINER [CONTAINER...]
可以指定一個或多個要啟動的容器,既可以使用容器的名稱,也可以使用容器的 ID。
注意事項:
若容器啟動失敗,可使用 docker logs 命令査看容器的日志信息,以排査啟動失敗的原因。使用 -a 選項附加到容器時,若要退出容器又不停止它,可使用默認的 ctr1-pctr1-q組合鍵(可通過–detach -keys 選項修改)。對于依賴外部資源(如數據庫、網絡服務)的容器,要確保這些資源在啟動容器前已經可用,否則容器可能因無法連接到依賴資源而啟動失敗。
(4)利用容器執行命令(命令執行完之后會退出)
docker run 是 Docker 中最常用的命令之一,它的主要功能是基于指定的鏡像創建并啟動一個新的容器。以下將從命令語法、參數說明、使用示例和注意事項幾個方面對 docker run 命令進行詳細解釋
命令語法:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
參數說明:
OPTIONS(可選參數):dockerrun支持眾多可選參數,用于對容器的各種屬性和行為進行配置,下面介紹一些常用的參數:
容器運行模式相關
-d,–detach:讓容器在后臺運行,并返回容器的 ID。使用該參數后,容器啟動后不會將輸出信息顯示在當前終端,適用于長時間運行的服務類容器。
-i,–interactive:保持標準輸入打開,允許你與容器內的進程進行交互
-t,–tty:分配一個偽終端,通常與-i 一起使用,模擬一個交互式的終端環境,例如 docker run -it 常用于創建交互式容器。
容器命名和資源限制相關
–name string:為創建的容器指定一個自定義的名稱,方便后續管理和識別。
-m,–memory bytes:限制容器可以使用的內存大小,例如-m 512m 表示限制容器最多使用 512MB 的內存。
–cpus decimal:限制容器可以使用的 CPU 資源,例如 --cpus 0.5 表示容器最多可以使用 0.5 個 CPU 核心。
端口映射和數據卷相關
-p,–publish list:將容器內的端口映射到宿主機的端口,格式為 宿主機端口:容器端口,例如-p 8080:80 表示將容器的 80 端口映射到宿主機的 8080 端口。
-P,–publish-all:發布容器內所有暴露的端口到宿主機上,宿主機端口會隨機分配。
–volume list:掛載數據卷,將宿主機的目錄或文件掛載到容器內,格式為 宿主機路徑:容器路徑,例如-v/host/data:/container/data。
環境變量和網絡相關
-e --env list:設置容器內的環境變量,格式為變量名=變量值,例如 -eDB HOST=localhost.
–network string:指定容器要加入的網絡,例如–network my_network。
IMAGE
指定用于創建容器的鏡像名稱和標簽,如 nginx:latest。如果本地沒有該鏡像,Docker 會嘗試從 Docker Hub 等鏡像倉庫中拉取。
[COMMAND] [ARG...](可選)
指定容器啟動時要執行的命令及其參數。如果不指定,將使用鏡像的默認啟動命令
(5)在啟動容器時持續在后臺運行
docker run -dit centos:7 /bin/bash
或
docker run -d centos:7 /bin/bash -c "ls"
注意事項:
容器退出問題:若容器內的主進程退出,容器也會隨之停止運行。例如,若在容器內運行的腳本執行完畢后沒有其他持續運行的進程,容器就會停止。因此,要確保容器內有持續運行的服務或進程。
日志查看:由于容器在后臺運行,無法直接看到其輸出信息。可以使用 docker logs 命令查看容器的日志,例如 docker logs<容器 ID 或名稱》,以此來排査容器運行過程中出現的問題。
資源占用:在后臺運行的容器會持續占用系統資源(如CPU、內存等),要注意監控容器的資源使用情況,避免資源過度占用影響系統性能。可以使用 docker stats 命令查看容器的資源使用統計信息。
(6)容器的終止
docker stop id
執行該命令后,Docker 會向 my_nginx 容器內的主進程發送 SIGTERM 信號,等待 10 秒(默認時間),如果進程沒有自行終止,再發送SIGKILL 信號強制終止。
docker stop 命令用于優雅地停止一個或多個正在運行的 Docker 容器。docker stop 命令的主要作用是向正在運行的容器內的主進程發送終止信號,讓容器內的應用程序有機會正常關閉和清理資源,而不是像 docker ki11 那樣直接強制終止容器。這有助于避免數據丟失或損壞,保證應用程序的正常關閉流程。
如果希望在停止容器時等待20秒,再進行強制終止,可以使用t選項:
docker stop -t 20 my_nginx
注意事項:
容器響應情況:有些容器內的應用程序可能無法正確處理SIGTERM 信號,導致無法在指定時間內正常關閉。在這種情況下,Docker 會在等待時間結束后發送SIGKILL 信號強制終止容器,可能會造成數據丟失。
依賴關系:在停止容器時,要考慮容器之間的依賴關系。如果一個容器依賴于另一個容器提供的服務,先停止被依賴的容器可能會導致依賴容器出現問題。
停止狀態檢查:可以使用 docker ps 命令檢查容器是否已經成功停止。停止的容器不會再出現在 docker ps 的輸出中,但可以使用 docker ps -a 査看所有容器(包括已停止的)。
(7)進入容器
docker exec -it 59 /bin/bash
退出
exit
docker exec 命令是 Docker 中一個非常實用的工具,它允許你在一個正在運行的容器內部執行額外的命令。docker exec 命令的主要作用是在不停止容器運行的情況下,對正在運行的容器進行調試.維護或執行一些臨時任務。通過該命令,你可以在容器內部執行各種操作,就像直接登錄到容器內部的操作系統一樣。以下是對該命令的詳細解釋:
命令語法:
docker exeC[OPTIONS]CONTAINER COMMAND [ARG...]
參數說明:
OPTIONS(可選參數)
-d,–detach:讓命令在容器后臺執行,不將命令的輸出信息顯示在當前終端,執行后會返回命令在容器內的執行進程 ID。
-i,–interactive:保持標準輸入打開,允許你與容器內執行的命令進行交互,通常用于需要輸入信息的命令。
-t --tty:分配一個偽終端,模擬一個交互式的終端環境,一般和-i 一起使用,即docker exec-it,這樣可以讓你像在本地終端一樣與容器內的命令進行交互。
-u,–user string:指定在容器內執行命令的用戶,可以是用戶名或用戶 ID,例如–user root 表示以 root 用戶身份執行命令。
-w,–workdir string:指定命令在容器內的工作目錄,即命令執行時的當前目錄。
CONTAINER
指定要在哪個正在運行的容器中執行命令,可以使用容器的名稱或者ID
COMMAND TARG…
指定要在容器內執行的命令及其參數。例如,執行1s 命令查看容器內的文件列表,或者執行 bash 進入容器的 shell 環境。
注意事項
容器必須正在運行:docker exec 只能對正在運行的容器執行命令。如果容器處于停止狀態,該命令將無法執行。
權限問題:在容器內執行命令時,要注意用戶的權限。某些操作可能需要root 權限才能完成,如果使用普通用戶身份執行可能會失敗。
命令執行環境:容器內的環境可能與宿主機不同,例如軟件安裝情況、環境變量設置等。在執行命令時,要確保容器內已經安裝了所需的軟件,并且環境配置正確。
(8)容器導出
docker export 59 > centos7
docker export 命令用于將一個運行中的或已停止的 Docker 容器的文件系統內容導出為一個 tar歸檔文件。
應用場景:
遷移容器:當你需要把一個容器從一個 Docker 環境遷移到另一個 Docker 環境時,可以使用 docker export 導出容器的文件系統,再在目標環境中導入使用。
備份容器:對容器的當前狀態進行備份,以便在需要時可以恢復到該狀態。
分析容器內容:將容器的文件系統導出后,可以在宿主機上查看和分析容器內的文件和目錄結構。
注意事項:
與 docker save 的區別:
docker save 操作的對象是鏡像,保存的是鏡像的所有層信息和元數據,包括鏡像的歷史記錄和構建信息,而 docker export 操作的對象是容器,只保存容器當前的文件系統狀態,不包含鏡像的歷史和構建信息。
使用 docker save 保存的鏡像可以直接使用 docker load 加載到其他 Docker 環境中,而使用 docker export 導出的容器文件系統需要使用 docker import 導入,導入后會生成一個新的鏡像,且該鏡像沒有之前的歷史記錄。
容器狀態:無論容器是運行中還是已停止,都可以使用 docker export 命令進行導出。不過,在導出運行中的容器時,要注意容器內的文件可能正在被修改,導出的文件系統狀態可能不是一個完全一致的快照。
文件大小:導出的 tar 文件可能會比較大,尤其是對于包含大量文件的容器。在導出和存儲時,要確保有足夠的磁盤空間。
權限問題:導出的文件系統中的文件權限可能會受到宿主機和容器之間權限映射的影響。在導入到新環境后,要檢查文件權限是否符合預期。
(9)容器導入生成鏡像
(10)容器刪除
docker rm 是 Docker 中用于刪除容器的基礎命令。
命令語法:
docker rm [OPTIONS] CONTAINER [CONTAINER...]
參數說明:
-f,–force:強制刪除正在運行的容器。默認情況下,docker rm 只能刪除已停止的容器,添加該選項后,會向容器內的主進程發送SIGKILL 信號,直接終止容器并將其刪除,但可能導致數據丟失或應用異常。
-l,–link:僅刪除容器的網絡連接,而不刪除容器本身。通常用于清理容器與網絡之間的關聯。
-v,–volumes:在刪除容器的同時,刪除與該容器關聯的數據卷。如果數據卷中存儲著重要數據,使用該選項要謹慎。CONTAINER[CONTAINER…]:指定要刪除的容器,可以是容器的名稱或者 ID,支持同時指定多個容器,用空格分隔。
使用場景:
資源清理:當容器不再使用時,及時刪除以釋放系統資源,如磁盤空間、內存和網絡端口等。
環境重置:在開發或測試環境中,需要頻繁創建和刪除容器,以重置環境、測試不同的配置或重新部署應用。
故障排除:當容器出現無法恢復的故障時,刪除容器并重新創建可能是解決問題的有效方法。
注意事項:
容器狀態:默認只能刪除已停止的容器,若要刪除正在運行的容器,需使用-f 選項,但可能會導致數據丟失或應用異常,因此盡量先使用 docker stop 正常停止容器后再刪除
數據卷處理:使用 -v 選項刪除容器關聯的數據卷時要謹慎,確保數據卷中的數據不再需要,否則可能造成數據丟失。
依賴關系:在刪除容器前,要考慮容器之間的依賴關系。如果一個容器依賴于另一個容器提供的服務,先刪除被依賴的容器可能會導致依賴容器出現問題。
不可逆操作:容器刪除后無法直接恢復,因此在執行刪除操作前要確認容器確實不再需要。
刪除所有容器