目錄
一:Docker 概述
1:什么是Docker
2:Docker 的優勢
3:Docker的應用場景
4:Docker核心概念
二:Docker 安裝
三:Docker 鏡像操作
1:獲取鏡像
2:查看鏡像信息
3:查看鏡像的詳細信息
4:修改鏡像標簽(老名字+新名字)
5:刪除鏡像
6:存出鏡像和載入鏡像
四:Docker 容器操作
一:Docker 概述
? ? ? ? ?因為 Docker 輕便、快速的特性,可以使應用達到快速迭代的目的。每次小的變更,馬上就可以看到效果,而不用將若干個小變更積攢到一定程度再變更。每次變更一小部分其實是一種非常安全的方式,在開發環境中能夠快速提高工作效率。
? ? ? ? ?Docker 容器能夠幫助開發人員、系統管理員、質量管理和版本控制工程師在一個生產環節中一起協同工作。制定一套容器標準能夠使系統管理員更改容器的時候,程序員不需要關心容器的變化,而更專注自己的應用程序代碼。從而隔離開了開發和管理,簡化了開發和部署的成本。
1:什么是Docker
類別 | 描述 |
---|---|
定義 | Docker是一種輕量級的容器技術,用于打包應用程序及其依賴項,實現應用的隔離和可移植性。 |
核心功能 | 創建輕量級、可移植、自給自足的容器,簡化部署和調試工作。 |
技術原理 | 共享宿主機操作系統內核,但容器間擁有獨立的文件系統、進程空間和網絡接口。 |
與傳統虛擬化對比 | 傳統虛擬化需模擬完整操作系統(如VM),而容器僅虛擬化用戶空間,更輕量高效。 |
優勢 | 1. 高效利用資源 2. 快速啟動和部署 3. 環境一致性(開發、測試、生產) 4. 易于擴展和維護 |
應用場景 | 1. 微服務架構 2. 持續集成/持續部署(CI/CD) 3. 云原生應用開發 4. 多租戶環境隔離 |
容器特點 | 像一個獨立“盒子”,包含應用所需的代碼、運行時、工具和庫,與其他容器隔離運行。 |
2:Docker 的優勢
? ? ? ? Docker 容器運行速度很快,啟動和停止可以在秒級實現,比傳統虛擬機要快很多;Docker 核心解決的問題是利用容器來實現類似虛擬機的功能,從而利用更加節省的硬件資源提供給用戶更多的計算資源。因此,Docker 容器除了運行其中的應用之外,基本不消耗額外的系統資源,在保證應用性能的同時,又減小了系統開銷,使得一臺主機上同時運行數千個 Docker 容器成為可能。
? ? ? ? 傳統虛擬化技術(如 Vware、VirtualBox 等)是通過虛擬機管理程序(Hypervisor)在物理服務器上創建多個虛擬機(VM),每個虛擬機都包含完整的操作系統。而容器技術是在操作系統層面進行虛擬化,多個容器共享宿主機的操作系統內核。
? ? ? ? 容器技術和傳統虛擬化的主要區別在于:
對比維度 | 容器技術 | 傳統虛擬化 |
---|---|---|
資源占用 | 共享宿主機內核,僅包含應用及依賴項,資源占用少,啟動速度快(秒級)。 | 每個虛擬機需獨立運行完整操作系統,資源占用高(CPU、內存、存儲),啟動較慢(分鐘級)。 |
隔離性 | 進程級隔離,依賴宿主機內核,隔離性較弱(但可通過配置增強)。 | 硬件級隔離,每個虛擬機有獨立OS,安全性更高。 |
性能 | 直接調用宿主機內核,性能損耗極低,接近原生應用。 | 需通過虛擬化層(Hypervisor)訪問硬件,存在額外性能開銷。 |
適用場景 | 高密度微服務、CI/CD、快速擴展、云原生應用。 | 需要強隔離的多租戶環境、異構OS運行(如Windows與Linux共存)。 |
代表技術 | Docker、Kubernetes、LXC。 | VMware、Hyper-V、KVM。 |
? ? ? ?Docker 操作方便,可以通過 Dockerfile 配置文件支持靈活的自動化創建和部署。表1將 Docker容器技術與傳統虛擬機的特性進行了比較。
特性 | Docker 容器 | 虛擬機 |
---|---|---|
啟動速度 | 秒級(快速啟動,適合動態伸縮) | 分鐘級(需啟動完整操作系統) |
計算能力損耗 | 幾乎無(直接調用宿主機內核) | 約 50%(需通過虛擬化層訪問硬件) |
性能 | 接近原生(低延遲,高吞吐) | 較弱(受虛擬化開銷影響) |
單機系統支持量 | 上千個(輕量級,共享內核) | 幾十個(資源占用高) |
隔離性 | 進程級隔離(通過命名空間/Cgroups限制資源,隔離性較弱但可配置增強) | 完全隔離(獨立OS,硬件級安全) |
資源占用 | 極低(僅包含應用及依賴項) | 高(需分配獨立OS、虛擬硬件) |
適用場景 | 微服務、CI/CD、云原生應用、高密度部署 | 強隔離需求(如多租戶、異構OS)、傳統應用遷移 |
代表技術 | Docker, Kubernetes, Podman | VMware, Hyper-V, KVM |
容器技術的優勢主要體現在以下幾個方面:
優勢 | 具體表現 | 與傳統虛擬化對比 | 應用場景示例 |
---|---|---|---|
隔離性 | 進程級隔離,故障容器不影響其他容器(通過命名空間/Cgroups實現)。 | 弱于虛擬機的硬件級隔離,但已滿足多數應用需求。 | 多租戶SaaS服務、微服務架構 |
可移植性 | 一次打包,隨處運行(依賴統一鏡像格式),避免環境差異問題。 | 虛擬機需攜帶完整OS鏡像,體積大且環境適配復雜。 | 跨云平臺部署、開發-生產環境一致性保障 |
資源高效利用 | 共享宿主機內核,無冗余OS開銷,單機可運行上千容器。 | 虛擬機需為每個實例分配獨立OS資源,利用率低(單機通常僅幾十個實例)。 | 高密度計算、邊緣計算資源優化 |
快速部署擴展 | 秒級啟動,支持快速水平擴展和自動伸縮(如K8s HPA)。 | 虛擬機啟動需分鐘級,擴展速度慢。 | 突發流量應對、CI/CD流水線加速 |
版本控制 | 鏡像分層存儲,支持版本回滾和增量更新(通過Dockerfile管理)。 | 虛擬機快照體積大,回滾效率低。 | 藍綠部署、熱修復 |
生態工具鏈 | 豐富的編排工具(K8s/Swarm)、監控(Prometheus)、日志(ELK)等開源解決方案。 | 虛擬機管理工具(如vCenter)多為商業軟件,生態封閉。 | DevOps全流程自動化 |
? ? ? ? Docker之所以擁有眾多優勢,與操作系統虛擬化自身的特點是分不開的。傳統虛擬機需要有額外的虛擬機管理程序和虛擬機操作系統層,而 Docker 容器則是直接在操作系統層面之上實現的虛擬化。圖 2是 Docker 與傳統虛擬機架構。
3:Docker的應用場景
應用場景 | 技術優勢 | 實現方式 | 典型案例 |
---|---|---|---|
開發環境管理 | 環境一致性(避免“在我機器上能跑”問題),依賴隔離。 | 使用?Dockerfile ?定義環境,通過鏡像共享給團隊。 | 新成員快速搭建開發環境,跨OS團隊協作。 |
CI/CD 流水線 | 快速構建、測試隔離、版本固化。 | 在 Jenkins/GitLab CI 中集成 Docker,構建鏡像并推送至倉庫。 | 自動化測試、一鍵回滾。 |
微服務架構 | 獨立部署、資源隔離、彈性伸縮。 | 每個微服務打包為容器,通過 Kubernetes 編排。 | 電商系統、支付服務解耦。 |
云計算 | 資源高效利用、秒級部署、多云兼容。 | 云廠商提供容器服務(如 AWS ECS、阿里云 ACK)。 | 突發流量自動擴容,混合云部署。 |
邊緣計算 | 輕量級、低資源占用,適應異構設備。 | 在邊緣節點部署容器化應用(如 IoT 數據處理)。 | 工廠設備實時監控,CDN 節點優化。 |
數據科學 | 環境復現、依賴管理。 | JupyterLab 或 ML 模型打包為容器,共享數據集和訓練環境。 | AI 團隊協作訓練模型。 |
遺留應用現代化 | 無需重構代碼即可遷移至云環境。 | 將傳統應用(如 Java WAR 包)容器化,逐步拆分微服務。 | 銀行系統上云改造。 |
4:Docker核心概念
核心概念 | 定義 | 特點 | 操作示例 | 類比說明 |
---|---|---|---|---|
鏡像 | 只讀模板,包含運行容器所需的文件系統結構和依賴項。 | - 分層存儲(Union FS) - 可復用、版本控制 - 靜態不可變 | - 構建鏡像:docker build -t my-image . - 拉取鏡像: docker pull nginx | 類似虛擬機的“安裝光盤”或“快照”。 |
容器 | 鏡像的運行實例,包含獨立的進程空間、網絡和文件系統。 | - 輕量級(秒級啟停) - 隔離性(命名空間/Cgroups) - 動態可讀寫 | - 啟動容器:docker run -d --name my-container nginx - 進入容器: docker exec -it my-container bash | 類似“正在運行的虛擬機實例”。 |
倉庫 | 集中存儲和分發鏡像的服務,分為公有倉庫(Docker Hub)和私有倉庫(自建)。 | - 支持多標簽(tag) - 權限控制(私有倉庫) - 鏡像版本管理 | - 推送鏡像:docker push my-repo/my-image:tag - 搜索鏡像: docker search mysql | 類似“應用商店”或“代碼倉庫(Git)”。 |
二:Docker 安裝
? ? Docker 支持在主流的操作系統平臺上進行使用,包括 Windows 系統、Linux 系統、以及 Macos 系統等。目前最新的 RHEL、Cent 0s 以及 Ubuntu 系統官方軟件源中都已經默認自帶了 Docker 包,可直接安裝使用,也可以用 Docker 自己的 YUM 源進行配置。
? ? Centos 系統下安裝 Docker 可以有兩種方式:一種是使用CURL 獲得 Docker 的安裝腳本進行安裝,另一種是使用 YUM 倉庫來安裝 Docker。注意:目前 Docker 只能支持 64 位系統。
本安裝方式使用阿里的軟件倉庫
?
# 步驟 1: 添加軟件源信息
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo# 步驟 2: 安裝必要的系統工具
yum install -y yum-utils# 步驟 3: 安裝 Docker-CE
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum clean all
yum makecache
yum -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin# 步驟4:添加國內鏡像站
mkdir -p /etc/docker/
cat > /etc/docker/daemon.json <<EOF
{"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"]
}
EOF# 步驟5:開啟Docker服務
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
docker version# 步驟6:優化內核參數
cat >> /etc/sysctl.conf <<EOF
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOFsysctl -p
三:Docker 鏡像操作
? ? 運行 Docker 容器前需要本地存在對應的鏡像。如果不存在本地鏡像,Docker 就會嘗試從默認鏡像倉庫下載。鏡像倉庫是由 Docker 官方維護的一個公共倉庫,可以滿足用戶的絕大部分需求。用戶也可以通過配置來使用自定義的鏡像倉庫。
1:獲取鏡像
[root@localhost ~]# docker pull nginx
? ? ? ? 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(聯合文件系統),是實現增量保存與更新的基礎,下載過程中會輸出鏡像的各層信息。鏡像下載到本地之后就可以隨時使用該鏡像了。 用戶也可以選擇從其他注冊服務器倉庫下載,這時需要在倉庫名稱前指定完整的倉庫注冊服務器地址。
2:查看鏡像信息
?
[root@localhost ~]# 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, --all:顯示所有鏡像(包括中間層鏡像)。默認情況下,docker images 只顯示頂層鏡像。
digests:顯示鏡像的摘要信息。
-f,--filter filter:根據指定的條件過濾輸出結果。過濾條件可以是多種類型,例如 dangling=true表示只顯示虛懸鏡像(沒有標簽的鏡像)。
--format string:使用 Go 模板語法自定義輸出格式。
--no-trunc:不截斷輸出信息,完整顯示鏡像 ID 等較長的字段。
-9,--quiet:只顯示鏡像的 ID。
REPOSITORY [:TAG](可選)
REPOSITORY:指定要顯示的鏡像倉庫名稱。
TAG:指定要顯示的鏡像標簽。如果不指定標簽,默認顯示所有標簽的鏡像。
3:查看鏡像的詳細信息
[root@localhost ~]# docker inspect c15
? ? ? ?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):獲取卷的詳細信息,如掛載路徑、驅動類型等。
4:修改鏡像標簽(老名字+新名字)
[root@localhost ~]# docker tag nginx nginx:v1
[root@localhost ~]# docker images
? ? ? ? ?在 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 命令并不會創建一個新的鏡像,它只是為現有的鏡像添加一個額外的標簽。多個標簽可以指向同一個鏡像,這些標簽只是鏡像的不同引用方式。
5:刪除鏡像
# 用鏡像名刪除
[root@localhost ~]# docker rmi nginx:v1# 用鏡像ID刪除
[root@localhost ~]# docker rmi c15
命令語法:docker rmi [OPTIONS] IMAGE [IMAGE...]
參數說明:
OPTIONS(可選參數)
-f,--force:強制刪除鏡像。即使有容器正在使用該鏡像,也會嘗試刪除,但不建議輕易使用,因為可能導致容器無法正常運行。
--no-prune:默認情況下,刪除鏡像時會同時刪除該鏡像相關的未使用的父鏡像層(虛懸鏡像),使用該選項可以禁止刪除這些父鏡像層。
IMAGE
指定要刪除的鏡像,可以是鏡像的名稱、標簽、鏡像 ID,也可以同時指定多個鏡像。例如:nginx:latest、123456789abc 等。
注意事項:
? ? ?在刪除鏡像之前,要確保沒有正在運行或已停止的容器依賴該鏡像。可以使用 docker ps -a命令査看所有容器,使用 docker stop 和 docker rm 命令停止并刪除依賴該鏡像的容器后,再刪除鏡像。
? ? ? 鏡像的刪除是不可逆的操作,刪除后無法恢復,所以在執行刪除操作前要謹慎確認。
? ? ?當刪除一個有多個標簽的鏡像時,刪除一個標簽只是移除該標簽的引用,只有當所有標簽都被刪除后,鏡像才會真正從磁盤上刪除。
6:存出鏡像和載入鏡像
# (1) 導出鏡像
[root@localhost ~]# docker save -o nginx.tar nginx:latest# (2) 刪除鏡像
[root@localhost ~]# docker rmi nginx:latest# (3) 導入鏡像
[root@localhost ~]# docker load < nginx.tar
注意事項:
文件大小:保存的鏡像文件可能會非常大,尤其是包含多個大型鏡像時。在保存和傳輸這些文件時,要確保有足夠的磁盤空間和網絡帶寬。
鏡像版本:保存的鏡像文件中包含的是特定版本(標簽)的鏡像。在恢復鏡像時,要確保使用正確的標簽和版本。
跨平臺兼容性:雖然 Docker 鏡像是設計為跨平臺的,但在不同的操作系統上保存和加載鏡像時,可能會遇到一些兼容性問題。盡量在相同或兼容的操作系統版本之間傳輸和使用鏡像。
鏡像依賴:如果保存的鏡像依賴于其他基礎鏡像,確保在目標環境中也有這些基礎鏡像,或者將它們一起保存和傳輸。
四:Docker 容器操作
? ? 容器是 Docker 的另一個核心概念。簡單說,容器是鏡像的一個運行實例,是獨立運行的一個或一組應用以及它們所必需的運行環境,包括文件系統、系統類庫、she11 環境等。鏡像是只讀模板,而容器會給這個只讀模板添加一個額外的可寫層。
容器的創建與啟動
操作類型 | 命令語法 | 核心功能 | 關鍵參數 | 示例 | 適用場景 |
---|---|---|---|---|---|
創建容器 | docker create [OPTIONS] IMAGE | 從鏡像創建容器(不自動啟動) | -it (交互式終端)-p 宿主機端口:容器端口 -v 宿主機目錄:容器目錄 --name 容器名 | docker create -it --name mycentos -p 80:80 centos:7 | 預配置容器后再啟動 |
查看容器 | docker ps [OPTIONS] | 列出容器狀態 | -a (顯示所有容器)-q (僅顯示ID)-f "name=xxx" (過濾) | docker ps -a | grep nginx | 監控容器運行狀態 |
啟動容器 | docker start [OPTIONS] CONTAINER | 啟動已存在的容器 | -a (附加輸出流)-i (保持交互) | docker start -ai mycentos | 重新啟動已停止的容器 |
創建并啟動容器 | docker run [OPTIONS] IMAGE [COMMAND] | 創建并立即啟動容器(鏡像不存在時自動拉取) | -d (后臺運行)--rm (退出后自動刪除)-e 環境變量 --network 網絡 | docker run -d --name web -p 8080:80 -e "ENV=prod" nginx | 快速部署服務 |
后臺持續運行 | docker run -d IMAGE [COMMAND] | 啟動守護式容器(需容器內有常駐進程) | --cpus 2 (限制CPU核心)-m 512m (限制內存)--restart=always (自動重啟) | docker run -d --cpus=1 -m 1g --restart=always redis | 部署數據庫、消息隊列等持久化服務 |
停止容器 | docker stop [OPTIONS] CONTAINER | 優雅停止容器(發送SIGTERM信號) | -t (超時時間,默認10秒) | docker stop -t 5 mynginx | 安全關閉服務 |
強制停止容器 | docker kill [OPTIONS] CONTAINER | 強制終止容器(發送SIGKILL信號) | -s (指定信號,如SIGKILL ) | docker kill mynginx | 容器無響應時強制終止 |
刪除容器 | docker rm [OPTIONS] CONTAINER | 刪除已停止的容器 | -f (強制刪除運行中的容器)-v (同時刪除關聯卷) | docker rm -fv old_container | 清理無用容器釋放資源 |
場景 | 推薦命令 | 原因及關鍵參數 | 擴展用法 |
---|---|---|---|
調試容器 | docker run -it IMAGE /bin/bash | -it :分配交互式終端,直接進入容器內部調試。/bin/bash :指定啟動Shell。 | 1. 快速排查配置問題:docker run -it --rm alpine sh 2. 檢查環境變量: docker run -it python env |
批量預配置容器 | docker create ?+?docker start | 1.?create :預先配置網絡、卷等參數。2.? start :按需啟動,適合批量管理。 | 結合腳本批量操作:for i in {1..5}; do docker create --name node-$i nginx; done |
運行服務類容器 | docker run -d IMAGE | -d :后臺守護進程模式。自動拉取鏡像(若本地不存在)。 | 1. Web服務:docker run -d -p 80:80 --name web nginx 2. 數據庫: docker run -d -e MYSQL_ROOT_PASSWORD=123 mysql |
臨時測試容器 | docker run --rm IMAGE | --rm :容器退出后自動刪除,避免殘留臨時容器。 | 單次命令執行:docker run --rm busybox echo "Hello World" |
資源受限環境 | docker run -d --cpus=1 -m 512m | --cpus :限制CPU核心數。-m :限制內存,防止資源耗盡。 | 云原生部署:docker run -d --cpus=0.5 -m 256m --name limit-app my-app |
容器網絡配置 | docker run --network=host/bridge | --network :指定網絡模式。-? host :共享宿主機網絡棧。-? bridge :默認隔離網絡。 | 高性能場景:docker run -d --network=host redis |
數據持久化 | docker run -v /host/path:/container | -v :掛載宿主機目錄到容器,數據持久化。 | 數據庫數據存儲:docker run -d -v /data/mysql:/var/lib/mysql mysql |
操作類型 | 命令語法 | 核心功能 | 關鍵參數 | 注意事項 | 典型場景 |
---|---|---|---|---|---|
優雅停止容器 | docker stop [-t N] CONTAINER | 發送SIGTERM信號,允許容器完成清理后退出 | -t :超時時間(秒,默認10秒) | 1. 需確保容器內進程能處理SIGTERM 2. 有依賴關系的容器需按順序停止 | 安全關閉數據庫、微服務等 |
強制終止容器 | docker kill [-s SIGNAL] CONTAINER | 立即發送SIGKILL信號強制終止 | -s :指定信號(如SIGKILL/SIGTERM) | 1. 可能導致數據損壞 2. 僅用于無響應容器 | 容器死鎖或僵尸進程處理 |
進入容器 | docker exec -it CONTAINER COMMAND | 在運行中容器內執行交互式命令 | -it :交互式終端-u user :指定用戶-w /path :設置工作目錄 | 1. 容器必須處于運行狀態 2. 注意用戶權限(如root操作需謹慎) | 調試、日志查看或配置修改 |
導出容器快照 | docker export CONTAINER > file.tar | 將容器文件系統導出為tar包(不含元數據) | 無 | 1. 與docker save 區別:不保留鏡像層歷史2. 導出前建議先停止容器 | 遷移容器狀態或備份 |
導入為鏡像 | docker import file.tar IMAGE:TAG | 從tar文件創建新鏡像(扁平化無歷史層) | -c :添加Dockerfile指令(如CMD ) | 生成的鏡像無構建歷史,體積可能較大 | 快速構建定制化基礎鏡像 |
刪除容器 | docker rm [-fv] CONTAINER | 刪除已停止的容器及關聯資源 | -f :強制刪除運行中容器-v :同時刪除匿名卷 | 1. 數據卷刪除不可逆 2. 重要數據需提前備份 | 清理無用容器釋放資源 |
批量清理 | docker container prune | 一鍵刪除所有已停止的容器 | 無 | 配合-f 跳過確認提示 | 定期維護 |
場景 | 推薦命令 | 優勢與原理 | 擴展用法 |
---|---|---|---|
正常停止服務 | docker stop -t 20 CONTAINER | -?優勢:發送SIGTERM信號,允許應用優雅關閉(如保存數據、釋放連接) -?參數: -t 20 ?延長等待時間至20秒 | 1. 數據庫容器:docker stop -t 30 mysql 2. 微服務: docker stop -t 15 order-service |
容器無響應時 | docker kill CONTAINER | -?優勢:立即發送SIGKILL信號強制終止,快速釋放資源 -?注意:可能導致數據丟失,慎用 | 1. 指定信號:docker kill -s SIGKILL hung_container 2. 批量終止: docker kill $(docker ps -q) |
調試運行中容器 | docker exec -it CONTAINER bash | -?優勢:無需重啟容器,直接進入交互式終端調試 -?注意:容器需已運行且包含bash/sh | 1. 指定用戶:docker exec -u root -it nginx bash 2. 執行單命令: docker exec redis redis-cli ping |
臨時診斷網絡問題 | docker run --rm -it busybox ping | -?優勢:使用輕量鏡像快速測試網絡,--rm 自動清理-?場景:檢查容器間通信或外網連通性 | docker run --rm -it alpine ping 8.8.8.8 |
查看實時日志 | docker logs -f CONTAINER | -?優勢:動態跟蹤日志輸出(類似tail -f )-?參數: --since 10m ?查看最近10分鐘日志 | docker logs -f --tail 100 web_app |
資源監控 | docker stats CONTAINER | -?優勢:實時顯示CPU/內存/網絡等資源占用 -?擴展: docker top CONTAINER 查看進程列表 | docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}" |
配置檢查 | docker inspect CONTAINER | -?優勢:獲取容器詳細配置(網絡/IP/卷等) -?技巧:結合 jq 解析JSON輸出 | docker inspect web | jq .[0].NetworkSettings.IPAddress |
數據持久化建議
- 重要數據應通過
-v
掛載數據卷 - 刪除容器時避免使用
-v
參數,除非確認數據可丟棄
# 停止所有運行中的容器
docker stop $(docker ps -q)# 刪除所有已停止容器
docker rm $(docker ps -aq)# 導出所有容器
for id in $(docker ps -aq); do docker export $id > $id.tar; done