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

