Docker 實戰命令大全
Docker 實戰場景,以 Nginx 為核心示例,梳理容器生命周期、鏡像管理、網絡配置、數據持久化及 Compose 編排的核心命令與最佳實踐。
一、容器生命周期管理
1. 基礎生命周期命令
docker run
- 創建并啟動容器
核心功能:基于鏡像創建并啟動容器,是部署應用的入口命令。Nginx 作為示例可直觀展示端口映射、配置掛載等關鍵操作。
# 1. 基礎用法:前臺啟動 Nginx(終端退出則容器停止)
docker run nginx:latest# 2. 后臺運行(-d)+ 命名(--name)
docker run -d --name my-nginx nginx:latest# 3. 端口映射(-p):將容器 80 端口映射到主機 80 端口(Web 服務核心配置)
docker run -d -p 80:80 --name my-nginx-port nginx:latest# 4. 掛載配置與資源(-v):Nginx 核心實踐(配置持久化+靜態資源管理)
# 掛載自定義配置文件(覆蓋容器默認 nginx.conf)
docker run -d -p 80:80 \-v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro \ # ro 只讀,防止容器內誤改-v /data/nginx/html:/usr/share/nginx/html \ # 掛載靜態資源目錄-v /data/nginx/logs:/var/log/nginx \ # 掛載日志目錄--name my-nginx-mount nginx:latest# 5. 環境變量(-e)+ 重啟策略(--restart):生產環境必備
docker run -d -p 80:80 \-e "TZ=Asia/Shanghai" \ # 設置時區,確保日志時間正確--restart=always \ # Docker 重啟時自動啟動,異常退出后重啟--name my-nginx-prod nginx:latest
docker start/stop/restart
- 容器狀態控制
核心功能:管理已創建容器的運行狀態,Nginx 服務的啟停維護常用。
# 啟動停止的 Nginx 容器
docker start my-nginx# 停止運行中的 Nginx 容器(優雅關閉,等待連接處理完畢)
docker stop -t 30 my-nginx # -t 30:等待 30 秒后強制終止# 重啟 Nginx 容器(配置修改后生效常用)
docker restart my-nginx
docker kill
- 強制終止容器
核心功能:立即終止容器(發送 SIGKILL 信號),適用于 Nginx 無響應等緊急場景。
# 強制終止 Nginx 容器
docker kill my-nginx# 批量終止多個容器(如多個 Nginx 實例)
docker kill nginx-instance1 nginx-instance2
docker rm
- 刪除容器
核心功能:刪除無用容器,釋放資源。
# 刪除已停止的 Nginx 容器
docker rm my-nginx# 強制刪除運行中的 Nginx 容器(需謹慎,會中斷服務)
docker rm -f my-nginx# 批量刪除所有已停止的容器(含 Nginx)
docker rm $(docker ps -aqf "status=exited")# 清理所有停止的容器(Docker 1.13+ 推薦)
docker container prune -f # -f 跳過確認
2. 高級生命周期命令
docker pause/unpause
- 暫停/恢復容器進程
核心功能:臨時凍結容器進程,適用于 Nginx 維護時暫停流量處理。
# 暫停 Nginx 容器(暫停后無法處理請求)
docker pause my-nginx# 恢復 Nginx 容器運行
docker unpause my-nginx
docker create
- 創建容器但不啟動
核心功能:預配置容器參數(如端口、掛載),便于檢查配置后再啟動。
# 創建 Nginx 容器(不啟動),預配置端口和掛載
docker create -p 8080:80 \-v /data/nginx/conf:/etc/nginx/conf.d \--name my-nginx-prepare nginx:latest
# 確認配置無誤后啟動
docker start my-nginx-prepare
docker exec
- 在運行容器中執行命令
核心功能:進入容器或執行命令,Nginx 配置修改、日志查看的常用方式。
# 1. 進入 Nginx 容器終端(交互式)
docker exec -it my-nginx /bin/bash
# 常用操作:查看配置(cat /etc/nginx/nginx.conf)、測試配置(nginx -t)# 2. 非交互式執行命令(無需進入容器)
# 示例:查看 Nginx 版本
docker exec my-nginx nginx -v
# 示例:重載 Nginx 配置(修改配置后生效)
docker exec my-nginx nginx -s reload# 3. 以 root 權限執行命令(修改系統配置時常用)
docker exec -u root -it my-nginx /bin/bash
docker rename
- 重命名容器
核心功能:調整容器名稱,便于區分不同環境的 Nginx 實例(如 prod/test)。
# 將測試環境 Nginx 重命名
docker rename my-nginx my-nginx-test
二、容器操作
1. 容器查詢與信息
docker ps
- 列出容器
核心功能:查看容器狀態,快速定位 Nginx 服務運行情況。
# 列出運行中的容器(默認,重點關注 Nginx 狀態)
docker ps# 列出所有容器(含已停止的 Nginx 實例)
docker ps -a# 只顯示容器 ID(批量操作常用)
docker ps -q# 過濾顯示:只顯示名稱含 "nginx" 的容器
docker ps -a --filter "name=nginx"# 格式化輸出:顯示名稱、端口、狀態(Nginx 運維重點關注)
docker ps -a --format "table {{.Names}}\t{{.Ports}}\t{{.Status}}"
docker inspect
- 查看容器/鏡像詳情
核心功能:獲取容器/鏡像的元數據,排查 Nginx 配置、網絡、掛載等問題。
# 查看 Nginx 容器詳細信息(JSON 格式,含網絡、掛載、環境變量等)
docker inspect my-nginx# 提取 Nginx 容器 IP 地址(容器間通信時常用)
docker inspect --format '{{.NetworkSettings.IPAddress}}' my-nginx# 提取 Nginx 掛載信息(確認配置文件是否正確掛載)
docker inspect --format '{{range .Mounts}}{{.Source}} -> {{.Destination}}{{end}}' my-nginx# 查看 Nginx 鏡像元數據(構建信息、默認配置等)
docker inspect nginx:latest
docker logs
- 查看容器日志
核心功能:Nginx 訪問日志和錯誤日志是排查 Web 服務問題的關鍵。
# 查看 Nginx 所有日志(默認顯示 error.log,可通過配置指定)
docker logs my-nginx# 實時跟蹤 Nginx 日志(類似 tail -f,監控請求動態)
docker logs -f my-nginx# 顯示日志時間戳(定位問題時間點)
docker logs -t my-nginx# 查看最近 100 行訪問日志并實時跟蹤
docker logs -f --tail=100 my-nginx# 查看指定時間段的錯誤日志(如 2024-05-01 之后)
docker logs --since "2024-05-01" my-nginx
2. 容器監控與進程
docker stats
- 實時監控容器資源
核心功能:監控 Nginx 容器的 CPU、內存、網絡 IO 占用,及時發現性能瓶頸。
# 監控所有容器(重點關注 Nginx 資源占用)
docker stats# 僅監控 Nginx 容器
docker stats my-nginx# 非交互式輸出(適合腳本采集數據)
docker stats --no-stream my-nginx
docker top
- 查看容器內進程
核心功能:查看 Nginx 主進程和工作進程狀態。
# 查看 Nginx 容器內所有進程
docker top my-nginx
# 輸出示例:Nginx 通常有 1 個主進程(master)和多個工作進程(worker)# 顯示進程用戶、PID 和命令
docker top my-nginx -o user,pid,cmd
docker events
- 監聽 Docker 事件
核心功能:跟蹤 Nginx 容器的啟動、停止、重啟等事件,便于審計和自動化。
# 實時監聽所有事件(過濾 Nginx 相關)
docker events --filter "name=my-nginx"# 監聽 Nginx 容器的停止事件(持續 1 小時)
docker events --filter "container=my-nginx" --filter "event=stop" --since 1h
3. 容器文件操作
docker cp
- 容器與主機文件互傳
核心功能:Nginx 配置文件更新、靜態資源上傳的常用方式。
# 1. 從 Nginx 容器復制文件到主機(如導出日志)
docker cp my-nginx:/var/log/nginx/access.log /data/nginx-logs/# 2. 從主機復制文件到 Nginx 容器(如更新配置或靜態頁面)
# 示例:上傳新的 index.html 到 Nginx 網站根目錄
docker cp /data/nginx/html/new-index.html my-nginx:/usr/share/nginx/html/index.html
# 示例:更新 Nginx 子配置(conf.d 目錄下)
docker cp /data/nginx/conf.d/new-site.conf my-nginx:/etc/nginx/conf.d/# 3. 復制目錄(如批量上傳靜態資源)
docker cp /data/nginx/static/ my-nginx:/usr/share/nginx/html/static/
docker diff
- 查看容器文件系統變更
核心功能:檢查 Nginx 容器配置是否被意外修改。
# 查看 Nginx 容器的文件變更(如配置文件是否被修改)
docker diff my-nginx
# 輸出說明:
# A: 新增文件(如自定義配置)
# C: 修改文件(如 nginx.conf 被修改)
# D: 刪除文件
docker export
- 導出容器文件系統
核心功能:導出 Nginx 容器的完整文件系統(含配置和靜態資源),用于備份或遷移。
# 導出 Nginx 容器為 tar 包
docker export my-nginx > nginx-container.tar
# 或
docker export -o nginx-container.tar my-nginx
docker port
- 查看容器端口映射
核心功能:確認 Nginx 容器端口與主機端口的映射關系(排查端口沖突)。
# 查看 my-nginx 容器的端口映射
docker port my-nginx
# 輸出示例:80/tcp -> 0.0.0.0:80
三、鏡像管理
1. 鏡像獲取與推送
docker pull
- 拉取鏡像
核心功能:從倉庫獲取 Nginx 鏡像(官方鏡像或自定義鏡像)。
# 拉取官方最新版 Nginx
docker pull nginx:latest# 拉取指定版本 Nginx(如 1.25 穩定版)
docker pull nginx:1.25# 拉取私有倉庫的自定義 Nginx 鏡像(如含特定模塊的版本)
docker pull registry.example.com/custom-nginx:v1.0
docker push
- 推送鏡像
核心功能:將自定義 Nginx 鏡像(如含業務配置)推送到倉庫,實現團隊共享。
# 1. 為鏡像打私有倉庫標簽
docker tag nginx:1.25 registry.example.com/custom-nginx:v1.0# 2. 登錄私有倉庫
docker login registry.example.com -u username -p password# 3. 推送鏡像
docker push registry.example.com/custom-nginx:v1.0# 4. 退出登錄
docker logout registry.example.com
docker search
- 搜索鏡像
核心功能:在 Docker Hub 搜索 Nginx 相關鏡像(如帶模塊的版本)。
# 搜索 Nginx 鏡像
docker search nginx# 搜索星級 > 10000 的官方 Nginx 鏡像
docker search --filter "stars=10000" --filter "is-official=true" nginx
2. 鏡像查詢與刪除
docker images
- 列出本地鏡像
核心功能:查看本地存儲的 Nginx 鏡像(版本管理)。
# 列出所有本地鏡像(篩選 Nginx 相關)
docker images nginx# 只顯示 Nginx 鏡像 ID
docker images -q nginx# 顯示鏡像摘要和大小(對比不同版本鏡像)
docker images --digests nginx
docker rmi
- 刪除鏡像
核心功能:清理無用的 Nginx 鏡像,釋放磁盤空間。
# 刪除指定版本 Nginx 鏡像
docker rmi nginx:1.24# 強制刪除被容器引用的鏡像(需先停容器,或用 -f)
docker rmi -f nginx:1.24# 清理標簽為 <none> 的懸空鏡像(構建失敗殘留)
docker rmi -f $(docker images -f "dangling=true" -q)# 清理所有未使用的鏡像(含 Nginx 舊版本)
docker image prune -a -f
3. 鏡像構建與操作
docker build
- 從 Dockerfile 構建鏡像
核心功能:定制 Nginx 鏡像(集成配置、靜態資源、模塊等),是 DevOps 核心環節。
# 1. 基礎構建(當前目錄 Dockerfile,構建自定義 Nginx)
docker build -t my-nginx:v1.0 .# 2. 指定 Dockerfile 路徑(如 docker 子目錄)
docker build -f ./docker/Dockerfile.nginx -t my-nginx:v1.0 .# 3. 構建時傳入參數(如 Nginx 版本)
docker build --build-arg NGINX_VERSION=1.25 -t my-nginx:v1.0 .# 示例 Dockerfile(定制 Nginx 鏡像):
# FROM nginx:${NGINX_VERSION}
# COPY nginx.conf /etc/nginx/nginx.conf
# COPY html/ /usr/share/nginx/html/
# RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
# EXPOSE 80 443
# CMD ["nginx", "-g", "daemon off;"]
docker tag
- 為鏡像打標簽
核心功能:版本管理和倉庫推送必備(區分開發/生產環境鏡像)。
# 為 Nginx 鏡像打版本標簽
docker tag nginx:1.25 my-nginx:prod-v1.25# 打私有倉庫標簽(推送前)
docker tag my-nginx:prod-v1.25 registry.example.com/myapp/nginx:prod-v1.25
docker history
- 查看鏡像歷史
核心功能:分析 Nginx 鏡像各層構建過程,優化鏡像大小。
# 查看 Nginx 鏡像的構建歷史(各層命令和大小)
docker history nginx:1.25# 詳細顯示完整命令(便于排查構建問題)
docker history --no-trunc nginx:1.25
docker save/load
- 鏡像歸檔與加載
核心功能:離線環境部署 Nginx 鏡像(如無網絡的生產環境)。
# 1. 保存 Nginx 鏡像為 tar 包(可包含多個版本)
docker save -o nginx-images.tar nginx:1.25 my-nginx:v1.0# 2. 從 tar 包加載鏡像
docker load -i nginx-images.tar
docker commit
- 從容器創建鏡像
核心功能:基于運行中的 Nginx 容器(含臨時配置)創建鏡像(不推薦,優先用 Dockerfile)。
# 基于修改后的 Nginx 容器創建鏡像
docker commit -m "添加自定義配置" -a "dev-team" my-nginx my-nginx-temp:v1.0
docker import
- 從歸檔文件創建鏡像
核心功能:從 docker export
導出的 Nginx 容器 tar 包創建鏡像(不含歷史層)。
# 從 Nginx 容器導出的 tar 包創建鏡像
docker import nginx-container.tar my-nginx-imported:v1.0
四、網絡管理
1. 網絡基礎操作
docker network ls
- 列出網絡
核心功能:查看 Docker 網絡(Nginx 與后端服務通信依賴網絡配置)。
docker network ls
# 輸出示例:默認網絡(bridge、host、none)和自定義網絡
docker network create
- 創建網絡
核心功能:創建自定義網絡,實現 Nginx 與后端服務(如 API 服務器)的隔離通信。
# 創建默認 bridge 網絡(Nginx 與后端服務專用)
docker network create nginx-backend-network# 創建指定子網和網關的網絡(固定 IP 場景)
docker network create --driver bridge \--subnet 192.168.100.0/24 \--gateway 192.168.100.1 \nginx-network
docker network rm
- 刪除網絡
核心功能:清理無用網絡。
# 刪除指定網絡
docker network rm nginx-backend-network# 批量刪除未使用的網絡
docker network prune -f
2. 容器網絡操作
docker network connect
- 連接容器到網絡
核心功能:將 Nginx 容器加入自定義網絡,使其與同網絡的后端服務通信。
# 將 Nginx 容器連接到后端服務網絡
docker network connect nginx-backend-network my-nginx# 連接時指定靜態 IP(便于 Nginx 反向代理配置)
docker network connect --ip 192.168.100.10 nginx-network my-nginx
docker network disconnect
- 斷開容器與網絡的連接
核心功能:隔離故障 Nginx 容器或調整網絡架構。
docker network disconnect nginx-backend-network my-nginx
docker network inspect
- 查看網絡詳情
核心功能:確認 Nginx 容器與后端服務是否在同一網絡,IP 配置是否正確。
# 查看 nginx-backend-network 網絡詳情
docker network inspect nginx-backend-network# 提取網絡中所有容器的名稱和 IP(檢查 Nginx 與后端連接)
docker network inspect --format '{{range .Containers}}{{.Name}}: {{.IPv4Address}}{{end}}' nginx-backend-network
五、數據卷管理
1. 卷基礎操作
docker volume ls
- 列出數據卷
核心功能:查看 Nginx 配置卷、日志卷等持久化存儲。
docker volume ls
docker volume create
- 創建數據卷
核心功能:為 Nginx 配置、日志、靜態資源創建持久化卷(避免容器刪除后數據丟失)。
# 創建 Nginx 配置卷
docker volume create nginx-conf# 創建 Nginx 日志卷
docker volume create nginx-logs# 創建帶標簽的卷(便于管理)
docker volume create --label app=nginx --label env=prod nginx-html
docker volume rm
- 刪除數據卷
核心功能:清理無用卷(需確保數據已備份)。
# 刪除指定卷
docker volume rm nginx-conf-old# 清理未使用的卷
docker volume prune -f
2. 卷信息與使用
docker volume inspect
- 查看卷詳情
核心功能:獲取 Nginx 卷的實際存儲路徑(主機目錄),便于直接修改配置或備份日志。
# 查看 nginx-conf 卷詳情
docker volume inspect nginx-conf
# 輸出中 "Mountpoint" 為宿主機路徑(如 /var/lib/docker/volumes/nginx-conf/_data)
卷掛載實踐(以Nginx 為例)
# 1. 使用命名卷掛載 Nginx 配置、日志和靜態資源
docker run -d -p 80:80 \-v nginx-conf:/etc/nginx/conf.d \ # 配置卷(推薦 conf.d 而非 nginx.conf,更靈活)-v nginx-logs:/var/log/nginx \ # 日志卷-v nginx-html:/usr/share/nginx/html \ # 靜態資源卷--name my-nginx-with-volumes nginx:1.25# 2. 綁定掛載(直接映射主機目錄,適合開發環境)
# 注意:生產環境需處理權限(如添加 :Z 解決 SELinux 限制)
docker run -d -p 80:80 \-v /data/nginx/conf.d:/etc/nginx/conf.d:Z \-v /data/nginx/logs:/var/log/nginx:Z \--name my-nginx-dev nginx:1.25
六、Docker Compose 編排
1. 安裝 Docker Compose(Linux 通用)
# 安裝 Docker Compose v2(集成到 docker 命令)
# 適用于 CentOS/RHEL(dnf)
dnf install docker-compose-plugin -y# 適用于 Ubuntu/Debian(apt)
apt-get install docker-compose-plugin -y# 驗證安裝
docker compose version
2. 核心 Compose 命令
docker compose up
- 啟動服務
核心功能:一鍵啟動 Nginx 及關聯服務(如后端 API、數據庫)。
# 前臺啟動(查看啟動日志,適合調試)
docker compose up# 后臺啟動(生產環境常用)
docker compose up -d# 強制重建 Nginx 鏡像并啟動(配置更新后)
docker compose up -d --build nginx # 僅重建 nginx 服務
docker compose down
- 停止并清理服務
核心功能:停止服務并清理容器、網絡(保留數據卷)。
# 停止服務(保留卷和鏡像)
docker compose down# 停止服務并刪除卷(謹慎,數據會丟失)
docker compose down -v# 停止服務并刪除 Nginx 相關鏡像
docker compose down --rmi all
docker compose ps
- 查看服務狀態
核心功能:查看 Compose 管理的所有服務(含 Nginx)的運行狀態。
docker compose ps
docker compose exec
- 進入服務容器
核心功能:進入 Nginx 容器執行命令(如修改配置、查看日志)。
# 進入 Nginx 容器終端
docker compose exec nginx /bin/bash# 非交互式執行命令(如重載配置)
docker compose exec nginx nginx -s reload
docker compose logs
- 查看服務日志
核心功能:集中查看 Nginx 及關聯服務的日志(排查跨服務問題)。
# 查看所有服務日志
docker compose logs# 實時跟蹤 Nginx 日志
docker compose logs -f nginx
3. 示例 Compose 配置(Nginx + 后端服務)
docker-compose.yml
(典型 Web 應用架構):
version: '3.8'
services:nginx:image: nginx:1.25ports:- "80:80"- "443:443"volumes:- nginx-conf:/etc/nginx/conf.d- nginx-logs:/var/log/nginx- ./html:/usr/share/nginx/html- ./ssl:/etc/nginx/ssl # SSL 證書目錄networks:- app-networkdepends_on:- backend # 確保后端服務啟動后再啟動 Nginxrestart: alwayshealthcheck: # 健康檢查(Nginx 存活檢測)test: ["CMD", "curl", "-f", "http://localhost"]interval: 30stimeout: 10sretries: 3backend:image: registry.example.com/myapp/backend:v1.0networks:- app-networkrestart: alwaysnetworks:app-network:driver: bridgevolumes:nginx-conf:nginx-logs:
七、系統管理與維護
1. Docker 服務管理(systemd 系統通用)
# 啟動 Docker 服務
systemctl start docker# 停止 Docker 服務
systemctl stop docker# 重啟 Docker 服務(配置生效)
systemctl restart docker# 設置開機自啟
systemctl enable docker# 查看 Docker 服務狀態
systemctl status docker
2. 系統信息查詢
# 查看 Docker 系統信息(鏡像數、容器數、存儲驅動等)
docker info# 查看 Docker 版本(客戶端 + 服務端)
docker version# 查看 Docker 磁盤占用(Nginx 鏡像和卷可能占用較大空間)
docker system df# 查看磁盤占用詳情(定位大文件)
docker system df -v
3. 系統清理
# 清理所有未使用的資源(容器、網絡、鏡像、卷)
docker system prune -a -v -f
# -a:包括未引用的鏡像(如舊版 Nginx)
# -v:包括未使用的卷(確保數據已備份)
# -f:跳過確認
4. 防火墻配置(以 firewalld 為例)
# 查看防火墻狀態
firewall-cmd --state# 開放 Nginx 常用端口(80 _http, 443_https)
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --reload# 允許 Docker 網絡通過防火墻(容器間通信)
firewall-cmd --permanent --zone=trusted --add-interface=docker0
firewall-cmd --reload