各位親愛的開發者、運維勇士、以及所有對現代化軟件部署充滿好奇的小伙伴們!今天,我們將開啟一場史詩級的冒險——Docker命令大航海!我們將乘坐“Docker號”巨輪,駛向容器化技術的星辰大海。
這不是一篇枯燥的說明書,而是一份充滿活力、深入淺出、甚至有點好玩的終極指南。我們將用超過30000字的篇幅,把Docker的常用命令掰開了、揉碎了,配上生動的比喻、實戰的場景、以及那些官方文檔可能沒告訴你的“騷操作”和“坑爹陷阱”,讓你不僅看得明白,更能用得瀟灑。
準備好了嗎?系好安全帶,我們的Docker奇幻之旅,正式起航!
<摘要>
Docker,這個席卷全球的容器化技術,早已不是運維的專屬玩具,而是每一位現代開發者必須掌握的利器。本文將以一場趣味橫生的“大航海”為主題,將Docker的核心概念化為海洋與船只,系統性地解析其最常用、最核心的命令。從最基本的docker run
啟航,到復雜多容器編排的docker compose
遠征;從鏡像構建的docker build
造船廠,到網絡與數據管理的港口與倉庫。我們將不僅講解命令的語法,更深入剖析其背后的原理、使用場景、最佳實踐以及常見陷阱。本文旨在成為一份集教程、手冊、秘籍于一體的終極指南,讓讀者在輕松愉快的閱讀中,真正掌握Docker的強大力量,成為一名自信的“容器船長”。
<解析>
第一章:起錨!—— Docker基礎與安裝驗證
在我們開始指揮(輸入命令)之前,得先確保我們的“船長室”(命令行終端)和“Docker引擎”都準備就緒。
1.1 世界觀設定:容器 vs 虛擬機
想象一下,你要運送一批玩具。
- 虛擬機 (Virtual Machine):相當于買了幾臺全新的大卡車,每臺卡車上都要安裝一個完整的操作系統(司機、發動機、油箱一應俱全),然后再把玩具和玩具的運行環境(比如一個小架子)放進去。笨重、耗油(資源)、啟動慢。
- 容器 (Container):相當于使用了標準化集裝箱。所有玩具和它需要的小架子都打包在一個集裝箱里。這個集裝箱可以放在任何一艘大船(主機操作系統) 上,由船上的統一引擎(Docker Engine)來管理和運輸。輕便、高效、秒級啟動。
Docker就是這套集裝箱系統的發明者和標準制定者。 它包含了:
- Docker Daemon ( dockerd ): 船的引擎室,常駐后臺的核心程序,負責干重活(構建、運行、分發容器)。
- Docker Client ( docker ): 船長的對講機,我們通過它向引擎室發送命令。
- Docker Registry: 世界的集裝箱倉庫(比如最大的公共倉庫 Docker Hub),用于存儲和分享鏡像。
- Image: 集裝箱的藍圖。它是一個只讀的模板,包含了運行所需的一切:代碼、運行時、庫、環境變量等。
- Container: 根據藍圖實例化出來的、正在運行的集裝箱。藍圖是靜態的,容器是動態的。
1.2 安裝Docker引擎
不同的操作系統,安裝方式不同。我們的“Docker號”巨輪需要在不同的海域(系統)中航行。
-
Linux (Ubuntu/CentOS): 通常通過官方源安裝,過程最純粹。
# Ubuntu 示例 sudo apt-get update sudo apt-get install docker.io # 或者使用官方安裝腳本(總是獲取最新版) curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh
-
macOS / Windows: 下載并安裝 Docker Desktop。這是一個“全家桶”,包含了Docker引擎、客戶端、圖形化界面、以及必需的Linux虛擬機(因為Mac/Windows內核不是Linux,需要一個小型VM來運行容器)。安裝后,一個可愛的鯨魚圖標會出現在你的狀態欄。
1.3 驗證安裝與Hello World
安裝完成后,打開你的終端(對講機),喊出你的第一道命令:
docker --version
如果安裝成功,它會告訴你Docker的版本號,證明“對講機”和“引擎室”連接正常。
接下來,讓我們拉起第一個集裝箱,一個最經典的“Hello World”:
docker run hello-world
發生了什么?魔法!
docker
: 你拿起了對講機。run
: 你下達了“運行”的指令。hello-world
: 你要運行的集裝箱藍圖(鏡像)的名字。- 執行流程:
- 船長(Client)通過對講機告訴引擎室(Daemon):“我們要運行
hello-world
!” - 引擎室一看,本地倉庫沒有名叫
hello-world
的藍圖(鏡像)。 - 引擎室立刻聯系遠方的公共倉庫(Docker Hub):“嘿,給我一份
hello-world
的藍圖!” - 倉庫把藍圖下載到本地(
Pull complete
)。 - 引擎室根據藍圖,制造并啟動一個集裝箱(容器)。
- 這個集裝箱里只有一個簡單的程序,它的任務就是打印出一段歡迎信息和一些學習資料,然后任務完成,集裝箱停止運行。
- 船長(Client)通過對講機告訴引擎室(Daemon):“我們要運行
恭喜你,你已經成功運行了第一個Docker容器!你已經成為了一名見習水手!
第二章:造船廠與藍圖庫 —— 鏡像(Image)管理命令
鏡像(Image)是容器的基礎。就像沒有藍圖造不出集裝箱一樣,沒有鏡像也跑不起容器。這一章,我們學習如何獲取、查看、制作和管理這些寶貴的“藍圖”。
2.1 docker search
- 在倉庫里搜尋藍圖
在建造之前,我們先看看倉庫里有沒有現成的、別人已經做好的藍圖。
docker search [OPTIONS] TERM
- 例子:我想找一個Nginx(一個流行的Web服務器)的鏡像。
docker search nginx
- 輸出解讀:
NAME
: 鏡像的名字。DESCRIPTION
: 簡要描述。STARS
: 星星數,類似于GitHub的Star,代表受歡迎程度。OFFICIAL
:[OK]
表示是官方鏡像,由Docker官方或項目原團隊維護,通常最可靠。AUTOMATED
: 表示是自動構建的,通常由Docker Hub鏈接GitHub倉庫自動生成鏡像。
- 常用選項:
--filter is-official=true
: 只顯示官方鏡像。--limit 5
: 只顯示前5個結果。
2.2 docker pull
- 下載藍圖到本地船廠
docker run
會自動下載不存在的鏡像,但有時我們想提前下載好,比如為了預緩存或確保版本一致。
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
- 鏡像名與標簽(TAG): 鏡像名通常由
[倉庫URL/]用戶名/鏡像名
組成。如果不指定用戶名和倉庫URL,默認從Docker Hub拉取。nginx
-> 等價于library/nginx
(Docker Hub官方庫)bitnami/nginx
-> Docker Hub上bitnami
用戶發布的nginx
鏡像harbor.mycompany.com:5000/myapp:v1.2
-> 從私有倉庫harbor.mycompany.com:5000
拉取myapp
鏡像的v1.2
版本
- 標簽(TAG): 相當于藍圖的版本號。如果不指定,默認使用
:latest
標簽。:latest
: 并不一定代表“最新”,它只是一個默認標簽名。在生產環境中永遠不要使用:latest
,因為它今天和明天拉取的可能是不同的版本,導致環境不一致。- 明確版本:
:1.21
,:1.21-alpine
,:v2.1.0
- 系統變體:
-alpine
(基于極小的Alpine Linux系統),-slim
,-buster
(基于Debian)
- 例子:
docker pull nginx:1.21-alpine # 拉取一個特定版本、輕量級的Nginx docker pull ubuntu:20.04 # 拉取Ubuntu 20.04的基礎鏡像 docker pull mysql:8.0 # 拉取MySQL 8.0系列的最新版本
2.3 docker images
- 查看本地船廠里的所有藍圖
下載了那么多鏡像,怎么查看我本地都有啥呢?
docker images [OPTIONS] [REPOSITORY[:TAG]]
- 例子:
docker images
- 輸出解讀:
REPOSITORY
: 鏡像倉庫源(名字)。TAG
: 標簽。IMAGE ID
: 鏡像的唯一ID(摘要),是鏡像的唯一標識。CREATED
: 創建時間。SIZE
: 鏡像大小。
- 常用選項:
-q, --quiet
: 只顯示鏡像的ID。這在寫腳本時非常有用。docker images -q # 輸出: 1a184f6f0f3a # d434d6d5e5b2
--format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
: 用Go模板自定義輸出格式。--filter dangling=true
: 顯示懸虛鏡像(后面會講)。
2.4 docker rmi
- 拆除廢棄的藍圖
本地磁盤空間是寶貴的,需要定期清理不用的鏡像。
docker rmi [OPTIONS] IMAGE [IMAGE...]
- 例子:
docker rmi nginx:1.21-alpine # 刪除指定標簽的鏡像 docker rmi 1a184f6f0f3a # 通過ID刪除,可以只寫ID的前幾位,只要能唯一區分即可 docker rmi $(docker images -q) # 危險!刪除所有鏡像!$(...)是命令替換,先執行里面的命令
- 注意: 如果一個鏡像有多個標簽,
docker rmi
只是刪除指定的標簽。只有當最后一個標簽被刪除時,鏡像本身才會被真正刪除。如果鏡像正在被容器使用,則需要先刪除容器才能刪除鏡像。 - 常用選項:
-f, --force
: 強制刪除,即使有容器正在使用它(不推薦,可能導致“懸虛容器”)。
2.5 docker build
- 自己動手,繪制藍圖
最強大的部分來了!我們不能總是用別人的藍圖,我們要學會自己制作。
docker build
命令用于從一個 Dockerfile
文件構建鏡像。Dockerfile
是一個文本文件,里面包含了一條條指令,告訴Docker如何一步步構建我們的鏡像。
一個簡單的Dockerfile示例:
# 使用官方的Python輕量級鏡像作為藍圖的基礎
FROM python:3.9-alpine# 在容器內設置工作目錄
WORKDIR /app# 將當前目錄下的所有文件復制到容器的 /app 目錄下
COPY . .# 安裝項目所需的依賴
RUN pip install -r requirements.txt# 告訴Docker,當容器啟動時,運行這個命令
CMD ["python", "app.py"]
構建命令:
docker build [OPTIONS] PATH | URL | -
PATH
: 構建上下文路徑。Docker會把PATH
下的所有文件打包發送給Docker引擎(所以不要在PATH
下放無關文件,用.dockerignore
過濾)。通常使用當前目錄.
。- 例子:
# 在當前目錄(包含Dockerfile)構建鏡像,并命名為my-python-app:v1.0 docker build -t my-python-app:v1.0 .# 從Git倉庫構建 docker build -t my-app https://github.com/user/repo.git#branch:subdir# 使用不同的Dockerfile文件構建 docker build -f Dockerfile.prod -t my-app:prod .
- 常用選項:
-t, --tag list
: 為鏡像打標簽,格式是name:tag
。-f, --file string
: 指定要使用的Dockerfile路徑(默認是PATH/Dockerfile
)。--no-cache
: 構建時不使用緩存,從頭開始每一步。常用于確保依賴的最新版本。--build-arg
: 設置構建時的變量。
2.6 docker image prune
- 船廠大掃除
清理那些不再使用的鏡像,釋放磁盤空間。
docker image prune [OPTIONS]
- 例子:
docker image prune # 交互式地刪除所有懸虛鏡像 docker image prune -a # 刪除所有未被任何容器使用的鏡像(危險!) docker image prune -a --filter "until=24h" # 刪除24小時前創建的、未使用的鏡像
- 懸虛鏡像 (Dangling Images): 指的是沒有標簽的鏡像,通常是構建新鏡像時產生的舊層。它們通常可以被安全地清理掉。
第三章:揚帆!—— 容器(Container)生命周期管理命令
有了藍圖(鏡像),我們就可以制造和運行集裝箱(容器)了!這是最核心、最常用的部分。
3.1 docker run
- 制造并啟航一個集裝箱!
這是最最最核心的命令。它從一個鏡像創建并啟動一個容器。
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
選項多如牛毛,我們分類講解:
A. 基礎運行模式:
-d, --detach
: 后臺運行。讓容器在后臺以“守護進程”模式運行。否則容器會占據你的終端(前臺運行)。docker run -d nginx:alpine # 在后臺啟動一個Nginx
-it
: 交互式終端。這是兩個選項的組合-i
(保持標準輸入打開) 和-t
(分配一個偽終端)。這讓你可以進入容器內部,與它的Shell進行交互。通常用于運行/bin/bash
或/bin/sh
。docker run -it ubuntu:20.04 /bin/bash # 啟動一個Ubuntu容器并進入它的bash shell # 你現在就在容器內部了!可以執行ls, pwd, apt-get等命令 # 輸入 exit 可以退出并停止容器
--rm
: 容器停止后自動刪除。非常適合做臨時測試,避免產生一堆停止的容器垃圾。docker run --rm -it alpine /bin/sh # 運行一個Alpine容器,退出后自動刪除它
B. 命名與標識:
--name string
: 給容器起一個名字。如果不指定,Docker會隨機分配一個有趣的名字(如angry_borg
,sleepy_turing
)。起名字后更容易管理。docker run -d --name my_webserver nginx:alpine
C. 網絡與端口映射(非常重要!):
默認情況下,容器內的網絡是與外界隔離的。我們需要手動“挖洞”,把容器內的端口映射到宿主機的端口上。
-p, --publish list
: 端口映射。格式是[主機IP:][主機端口:]容器端口
。docker run -d -p 80:80 nginx:alpine # 將容器的80端口映射到宿主機的80端口 # 現在訪問 http://localhost 就能看到Nginx歡迎頁docker run -d -p 8080:80 nginx:alpine # 將容器的80端口映射到宿主機的8080端口 # 訪問 http://localhost:8080docker run -d -p 127.0.0.1:3306:3306 mysql:8.0 # 將容器的3306端口映射到宿主機的127.0.0.1的3306端口(只能本機訪問)
--network string
: 連接網絡。默認連接到bridge
網絡(橋接網絡)。可以連接到自定義網絡以實現容器間通過容器名通信。docker run -d --network my-network --name web nginx:alpine
D. 數據持久化(Volume Mount & Bind Mount):
容器內的文件是臨時的,容器一刪除,文件就沒了。我們必須把重要數據(如數據庫文件、日志、配置文件)存到容器外部。
-v, --volume list
: 掛載卷。格式是[主機路徑:][容器路徑:][模式]
。這是最重要的數據持久化方式!- 匿名卷(Anonymous Volume): 只寫容器路徑。Docker會自動在主機上創建一個隨機目錄來掛載。
docker run -d -v /var/lib/mysql mysql:8.0 # MySQL數據存到匿名卷
- 命名卷(Named Volume): 使用卷名。需要先用
docker volume create
創建,或者Docker會自動創建。管理更方便,推薦方式。docker run -d -v mysql_data:/var/lib/mysql mysql:8.0
- 綁定掛載(Bind Mount): 直接指定主機路徑。用于開發時同步代碼,或者使用主機上的特定配置文件。
# 開發場景:將主機當前目錄代碼掛載到容器中,實現代碼實時同步 docker run -d -v $(pwd):/app my-python-app# 配置掛載:使用主機上的nginx.conf覆蓋容器內的默認配置 docker run -d -v /path/on/host/nginx.conf:/etc/nginx/nginx.conf nginx:alpine
- 匿名卷(Anonymous Volume): 只寫容器路徑。Docker會自動在主機上創建一個隨機目錄來掛載。
E. 環境變量:
-e, --env list
: 設置環境變量。許多鏡像通過環境變量來配置。# 啟動MySQL并設置root密碼 docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql:8.0# 啟動一個Web應用,設置運行環境為生產環境 docker run -d -e NODE_ENV=production my-node-app
一個綜合性的docker run
例子:
docker run -d \ # 后臺運行--name my_app \ # 容器名叫my_app-p 8080:3000 \ # 映射主機8080到容器3000端口-v app_data:/usr/src/app/data \ # 掛載命名卷用于數據持久化-e DATABASE_URL=postgresql://... \ # 設置數據庫連接字符串--network my_bridge_network \ # 連接到自定義網絡my-app:prod # 使用的鏡像
3.2 docker ps
- 查看正在航行的集裝箱
docker ps
用于列出當前正在運行的容器。
docker ps [OPTIONS]
- 例子:
docker ps # 查看正在運行的容器 docker ps -a # 查看所有容器(包括已停止的)
- 輸出解讀:
CONTAINER ID
: 容器的唯一短ID。IMAGE
: 使用的鏡像。COMMAND
: 容器啟動時運行的命令。CREATED
: 創建時間。STATUS
: 狀態(Up 5 minutes: 運行了5分鐘; Exited (0) 2 days ago: 2天前退出,退出碼為0)。PORTS
: 端口映射情況。NAMES
: 容器名。
- 常用選項:
-a, --all
: 顯示所有容器(默認只顯示運行的)。-q, --quiet
: 只顯示容器ID。-f, --filter
: 按條件過濾。docker ps -f name=my_ # 查找名字包含`my_`的容器 docker ps -f status=exited # 查找已停止的容器 docker ps -f ancestor=nginx # 查找由Nginx鏡像創建的容器
3.3 docker stop
/ docker start
/ docker restart
- 暫停與重啟集裝箱
docker stop [OPTIONS] CONTAINER [CONTAINER...]
: 停止一個或多個運行中的容器。發送SIGTERM信號,允許容器優雅地關閉。docker stop my_webserver docker stop 1a184f6f0f3a
docker start [OPTIONS] CONTAINER [CONTAINER...]
: 啟動一個或多個已停止的容器。它會保留容器第一次運行時的所有參數。docker start my_webserver
docker restart [OPTIONS] CONTAINER [CONTAINER...]
: 重啟容器。相當于stop
后再start
。docker restart my_webserver
3.4 docker rm
- 拆除已停泊的集裝箱
刪除已停止的容器,釋放資源。
docker rm [OPTIONS] CONTAINER [CONTAINER...]
- 例子:
docker rm sleepy_turing # 刪除指定容器 docker rm $(docker ps -aq) # 危險!刪除所有已停止的容器 docker ps -aq | xargs docker rm # 同上,另一種寫法
- 常用選項:
-f, --force
: 強制刪除一個運行中的容器(發送SIGKILL)。-v, --volumes
: 刪除容器的同時,刪除與之關聯的匿名卷(不會刪除命名卷)。
3.5 docker logs
- 查看集裝箱的航行日志
容器在后臺運行時,我們需要查看它內部應用程序打印的日志。
docker logs [OPTIONS] CONTAINER
- 例子:
docker logs my_webserver # 查看日志 docker logs -f my_webserver # 實時追蹤日志(像tail -f) docker logs --tail 100 my_webserver # 查看最后100行 docker logs --since 2024-01-01T00:00:00 my_webserver # 查看某個時間點之后的日志
- 常用選項:
-f, --follow
: 跟蹤日志輸出。--tail string
: 從日志末尾顯示多少行(默認是全部)。-t, --timestamps
: 顯示時間戳。--since string
: 顯示某個時間戳之后的日志。--until string
: 顯示某個時間戳之前的日志。
3.6 docker exec
- 進入一個正在航行的集裝箱內部
有時我們需要進入一個正在運行的容器,進行一些操作,比如檢查文件、調試問題、執行命令。
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
- 例子:
# 在容器my_webserver中執行`ls /`命令 docker exec my_webserver ls /# 以交互模式(-it)進入容器內部,啟動一個bash shell docker exec -it my_webserver /bin/bash # 現在你就在一個正在運行的容器內部了!可以隨意操作。 # 注意:exit退出不會停止容器,只會結束當前的exec會話。
exec
vsrun
:docker run
: 創建并啟動一個新容器。docker exec
: 在已運行的容器內執行額外命令。
3.7 docker cp
- 在船和集裝箱之間傳送貨物
在主機和容器之間復制文件/文件夾。
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH
- 例子:
# 從容器復制文件到主機 docker cp my_webserver:/etc/nginx/nginx.conf ./nginx.conf.bak# 從主機復制文件到容器 docker cp ./config.json my_webserver:/app/config.json
第四章:組建艦隊 —— Docker Compose 多容器編排
現實中的應用很少是只有一個容器的。通常是一個“艦隊”,比如一個Web應用容器 + 一個數據庫容器 + 一個緩存容器。用docker run
一個個啟動和管理它們太麻煩了。Docker Compose 就是用來解決這個問題的。
它允許你用一個 docker-compose.yml
文件來定義和運行多個相關聯的容器。這個文件就是你的“艦隊編隊指令”。
4.1 安裝Docker Compose
Docker Desktop for Mac/Windows 已經包含了它。在Linux上,你需要單獨安裝:
# 下載最新版本的Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose# 賦予執行權限
sudo chmod +x /usr/local/bin/docker-compose# 驗證安裝
docker-compose --version
4.2 編寫 docker-compose.yml
這是一個經典的WordPress(博客系統)示例,它包含一個wordpress
容器和一個mysql
容器。
# 版本號(注意:版本語法有變化,現代Compose建議使用 version: '3.8' 或根本不寫)
version: '3.8'# 定義我們的服務(容器艦隊)
services:# 第一個服務:數據庫db:image: mysql:8.0volumes:- db_data:/var/lib/mysql # 使用命名卷持久化數據restart: alwaysenvironment: # 設置環境變量MYSQL_ROOT_PASSWORD: somewordpressMYSQL_DATABASE: wordpressMYSQL_USER: wordpressMYSQL_PASSWORD: wordpress# 第二個服務:WordPress網站wordpress:depends_on: # 表明它依賴于db服務,會等待db啟動后再啟動- dbimage: wordpress:latestports:- "8000:80" # 將主機的8000端口映射到wordpress容器的80端口restart: alwaysenvironment:WORDPRESS_DB_HOST: db:3306 # 注意這里直接用服務名`db`來訪問另一個容器!WORDPRESS_DB_USER: wordpressWORDPRESS_DB_PASSWORD: wordpressWORDPRESS_DB_NAME: wordpressvolumes:- ./wp-content:/var/www/html/wp-content # 綁定掛載,用于主題/插件開發# 定義在外部聲明的命名卷
volumes:db_data: {}
4.3 Compose 常用命令
在包含docker-compose.yml
文件的目錄下執行以下命令:
docker-compose up
: 創建并啟動所有服務。-d
: 后臺運行。
docker-compose up -d
docker-compose down
: 停止并刪除所有容器、網絡。-v
: 同時刪除匿名卷(在Compose中定義的卷不會被刪除)。--rmi all
: 同時刪除Compose創建的所有鏡像。
docker-compose down -v
docker-compose ps
: 列出本項目下的所有容器。docker-compose logs
: 查看所有容器的日志。-f
: 跟蹤日志。service_name
: 查看指定服務的日志,如docker-compose logs wordpress
。
docker-compose exec
: 進入某個服務的容器。docker-compose exec db /bin/bash # 進入db服務的容器
docker-compose restart
/docker-compose stop
/docker-compose start
: 重啟、停止、啟動服務。docker-compose build
: 如果服務是用build: .
定義的,這個命令可以重新構建鏡像。
Compose的優勢:
- 一鍵啟停: 一個命令管理整個應用棧。
- 配置即代碼:
docker-compose.yml
文件記錄了整個環境配置,易于版本控制和共享。 - 服務發現: 容器之間可以使用服務名(如上面的
db
)直接通信,Compose會自動創建內部網絡并配置DNS。
第五章:港口與航線 —— 網絡與數據管理
5.1 網絡(Network)
Docker提供了幾種網絡模式,讓容器之間、容器與外部世界之間能夠通信。
- 查看網絡:
docker network ls
- 創建網絡:
docker network create my-network
- 將容器連接到網絡:
docker network connect my-network my-container
- 斷開連接:
docker network disconnect my-network my-container
- 刪除網絡:
docker network rm my-network
- 網絡模式:
bridge
: 默認模式。每個容器分配一個私有IP,通過網橋與主機通信。端口需要映射到主機才能被外部訪問。host
: 主機模式。容器直接使用主機的網絡命名空間,沒有自己的IP,容器端口直接暴露在主機上。性能更好,但隔離性差。none
: 無網絡。容器內沒有網絡棧。overlay
: ** overlay 網絡**。用于Docker Swarm集群中不同主機上的容器通信。
5.2 數據卷(Volume)
數據卷是保存Docker容器生成和使用的數據的首選機制。
- 查看卷:
docker volume ls
- 創建卷:
docker volume create my-named-volume
- 檢查卷的詳細信息:
docker volume inspect my-named-volume # 會顯示卷在主機上的實際存儲位置(Mountpoint)
- 刪除卷:
docker volume rm my-named-volume docker volume prune # 刪除所有未被使用的卷
第六章:實戰演習與故障排查
6.1 實戰:部署一個簡單的Python Web應用
-
項目結構:
my-app/ ├── app.py ├── requirements.txt └── Dockerfile
-
app.py
:from flask import Flask app = Flask(__name__)@app.route('/') def hello():return "Hello from Dockerized Flask App!"if __name__ == '__main__':app.run(host='0.0.0.0', port=5000)
-
requirements.txt
:Flask==2.0.1
-
Dockerfile
:FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD ["python", "app.py"]
-
構建并運行:
cd my-app docker build -t my-flask-app . docker run -d -p 5000:5000 --name flask-container my-flask-app
訪問
http://localhost:5000
查看結果。
6.2 常見問題排查(Debugging)
-
容器啟動后立即退出:
- 原因: 通常是因為容器內前臺進程執行完畢退出了。
- 排查:
docker logs flask-container # 查看日志,看有什么錯誤 docker run -it my-flask-app /bin/bash # 以交互模式運行,檢查鏡像內容
-
端口被占用:
- 錯誤:
Bind for 0.0.0.0:80 failed: port is already allocated
- 解決: 換一個主機端口
-p 8080:80
,或者停止正在占用端口的容器。
- 錯誤:
-
權限問題(尤其在Bind Mount時):
- 現象: 容器內應用無法寫入掛載的目錄。
- 解決: 了解Linux文件權限,或者使用命名卷(Docker會自動處理權限)。
-
docker: Error response from daemon: ...
:- 萬能排查法: 仔細閱讀錯誤信息! 99%的答案都在錯誤信息里。Docker的錯誤提示通常非常明確。
終章:遠征的繼續
恭喜你,船長!你已經完成了這次Docker命令的大航海,從單槍匹馬的容器操作,到指揮一支Compose艦隊,你已經具備了在容器化世界中航行的基本能力。
但這僅僅是開始。Docker的生態浩瀚無垠,前方還有更廣闊的領域等待你去探索:
- Docker Swarm / Kubernetes: 用于在生產環境中管理和編排超大規模容器集群的“航母戰斗群指揮系統”。
- CI/CD集成: 將Docker融入GitLab CI、Jenkins等持續集成/持續部署流程。
- 更安全的鏡像構建: 使用多階段構建(
multi-stage build
)減少鏡像體積,避免在鏡像中包含構建工具。 - 容器安全: 掃描鏡像漏洞,使用非root用戶運行容器。
記住,最好的學習方式就是不斷實踐。從今天起,嘗試把你本地開發的環境用Docker容器跑起來,把你下一個項目用Dockerfile
和docker-compose.yml
描述出來。
愿你的容器之旅,一帆風順!