Docker核心命令與實踐指南示例詳解
從零開始掌握 Docker:核心命令與實踐指南
摘要: 本文系統(tǒng)整理了 Docker 的核心概念與常用命令,涵蓋鏡像管理、容器操作、數(shù)據(jù)存儲、網(wǎng)絡(luò)配置、Compose 編排以及 Dockerfile 構(gòu)建等內(nèi)容。通過清晰的命令示例和實用說明,幫助開發(fā)者快速上手 Docker 容器化技術(shù),提升開發(fā)與部署效率。
關(guān)鍵詞: Docker, 容器化, 鏡像, 容器, Docker Compose, Dockerfile, 命令手冊
一、 Docker 鏡像管理
鏡像是 Docker 容器運(yùn)行的基礎(chǔ)模板。
1. 搜索鏡像
在 Docker Hub 或其他注冊中心查找鏡像。
docker search nginx
2. 拉取鏡像
下載鏡像到本地倉庫。推薦指定標(biāo)簽(如 :latest, :alpine)。
docker pull nginx # 拉取最新版 (latest) docker pull nginx:latest # 顯式指定最新版 docker pull nginx:alpine # 拉取 Alpine Linux 精簡版
3. 查看本地鏡像
列出所有已下載的鏡像。
docker images docker image ls # 等效命令
4. 刪除鏡像
移除不再需要的本地鏡像。注意: 依賴該鏡像的容器必須先刪除或停止。
docker rmi nginx:latest # 通過倉庫名:標(biāo)簽刪除 docker rmi <鏡像ID> # 通過唯一鏡像 ID 刪除 (更精確)
二、 Docker 容器操作
容器是鏡像的運(yùn)行實例。
1. 運(yùn)行容器
啟動一個新的容器實例。
docker run nginx # 前臺運(yùn)行 (會占用終端) docker run -d --name mynginx nginx # 后臺運(yùn)行 (-d) 并命名容器 (--name) docker run -d --name myweb -p 8080:80 nginx # 后臺運(yùn)行,并將容器 80 端口映射到宿主機(jī) 8080 端口 (-p) # 常用選項: # -d: 后臺運(yùn)行 (detached mode) # --name: 為容器指定一個易記的名稱 # -p <主機(jī)端口>:<容器端口>: 端口映射 # -it: 交互模式運(yùn)行 (通常與 /bin/bash 結(jié)合進(jìn)入容器) # -e: 設(shè)置環(huán)境變量 # --restart=always: 容器退出時自動重啟
2. 查看容器狀態(tài)
docker ps # 查看正在運(yùn)行的容器 docker ps -a # 查看所有容器 (包括已停止的) docker ps -aq # 查看所有容器的 ID (只顯示 ID, 常用于批量操作)
3. 啟動/停止/重啟容器
docker start <容器名稱|容器ID> # 啟動已停止的容器 docker stop <容器名稱|容器ID> # 優(yōu)雅停止運(yùn)行中的容器 (發(fā)送 SIGTERM) docker restart <容器名稱|容器ID> # 重啟容器
4. 查看容器資源使用與日志
docker stats <容器名稱|容器ID> # 實時查看容器的 CPU、內(nèi)存、網(wǎng)絡(luò)、磁盤等資源使用情況 docker logs <容器名稱|容器ID> # 查看容器日志 (默認(rèn)顯示已產(chǎn)生的日志) docker logs -f <容器名稱|容器ID> # 持續(xù)跟蹤 (follow) 容器日志輸出 (類似 tail -f)
5. 進(jìn)入運(yùn)行中的容器
在運(yùn)行的容器內(nèi)啟動一個交互式 Shell(通常是 /bin/bash 或 /bin/sh)。
docker exec -it mynginx /bin/bash # -i: 保持 STDIN 打開 # -t: 分配一個偽終端 (TTY)
6. 刪除容器
移除不再需要的容器。注意: 正在運(yùn)行的容器需要先停止或使用 -f 強(qiáng)制刪除。
docker rm <容器名稱|容器ID> # 刪除已停止的容器 docker rm -f <容器名稱|容器ID> # 強(qiáng)制刪除運(yùn)行中的容器 docker rm $(docker ps -aq) # 批量刪除所有已停止的容器 (危險操作!)
三、 構(gòu)建與分享自定義鏡像
1. 提交容器更改創(chuàng)建新鏡像
基于一個運(yùn)行中的容器的當(dāng)前狀態(tài)創(chuàng)建新的鏡像層。
docker commit -m "update index.html" mynginx mynginx:v1.0 # -m: 提交信息 # mynginx: 源容器名稱 # mynginx:v1.0: 新鏡像名稱:標(biāo)簽
2. 保存鏡像為文件
將鏡像導(dǎo)出為 .tar 文件,方便離線傳輸或備份。
docker save -o mynginx.tar mynginx:v1.0 # -o: 指定輸出文件名
3. 從文件加載鏡像
從 .tar 文件恢復(fù)鏡像到本地倉庫。
docker load -i mynginx.tar # -i: 指定輸入文件
4. 分享鏡像到 Docker Hub (或其他注冊中心)
登錄:
docker login # 默認(rèn)登錄 Docker Hub, 提示輸入用戶名密碼
標(biāo)記鏡像: 為本地鏡像添加符合目標(biāo)倉庫規(guī)范的名稱(通常是 <DockerHub用戶名>/<倉庫名>:<標(biāo)簽>)。
docker tag mynginx:v1.0 <你的DockerHub用戶名>/mynginx:v1.0
推送鏡像:
docker push <你的DockerHub用戶名>/mynginx:v1.0
四、 Docker 數(shù)據(jù)管理 (存儲卷 Volumes)
Docker 使用存儲卷 (Volumes) 或綁定掛載 (Bind Mounts) 來持久化容器數(shù)據(jù),避免容器刪除后數(shù)據(jù)丟失。
1. 目錄掛載 (Bind Mounts)
將宿主機(jī)上的一個具體目錄直接掛載到容器內(nèi)指定路徑。文件存在于宿主機(jī)文件系統(tǒng)上。
docker run -d -p 80:80 -v /宿主機(jī)/絕對路徑/nginxhtml:/usr/share/nginx/html --name myapp nginx # -v /宿主機(jī)路徑:/容器路徑
- 優(yōu)點: 直觀,方便在宿主機(jī)直接修改文件。
- 缺點: 依賴宿主機(jī)特定目錄結(jié)構(gòu),移植性稍差。
2. 卷掛載 (Volumes)
使用 Docker 管理的命名卷掛載到容器內(nèi)路徑。卷存儲在 Docker 管理的區(qū)域 (/var/lib/docker/volumes/),與容器生命周期解耦。
docker run -d -p 80:80 -v mynginxconf:/etc/nginx -v mynginxhtml:/usr/share/nginx/html --name myapp nginx # -v 卷名:/容器路徑
- 優(yōu)點: 移植性好,由 Docker 管理生命周期,備份/恢復(fù)方便。
- 缺點: 數(shù)據(jù)位置不如綁定掛載直觀。
3. 卷管理命令
docker volume ls # 列出所有 Docker 管理的卷 docker volume create myvolume # 創(chuàng)建一個新的命名卷 docker volume inspect myvolume # 查看指定卷的詳細(xì)信息 (包括其物理存儲位置 Mountpoint) docker volume rm myvolume # 刪除一個不再使用的卷 # 注意:刪除容器時,使用 -v 選項可以同時刪除關(guān)聯(lián)的匿名卷 (未命名的卷)。命名卷需要顯式刪除。
五、 Docker 網(wǎng)絡(luò)管理
Docker 容器默認(rèn)通過 docker0 虛擬網(wǎng)橋連接并相互隔離。
1. 查看容器網(wǎng)絡(luò)信息
docker container inspect <容器名稱|容器ID> # 查看容器詳細(xì)信息,包括其 IP 地址、網(wǎng)關(guān)、網(wǎng)絡(luò)配置等
2. 默認(rèn)網(wǎng)絡(luò) (docker0) 的局限性
- 容器 IP 地址在重啟或重新創(chuàng)建后可能變化。
- 默認(rèn)網(wǎng)絡(luò)不支持通過容器名稱進(jìn)行服務(wù)發(fā)現(xiàn)(只能通過易變的 IP 地址訪問)。
3. 創(chuàng)建自定義網(wǎng)絡(luò)
自定義網(wǎng)絡(luò)解決了 docker0 的局限性:
- 為容器提供穩(wěn)定的、可預(yù)測的 IP 地址段。
- 支持通過容器名稱作為主機(jī)名進(jìn)行服務(wù)發(fā)現(xiàn)(容器間可以直接用名字通信)。
docker network create mynet # 創(chuàng)建一個名為 mynet 的自定義橋接網(wǎng)絡(luò) docker network ls # 列出所有 Docker 網(wǎng)絡(luò)
4. 將容器連接到自定義網(wǎng)絡(luò)
docker run -d -p 8081:80 --name app1 --network mynet nginx docker run -d -p 8082:80 --name app2 --network mynet nginx
- 現(xiàn)在
app1可以直接通過ping app2或http://app2訪問app2容器,反之亦然。 - 使用
docker inspect app1查看其網(wǎng)絡(luò)配置,確認(rèn)它連接到了mynet并獲取了 IP。
5. 刪除網(wǎng)絡(luò)
注意: 只能刪除沒有容器連接的網(wǎng)絡(luò)。
docker network rm mynet
六、 使用 Docker Compose 編排多容器應(yīng)用
Docker Compose 使用 YAML 文件 (docker-compose.yml 或 compose.yml) 定義和運(yùn)行多容器 Docker 應(yīng)用。
1. 上線應(yīng)用 (啟動服務(wù))
在包含 compose.yaml 文件的目錄下運(yùn)行:
docker compose -f compose.yaml up -d # -f: 指定 Compose 文件 (默認(rèn)為 compose.yml 或 docker-compose.yml 時可省略) # -d: 后臺運(yùn)行 (detached) # up: 創(chuàng)建并啟動所有定義的服務(wù)、網(wǎng)絡(luò)、卷
- Compose 只會重建或重啟配置發(fā)生變化的容器(智能更新)。
2. 下線應(yīng)用 (停止并清理)
docker compose -f compose.yaml down # 停止并移除容器、網(wǎng)絡(luò) (默認(rèn)保留卷和鏡像) docker compose -f compose.yaml down --rmi all -v # 停止并移除容器、網(wǎng)絡(luò),同時刪除所有相關(guān)鏡像(--rmi all)和卷(-v) # --rmi all: 刪除 Compose 文件中定義的服務(wù)所使用的所有鏡像 # -v: 刪除 Compose 文件中定義的匿名卷和 compose 創(chuàng)建時指定的命名卷 (謹(jǐn)慎使用!)
七、 使用 Dockerfile 構(gòu)建鏡像
Dockerfile 是一個文本文件,包含構(gòu)建 Docker 鏡像所需的一系列指令。
常用 Dockerfile 指令
| 指令 | 說明 | 示例 |
|---|---|---|
| FROM | 指定基礎(chǔ)鏡像。 所有構(gòu)建都以此為基礎(chǔ)。 | FROM openjdk:11 |
| LABEL | 添加元數(shù)據(jù) (鍵值對)。 如作者、描述、版本等。 | LABEL maintainer="liuqi@example.com" |
| COPY | 復(fù)制文件/目錄。 從構(gòu)建上下文復(fù)制到鏡像內(nèi)。 | COPY ./app.jar /app/app.jar |
| ADD | 類似 COPY,但功能更多 (支持 URL、自動解壓 tar)。通常優(yōu)先用 COPY。 | ADD https://example.com/file.tar.gz / |
| WORKDIR | 設(shè)置工作目錄。 后續(xù)指令 (RUN, CMD, ENTRYPOINT, COPY, ADD) 都在此目錄下執(zhí)行。 | WORKDIR /app |
| RUN | 執(zhí)行命令。 在構(gòu)建過程中運(yùn)行命令并創(chuàng)建新的鏡像層。常用于安裝軟件包。 | RUN apt-get update && apt-get install -y curl |
| EXPOSE | 聲明運(yùn)行時容器監(jiān)聽的端口。 只是一個文檔說明,實際映射需用 -p。 | EXPOSE 8080 |
| ENV | 設(shè)置環(huán)境變量。 在構(gòu)建階段和運(yùn)行階段都可用。 | ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk |
| CMD | 指定容器啟動時的默認(rèn)命令。 可以被 docker run 的命令覆蓋。 | CMD ["java", "-jar", "/app.jar"] |
| ENTRYPOINT | 指定容器啟動時的主命令。 CMD 的內(nèi)容通常作為其參數(shù)。更不易被覆蓋。 | ENTRYPOINT ["java", "-jar"] CMD ["/app.jar"] |
示例 Dockerfile (構(gòu)建 Java 應(yīng)用鏡像)
# 使用 OpenJDK 11 官方鏡像作為基礎(chǔ) FROM openjdk:11 # 添加維護(hù)者信息 (元數(shù)據(jù)) LABEL author="liuqi" version="1.0" # 將構(gòu)建上下文中的 app.jar 復(fù)制到鏡像根目錄下 COPY app.jar /app.jar # 聲明應(yīng)用運(yùn)行時監(jiān)聽的端口 EXPOSE 8081 # 設(shè)置容器啟動時執(zhí)行的命令 (主進(jìn)程) ENTRYPOINT ["java", "-jar", "/app.jar"]
構(gòu)建鏡像
在包含 Dockerfile 和 app.jar 的目錄下運(yùn)行:
docker build -t myjavaapp:v1.0 . # -t: 指定構(gòu)建出的鏡像名稱和標(biāo)簽 (myjavaapp:v1.0) # . : 指定構(gòu)建上下文路徑 (當(dāng)前目錄),Dockerfile 和 COPY 的文件都相對于此路徑
八、 Docker 鏡像分層存儲機(jī)制
Docker 鏡像采用分層存儲 (Layer Storage) 機(jī)制,這是其高效性和輕量化的核心:
- Union File System (聯(lián)合文件系統(tǒng)): 如 AUFS, Overlay2 等。這些文件系統(tǒng)允許將多個目錄(稱為“層”)掛載到同一個虛擬目錄下。對用戶呈現(xiàn)的是一個單一的文件系統(tǒng)視圖。
- 只讀層 (Read-Only Layers):
- 鏡像由一系列只讀層疊加組成。
- 每一層代表 Dockerfile 中的一條指令(如
FROM,RUN,COPY,ADD)所引入的文件系統(tǒng)變化。 - 這些層是共享的。如果多個鏡像基于同一個基礎(chǔ)鏡像(如
ubuntu:latest),那么它們共享基礎(chǔ)鏡像的所有只讀層,節(jié)省磁盤空間。
- 容器層 (Container Layer / Read-Write Layer):
- 當(dāng)從鏡像啟動一個容器時,Docker 會在所有只讀層之上添加一個薄薄的讀寫層(通常稱為“容器層”或“可寫層”)。
- 容器運(yùn)行時的所有文件寫入操作(創(chuàng)建、修改、刪除文件)都只發(fā)生在這個讀寫層中。
- 容器刪除時,這個讀寫層也會被丟棄(除非使用卷持久化數(shù)據(jù))。
- 寫時復(fù)制 (Copy-on-Write - CoW):
- 如果一個容器需要修改只讀層中的某個文件(例如修改配置文件),CoW 機(jī)制會觸發(fā):
該文件會從底層的只讀層復(fù)制到容器的讀寫層。
后續(xù)所有對該文件的修改都只發(fā)生在讀寫層的這個副本上。
- 底層的只讀文件保持不變。這保證了基礎(chǔ)鏡像的完整性和可共享性。
- 只有首次修改時才復(fù)制,優(yōu)化了性能和存儲空間。
- 如果一個容器需要修改只讀層中的某個文件(例如修改配置文件),CoW 機(jī)制會觸發(fā):
圖解:
+---------------------------------------------------+
| Container (myapp) |
| +-----------------------------------------------+ |
| | Read-Write Layer (R/W) | | (容器層 - 存儲運(yùn)行時修改)
| +-----------------------------------------------+ |
| +-----------------------------------------------+ |
| | Read-Only Layer (n) | | (鏡像層 - 由 `RUN apt-get install` 添加)
| +-----------------------------------------------+ |
| ... |
| +-----------------------------------------------+ |
| | Read-Only Layer (2) | | (鏡像層 - 由 `COPY app.jar` 添加)
| +-----------------------------------------------+ |
| +-----------------------------------------------+ |
| | Read-Only Layer (1) | | (鏡像層 - 由 `FROM openjdk:11` 引入的基礎(chǔ)層)
| +-----------------------------------------------+ |
+---------------------------------------------------+
(Union Mount Point - 呈現(xiàn)為單一文件系統(tǒng)視圖)優(yōu)勢:
- 高效構(gòu)建: 構(gòu)建鏡像時,如果某層及其之上的層沒有變化,Docker 會直接使用緩存中的層,極大加速構(gòu)建過程。
- 節(jié)省空間: 多個鏡像和容器共享基礎(chǔ)層。
- 快速啟動: 啟動容器只需添加一個薄薄的讀寫層,無需復(fù)制整個文件系統(tǒng)。
- 鏡像復(fù)用: 公共基礎(chǔ)層只需下載一次。
到此這篇關(guān)于Docker核心命令與實踐指南的文章就介紹到這了,更多相關(guān)docker命令內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何使用docker?compose部署dify(大模型開發(fā)使用平臺)
Dify是一款生成式AI應(yīng)用中間件,面向有私有部署與數(shù)據(jù)合規(guī)需求的企業(yè)用戶,推動企業(yè)向AI+時代轉(zhuǎn)型,這篇文章主要介紹了使用docker compose部署dify(大模型開發(fā)使用平臺),需要的朋友可以參考下2025-05-05
Docker的文件系統(tǒng)映射:主機(jī)與容器間目錄的雙向映射詳解
通過Docker的目錄映射功能,實現(xiàn)主機(jī)與容器間的數(shù)據(jù)共享與持久化存儲,使用-v或--mount參數(shù)在運(yùn)行時設(shè)置主機(jī)與容器目錄映射,或通過DockerCompose配置文件實現(xiàn)自動化,此功能提升數(shù)據(jù)管理靈活性和效率2024-11-11
Dockerfile文件編寫實戰(zhàn)練習(xí)及注意事項
Dockerfile?是一個用于構(gòu)建?Docker?鏡像的文本文件,通過一系列指令來定義鏡像的構(gòu)建過程,這篇文章主要介紹了Dockerfile文件編寫實戰(zhàn)練習(xí)及注意事項的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-04-04
使用?Docker?搭建適用于?HomeLab?的書簽導(dǎo)航應(yīng)用
在使用新私有化部署的書簽導(dǎo)航應(yīng)用一個月之后,我們來聊聊書簽導(dǎo)航工具,以及介紹如何使用?Docker?在幾分鐘之內(nèi)部署屬于你自己的書簽導(dǎo)航應(yīng)用2022-02-02

