Docker核心知識點和常用指令(命令)速通
前言:
本文梳理了 Docker 的核心知識點與常用命令,涵蓋鏡像管理、容器操作、數(shù)據(jù)卷、網(wǎng)絡(luò)配置、Dockerfile 編寫及 Compose 編排。適合快速查閱和日常備忘,希望能幫你提升容器化開發(fā)效率。
一、Docker 解決了什么問題?
| 問題 | Docker 的解決方式 |
|---|---|
| 環(huán)境不一致 | 將應(yīng)用及其依賴打包成鏡像,保證在任何機器上行為一致 |
| 可移植性差 | 鏡像可跨平臺運行,一次構(gòu)建,到處運行 |
| 資源隔離 | 容器間相互隔離,沙箱運行,互不干擾 |
| 部署效率低 | 秒級啟動,自動化部署流程更簡潔 |
Docker VS 虛擬機
| 對比項 | 虛擬機 | Docker 容器 |
|---|---|---|
| 隔離級別 | 模擬完整硬件,有獨立 OS,隔離度強 | 共享宿主機內(nèi)核,隔離度相對弱 |
| 資源占用 | 重,啟動慢(分鐘級) | 輕,啟動快(秒級) |
| 可移植性 | 鏡像體積大 | 鏡像體積小,分發(fā)方便 |
| 適用場景 | 需要強隔離或不同 OS | 微服務(wù)、快速部署、CI/CD |
二、鏡像管理(images)
常用指令
# 拉取鏡像 docker pull 鏡像名[:標(biāo)簽] # 查看本地鏡像 docker images # 刪除指定鏡像(-f 強制刪除) docker rmi [-f] 鏡像名或id # 刪除所有未被使用的鏡像 docker image prune
離線遷移(無網(wǎng)絡(luò)環(huán)境)
# 1. 導(dǎo)出鏡像為文件 docker save -o 文件名.tar 鏡像名 # 2. 傳輸?shù)侥繕?biāo)機器(普通文件拷貝) scp 文件名.tar root@目標(biāo)ip:目錄 # 3. 在目標(biāo)機器導(dǎo)入鏡像 docker load -i 文件名.tar
打標(biāo)簽
# 類比 cp 指令,給鏡像打一個新標(biāo)簽(原鏡像保留) docker tag 原鏡像名[:標(biāo)簽] 新鏡像名[:標(biāo)簽]
三、容器管理(container)
運行容器
docker run [選項] 鏡像名 [命令]
常用選項:
| 選項 | 說明 |
|---|---|
-p 宿主機端口:容器端口 | 端口映射,將容器端口暴露給外部 |
-d | 后臺(守護進程)模式運行 |
--name 名字 | 指定容器名稱 |
-e KEY=VALUE | 設(shè)置環(huán)境變量 |
--rm | 容器停止后自動刪除 |
-v 卷名或路徑:容器目錄 | 掛載數(shù)據(jù)卷(詳見數(shù)據(jù)卷章節(jié)) |
--network 網(wǎng)絡(luò)名 | 指定網(wǎng)絡(luò)模式 |
停止與刪除
docker stop 容器名或id # 優(yōu)雅停止容器 docker kill 容器名或id # 強制終止容器 docker rm 容器名或id # 刪除容器(需先停止) docker rm -f 容器名或id # 強制刪除運行中的容器
查看容器
docker ps # 查看正在運行的容器 docker ps -a # 查看所有容器(含已停止) docker logs 容器名或id # 查看容器日志 docker logs -f 容器名或id # 實時追蹤日志輸出 docker inspect 容器名或id # 查看容器詳細信息
進入運行中的容器
docker exec -it 容器名或id /bin/bash # 退出容器但不停止:Ctrl+P,Ctrl+Q # 退出并停止:exit
四、數(shù)據(jù)卷(docker volume)
為什么需要數(shù)據(jù)卷?
- 數(shù)據(jù)持久化:容器默認(rèn)是臨時的,刪除后數(shù)據(jù)隨之消失。
- 宿主機 ↔ 容器:方便在兩者之間共享文件。
- 容器 ↔ 容器:多個容器掛載同一個卷即可實現(xiàn)數(shù)據(jù)共享。
三種數(shù)據(jù)卷類型
1. 管理卷(Managed Volume)
由 Docker 統(tǒng)一創(chuàng)建和管理,存儲在 Docker 內(nèi)部目錄(如 /var/lib/docker/volumes/),可移植性強,推薦優(yōu)先使用。
docker volume create 卷名 # 創(chuàng)建卷 docker volume ls # 列出所有卷 docker volume inspect 卷名 # 查看卷詳情 docker volume rm 卷名 # 刪除指定卷 docker volume prune # 刪除所有未使用的卷 # 掛載到容器 docker run [...] -v 卷名:容器目錄 鏡像名
2. 綁定卷(Bind Mount)
將宿主機上的具體目錄或文件直接掛載到容器,由用戶自己管理路徑,沒有 docker volume 系列指令。
# 掛載到容器(卷名替換為宿主機的絕對路徑) docker run [...] -v /宿主機/路徑:容器目錄 鏡像名 # 只讀掛載(容器內(nèi)只能讀取,不能修改) docker run [...] -v /宿主機/路徑:容器目錄:ro 鏡像名
注意:掛載時容器對應(yīng)目錄會被宿主機目錄的內(nèi)容覆蓋同步。
:ro是對容器的限制,容器內(nèi)只讀,宿主機仍可正常修改文件。
3. 臨時卷(tmpfs Mount)
數(shù)據(jù)存儲在宿主機內(nèi)存中,容器停止后數(shù)據(jù)隨之消失。適合存放敏感信息或高頻讀寫的臨時數(shù)據(jù),沒有 docker volume 系列指令。
docker run [...] --tmpfs 容器目錄 鏡像名
五、容器網(wǎng)絡(luò)(docker network)
為什么需要網(wǎng)絡(luò)?
- 容器與容器之間通信(如 Web 服務(wù)訪問數(shù)據(jù)庫)
- 容器與外部網(wǎng)絡(luò)通信
- 容器與宿主機交互
四種常見網(wǎng)絡(luò)模式
| 模式 | 說明 |
|---|---|
| Bridge(橋接) | 默認(rèn)模式。Docker 創(chuàng)建虛擬網(wǎng)橋,容器通過它與外部通信,容器間可通過容器名互相訪問(同一自定義網(wǎng)絡(luò)下) |
| Host(宿主機網(wǎng)絡(luò)) | 容器直接使用宿主機的網(wǎng)絡(luò)棧,無網(wǎng)絡(luò)隔離,性能最好,但端口沖突風(fēng)險高 |
| Container(容器網(wǎng)絡(luò)) | 與指定的另一個容器共享網(wǎng)絡(luò)命名空間,兩者共用同一個 IP |
| None(無網(wǎng)絡(luò)) | 容器沒有任何網(wǎng)絡(luò)接口,完全隔離,適合純計算任務(wù) |
網(wǎng)絡(luò)管理指令
docker network create 網(wǎng)絡(luò)名 # 創(chuàng)建自定義網(wǎng)絡(luò) docker network ls # 列出所有網(wǎng)絡(luò) docker network inspect 網(wǎng)絡(luò)名 # 查看網(wǎng)絡(luò)詳情 docker network rm 網(wǎng)絡(luò)名 # 刪除指定網(wǎng)絡(luò) docker network prune # 刪除所有未使用的網(wǎng)絡(luò) docker network connect 網(wǎng)絡(luò)名 容器名 # 將容器加入網(wǎng)絡(luò) docker network disconnect 網(wǎng)絡(luò)名 容器名 # 將容器從網(wǎng)絡(luò)移除
指定網(wǎng)絡(luò)模式
# 默認(rèn):Bridge 模式,無需額外參數(shù) docker run [...] 鏡像名 # Host 模式 docker run --network host 鏡像名 # Container 模式(共享容器 A 的網(wǎng)絡(luò),A 斷網(wǎng)則本容器也斷網(wǎng)) docker run --network container:容器A的名字 鏡像名 # None 模式 docker run --network none 鏡像名
六、鏡像制作(Dockerfile)
方式一:容器快照(不推薦用于生產(chǎn))
docker commit [選項] 容器id 鏡像名[:標(biāo)簽]
將運行中容器的當(dāng)前狀態(tài)保存為鏡像。缺點是不可復(fù)現(xiàn)、歷史不透明。
方式二:Dockerfile(推薦)
通過腳本描述鏡像的構(gòu)建過程,可版本控制、可復(fù)現(xiàn)。
常用指令
| 指令 | 說明 |
|---|---|
FROM 基礎(chǔ)鏡像 | 指定基礎(chǔ)鏡像,必須放在第一行 |
COPY 宿主機文件 鏡像目錄 | 將文件從構(gòu)建上下文復(fù)制到鏡像 |
ADD 宿主機文件或URL 鏡像目錄 | COPY 的增強版:本地 .tar 壓縮包會自動解壓;支持通過 URL 拉取文件(URL 不會自動解壓) |
ENV KEY=VALUE | 設(shè)置環(huán)境變量,可在后續(xù)指令中用 ${KEY} 引用 |
ARG 變量名[=默認(rèn)值] | 構(gòu)建時變量,僅在構(gòu)建階段有效,不會保留到鏡像中 |
WORKDIR 目錄 | 設(shè)置工作目錄,后續(xù) RUN/COPY/CMD 等均在此目錄下執(zhí)行 |
RUN 命令 | 構(gòu)建時執(zhí)行命令(如安裝依賴)。每條 RUN 會新增一層,建議用 && 合并減少層數(shù) |
CMD 命令 | 容器啟動時執(zhí)行的默認(rèn)命令。可被 docker run 末尾傳入的命令覆蓋 |
ENTRYPOINT 命令 | 容器啟動時執(zhí)行的入口點。不會被 docker run 末尾的命令覆蓋,而是將其作為參數(shù)傳入 |
EXPOSE 端口 | 聲明容器監(jiān)聽的端口(文檔用途,需配合 -p 才實際映射) |
VOLUME 容器目錄 | 聲明匿名數(shù)據(jù)卷掛載點 |
USER 用戶名 | 指定后續(xù)指令和容器運行時的用戶 |
HEALTHCHECK | 定義容器健康檢查命令 |
CMD vs ENTRYPOINT
# 只用 CMD:啟動命令可被覆蓋 CMD ["python", "app.py"] # docker run 鏡像名 bash → 執(zhí)行 bash,app.py 不會啟動 # 只用 ENTRYPOINT:入口固定,docker run 后的參數(shù)追加進來 ENTRYPOINT ["python", "app.py"] # docker run 鏡像名 --port=8080 → 執(zhí)行 python app.py --port=8080 # 兩者結(jié)合(推薦):ENTRYPOINT 定義固定入口,CMD 提供默認(rèn)參數(shù) ENTRYPOINT ["python", "app.py"] CMD ["--port=80"] # docker run 鏡像名 → python app.py --port=80(使用 CMD 默認(rèn)值) # docker run 鏡像名 --port=8080 → python app.py --port=8080(CMD 被覆蓋)
多階段構(gòu)建(Multi-stage Build)
為什么需要? 編譯型語言(如 Go、Java)在構(gòu)建時需要完整的編譯環(huán)境,但運行時只需要編譯產(chǎn)物。若把編譯工具也打包進最終鏡像,會導(dǎo)致鏡像體積龐大。
優(yōu)勢:最終鏡像只包含運行時所需文件,體積大幅縮減,安全面也更小。
# 階段一:構(gòu)建(使用完整編譯環(huán)境) FROM golang:1.21 AS builder WORKDIR /app COPY . . RUN go build -o myapp . # 階段二:運行(使用最小基礎(chǔ)鏡像) FROM alpine:latest WORKDIR /app # 只從構(gòu)建階段復(fù)制編譯產(chǎn)物 COPY --from=builder /app/myapp . CMD ["./myapp"]
構(gòu)建鏡像
docker build [選項] 構(gòu)建上下文路徑 # 常用選項: # -t 鏡像名:標(biāo)簽 指定鏡像名和標(biāo)簽 # -f Dockerfile路徑 指定 Dockerfile 文件(默認(rèn)找當(dāng)前目錄的 Dockerfile) # --no-cache 不使用緩存,強制重新構(gòu)建 # 示例 docker build -t myapp:1.0 . docker build -f ./docker/Dockerfile -t myapp:1.0 .
七、容器編排(docker compose)
為什么需要編排?
實際應(yīng)用往往由多個服務(wù)組成(如 Web 服務(wù) + 數(shù)據(jù)庫 + 緩存),手動逐一 docker run 不僅繁瑣,還難以管理服務(wù)間的依賴關(guān)系和網(wǎng)絡(luò)配置。Docker Compose 通過一個 YAML 文件統(tǒng)一描述和管理多容器應(yīng)用。
解決的問題:
- 一條命令啟動 / 停止整個應(yīng)用棧
- 自動處理服務(wù)間的網(wǎng)絡(luò)與依賴順序
- 配置即代碼,便于版本控制和團隊協(xié)作
配置文件 docker-compose.yml
version: "3.9" # 指定 Compose 文件格式版本
services: # 定義各個服務(wù)
web: # 服務(wù)名(可自定義)
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- db # 聲明依賴,db 先于 web 啟動
networks:
- app-net
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: mydb
volumes:
- db-data:/var/lib/mysql
networks:
- app-net
volumes: # 聲明管理卷
db-data:
networks: # 聲明自定義網(wǎng)絡(luò)
app-net:
driver: bridge
常用指令
docker compose config # 校驗并查看合并后的配置 docker compose up # 創(chuàng)建并啟動所有服務(wù)(前臺) docker compose up -d # 后臺啟動 docker compose up --build # 啟動前重新構(gòu)建鏡像 docker compose down # 停止并刪除容器、網(wǎng)絡(luò)(數(shù)據(jù)卷默認(rèn)保留) docker compose down -v # 同時刪除數(shù)據(jù)卷 docker compose ps # 查看服務(wù)狀態(tài) docker compose logs -f # 實時查看所有服務(wù)日志 docker compose logs -f 服務(wù)名 # 查看指定服務(wù)日志 docker compose exec 服務(wù)名 bash # 進入指定服務(wù)的容器 docker compose restart 服務(wù)名 # 重啟指定服務(wù) docker compose pull # 拉取所有服務(wù)的最新鏡像
附:常見使用場景示例
運行一個 Nginx 容器,映射端口 80,掛載本地 html 目錄
docker run -d --name web \ -p 8080:80 \ -v /my/html:/usr/share/nginx/html \ nginx
通過 Dockerfile 構(gòu)建并運行一個 Python 應(yīng)用
FROM python:3.11-slim WORKDIR /app COPY . . RUN pip install -r requirements.txt CMD ["python", "app.py"]
docker build -t myapp . docker run -d --name app -p 5000:5000 myapp
創(chuàng)建自定義網(wǎng)絡(luò),讓兩個容器通信
docker network create app-net docker run -d --name redis --network app-net redis docker run -d --name web --network app-net -p 80:80 mywebapp
總結(jié)
到此這篇關(guān)于Docker核心知識點和常用指令的文章就介紹到這了,更多相關(guān)Docker核心知識點內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ubuntu系統(tǒng)使用docker gitlab 磁盤空間滿的問題及解決
這篇文章主要介紹了ubuntu系統(tǒng)使用docker gitlab 磁盤空間滿的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05
docker-compose ports和expose的區(qū)別詳解
這篇文章主要介紹了docker-compose ports和expose的區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
docker搭建redis哨兵集群并且整合springboot的實現(xiàn)
本文主要介紹了docker搭建redis哨兵集群并且整合springboot的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07

