在Docker環(huán)境中如何運(yùn)行自己的代碼
一、什么是 Docker?
1.1 Docker 的定義與核心定位
Docker 是由 Docker Inc.(后被 Mirantis 收購(gòu))開(kāi)發(fā)的一款開(kāi)源的容器化平臺(tái),基于 Go 語(yǔ)言開(kāi)發(fā),遵循 Apache 2.0 開(kāi)源協(xié)議。其核心定位是:將應(yīng)用程序及其依賴(lài)環(huán)境打包成輕量級(jí)、可移植、自包含的容器,使得應(yīng)用可以在任何支持 Docker 的環(huán)境中以相同的方式運(yùn)行。
通俗來(lái)講,Docker 就像一個(gè) “標(biāo)準(zhǔn)化的集裝箱”:無(wú)論你的應(yīng)用是 Python 寫(xiě)的 Web 服務(wù)、Node.js 開(kāi)發(fā)的前端項(xiàng)目,還是 Java 構(gòu)建的微服務(wù),都可以被裝進(jìn)這個(gè) “集裝箱” 里。這個(gè) “集裝箱” 包含了應(yīng)用運(yùn)行所需的所有東西 —— 代碼、運(yùn)行時(shí)、系統(tǒng)工具、系統(tǒng)庫(kù),只要有 Docker 運(yùn)行環(huán)境,這個(gè) “集裝箱” 就能無(wú)縫運(yùn)行,無(wú)需擔(dān)心環(huán)境差異。
1.2 Docker 的核心架構(gòu)
Docker 采用客戶(hù)端 - 服務(wù)器(C/S)架構(gòu),核心組件包括:
- Docker Client(客戶(hù)端):用戶(hù)交互的入口,通過(guò)命令行(
docker命令)或 API 向 Docker Daemon 發(fā)送指令(如構(gòu)建鏡像、啟動(dòng)容器); - Docker Daemon(守護(hù)進(jìn)程):運(yùn)行在宿主機(jī)的后臺(tái)進(jìn)程,負(fù)責(zé)處理客戶(hù)端的請(qǐng)求,管理鏡像、容器、網(wǎng)絡(luò)、數(shù)據(jù)卷等核心資源;
- Docker Registry(鏡像倉(cāng)庫(kù)):存儲(chǔ) Docker 鏡像的倉(cāng)庫(kù),分為公有倉(cāng)庫(kù)(如 Docker Hub)和私有倉(cāng)庫(kù)(如企業(yè)內(nèi)部倉(cāng)庫(kù));
- Containerd:底層容器運(yùn)行時(shí),負(fù)責(zé)容器的創(chuàng)建、啟動(dòng)、停止等生命周期管理,Docker Daemon 不再直接操作容器,而是通過(guò) Containerd 調(diào)用 RunC;
- RunC:輕量級(jí)的容器運(yùn)行時(shí),遵循 OCI(開(kāi)放容器倡議)標(biāo)準(zhǔn),是容器運(yùn)行的核心執(zhí)行器。
核心交互流程:用戶(hù)通過(guò) Docker Client 輸入 docker run 命令 → Docker Daemon 接收指令后,從 Registry 拉取鏡像(若本地?zé)o)→ 調(diào)用 Containerd 創(chuàng)建容器 → RunC 啟動(dòng)容器進(jìn)程,完成應(yīng)用運(yùn)行。
二、為什么要使用 Docker?—— 解決開(kāi)發(fā)部署的核心痛點(diǎn)
2.1 徹底終結(jié) “環(huán)境不一致” 的噩夢(mèng)
“在我本地能跑,到測(cè)試環(huán)境就報(bào)錯(cuò)” 是開(kāi)發(fā)人員的經(jīng)典吐槽,根源在于開(kāi)發(fā)、測(cè)試、生產(chǎn)環(huán)境的差異:
- 開(kāi)發(fā)用 macOS + Python 3.8,測(cè)試服務(wù)器是 CentOS 7 + Python 3.6,依賴(lài)包版本沖突導(dǎo)致代碼運(yùn)行異常;
- 前端項(xiàng)目依賴(lài) Node.js 16,運(yùn)維部署時(shí)用了 Node.js 18,打包后的代碼出現(xiàn)兼容性問(wèn)題;
- 數(shù)據(jù)庫(kù)版本不一致:開(kāi)發(fā)用 MySQL 8.0,生產(chǎn)用 MySQL 5.7,SQL 語(yǔ)法不兼容導(dǎo)致功能失效。
Docker 的解決方案是:將應(yīng)用 + 運(yùn)行環(huán)境打包成鏡像,鏡像在任何支持 Docker 的環(huán)境中運(yùn)行結(jié)果一致。無(wú)論你是在 macOS、Windows、Linux 還是云服務(wù)器上運(yùn)行,只要鏡像相同,應(yīng)用行為就完全一致,真正實(shí)現(xiàn) “一次構(gòu)建,到處運(yùn)行”。
三、核心概念辨析:虛擬機(jī)、Docker 容器與鏡像
要掌握 Docker,必須先理清三個(gè)核心概念:虛擬機(jī)、Docker 容器、Docker 鏡像,以及它們之間的關(guān)系。
3.1 傳統(tǒng)虛擬機(jī):重量級(jí)的環(huán)境隔離方案
虛擬機(jī)(VM)是通過(guò)虛擬化技術(shù)在物理服務(wù)器上模擬出的獨(dú)立操作系統(tǒng)實(shí)例,核心依賴(lài) Hypervisor(虛擬化管理程序,如 VMware、KVM、VirtualBox)。
3.1.1 虛擬機(jī)的架構(gòu)
- 物理機(jī)(Host Machine):底層的硬件服務(wù)器,提供 CPU、內(nèi)存、存儲(chǔ)、網(wǎng)絡(luò)等物理資源;
- Hypervisor:運(yùn)行在物理機(jī)上的虛擬化層,負(fù)責(zé)將物理資源分配給不同的虛擬機(jī);
- 客戶(hù)機(jī)(Guest Machine):虛擬機(jī)實(shí)例,包含完整的操作系統(tǒng)(如 Windows、Linux)和應(yīng)用程序;
- Guest OS:虛擬機(jī)內(nèi)的操作系統(tǒng),每個(gè)虛擬機(jī)都有獨(dú)立的內(nèi)核和系統(tǒng)庫(kù)。
3.1.2 虛擬機(jī)的特點(diǎn)
- 完全隔離:每個(gè)虛擬機(jī)擁有獨(dú)立的內(nèi)核、文件系統(tǒng)、網(wǎng)絡(luò),與其他虛擬機(jī)和宿主機(jī)完全隔離;
- 重量級(jí):需要模擬完整的硬件和操作系統(tǒng),啟動(dòng)時(shí)間長(zhǎng)(分鐘級(jí)),資源占用高(每個(gè)虛擬機(jī)需分配固定的 CPU、內(nèi)存);
- 兼容性好:可運(yùn)行任何操作系統(tǒng)和應(yīng)用,不受宿主機(jī)系統(tǒng)限制。
3.2 Docker 容器:輕量級(jí)的進(jìn)程隔離
Docker 容器是基于 Linux 內(nèi)核技術(shù)實(shí)現(xiàn)的輕量級(jí)隔離環(huán)境,本質(zhì)上是宿主機(jī)上的一組受限制的進(jìn)程。
3.2.1 容器的核心隔離技術(shù)
Docker 容器的隔離性依賴(lài) Linux 內(nèi)核的兩大核心特性:
- Namespace:實(shí)現(xiàn)資源隔離,包括 PID(進(jìn)程 ID)、NET(網(wǎng)絡(luò))、MNT(文件系統(tǒng))、UTS(主機(jī)名)、IPC(進(jìn)程間通信)、USER(用戶(hù))等 Namespace。每個(gè)容器擁有獨(dú)立的 Namespace,只能看到自己的進(jìn)程、網(wǎng)絡(luò)、文件系統(tǒng),無(wú)法感知宿主機(jī)或其他容器的資源;
- Cgroup(Control Group):實(shí)現(xiàn)資源限制,可限制容器的 CPU、內(nèi)存、磁盤(pán) I/O、網(wǎng)絡(luò)帶寬等資源,避免容器搶占宿主機(jī)資源。
3.2.2 容器的特點(diǎn)
- 輕量級(jí):無(wú)需模擬硬件和操作系統(tǒng)內(nèi)核,共享宿主機(jī)內(nèi)核,啟動(dòng)時(shí)間短(毫秒級(jí)),資源占用低(按需分配資源,無(wú)需固定分配);
- 高效隔離:進(jìn)程級(jí)隔離,隔離性略弱于虛擬機(jī),但足以滿(mǎn)足絕大多數(shù)應(yīng)用場(chǎng)景;
- 可移植性:基于鏡像運(yùn)行,可在任何支持 Docker 的環(huán)境中遷移;
- 快速擴(kuò)縮容:容器創(chuàng)建 / 銷(xiāo)毀速度快,可快速響應(yīng)業(yè)務(wù)擴(kuò)縮容需求。
3.3 Docker 鏡像:容器的 “只讀模板”
Docker 鏡像(Image)是創(chuàng)建 Docker 容器的只讀模板,包含了容器運(yùn)行所需的所有文件系統(tǒng)、代碼、運(yùn)行時(shí)、依賴(lài)、配置等。
3.3.1 鏡像的核心特性
- 只讀性:鏡像一旦構(gòu)建完成,就無(wú)法修改,只能以只讀方式存在;
- 分層結(jié)構(gòu):鏡像基于 UnionFS(聯(lián)合文件系統(tǒng))實(shí)現(xiàn)分層存儲(chǔ),每個(gè)層都是一個(gè)只讀的文件系統(tǒng)片段,多個(gè)鏡像可共享相同的層,節(jié)省存儲(chǔ)空間。例如:Python 3.9-alpine 鏡像包含基礎(chǔ)層(alpine 系統(tǒng))、Python 運(yùn)行時(shí)層、依賴(lài)層,多個(gè)基于該鏡像的容器可共享這些層;
- 可復(fù)用性:鏡像可作為基礎(chǔ)模板,構(gòu)建新的鏡像(如基于 Python 3.9-alpine 鏡像,添加自己的代碼和依賴(lài),構(gòu)建新的應(yīng)用鏡像)。
3.4 虛擬機(jī) vs Docker 容器:核心差異對(duì)比
| 特性 | 虛擬機(jī) | Docker 容器 |
|---|---|---|
| 內(nèi)核 | 每個(gè)虛擬機(jī)有獨(dú)立內(nèi)核 | 共享宿主機(jī)內(nèi)核(僅 Linux 容器) |
| 啟動(dòng)時(shí)間 | 分鐘級(jí) | 毫秒級(jí) |
| 資源占用 | 高(固定分配 CPU / 內(nèi)存) | 低(按需分配,共享資源) |
| 隔離級(jí)別 | 硬件級(jí)(完全隔離) | 進(jìn)程級(jí)(內(nèi)核級(jí)隔離) |
| 鏡像 / 鏡像體積 | 大(包含完整操作系統(tǒng),GB 級(jí)) | ?。▋H包含應(yīng)用和依賴(lài),MB 級(jí)) |
| 可移植性 | 差(依賴(lài) Hypervisor) | 好(跨平臺(tái)運(yùn)行) |
| 擴(kuò)縮容效率 | 低(啟動(dòng)慢,資源固定) | 高(啟動(dòng)快,資源彈性分配) |
| 適用場(chǎng)景 | 需完全隔離的場(chǎng)景(如多操作系統(tǒng)運(yùn)行) | 微服務(wù)、CI/CD、快速部署、環(huán)境標(biāo)準(zhǔn)化 |
3.5 Docker 容器與鏡像的關(guān)系:模板與實(shí)例
Docker 容器和鏡像的關(guān)系,類(lèi)似于類(lèi)與對(duì)象的關(guān)系(鏡像可以理解為一個(gè)生產(chǎn)容器的模具):
- 鏡像:相當(dāng)于 “類(lèi)”,是只讀的模板,定義了容器的結(jié)構(gòu)和行為;
- 容器:相當(dāng)于 “對(duì)象”,是鏡像的運(yùn)行實(shí)例,基于鏡像創(chuàng)建,擁有可寫(xiě)層(鏡像為只讀,容器在鏡像的基礎(chǔ)上添加一層可寫(xiě)層,所有修改都在可寫(xiě)層中進(jìn)行)。
核心關(guān)系總結(jié):
- 一個(gè)鏡像可以創(chuàng)建多個(gè)容器(一個(gè)類(lèi)可以實(shí)例化多個(gè)對(duì)象);
- 容器啟動(dòng)時(shí),Docker 會(huì)加載鏡像的所有只讀層,并在頂部創(chuàng)建一個(gè)可寫(xiě)層;
- 容器停止后,可寫(xiě)層的數(shù)據(jù)不會(huì)丟失,重啟容器后仍可訪(fǎng)問(wèn);
- 刪除容器時(shí),可寫(xiě)層會(huì)被刪除,鏡像的只讀層不會(huì)受影響;
- 可通過(guò)
docker commit將容器的可寫(xiě)層轉(zhuǎn)換為新的鏡像層,實(shí)現(xiàn)鏡像的更新。
示例:基于 python:3.9-alpine 鏡像創(chuàng)建兩個(gè)容器 A 和 B,A 和 B 共享鏡像的只讀層,各自擁有獨(dú)立的可寫(xiě)層。修改 A 容器內(nèi)的文件,只會(huì)影響 A 的可寫(xiě)層,不會(huì)影響 B 容器和原始鏡像。
四、如何選擇并拉取合適的 Docker 鏡像?
鏡像是 Docker 運(yùn)行的基礎(chǔ),選擇合適的鏡像直接影響容器的穩(wěn)定性、體積和安全性。本節(jié)將詳細(xì)講解鏡像的選擇原則、拉取方法和本地管理。
4.1 鏡像的核心來(lái)源
4.1.1 公有鏡像倉(cāng)庫(kù):Docker Hub
Docker Hub(https://hub.docker.com/)是官方的公有鏡像倉(cāng)庫(kù),包含數(shù)百萬(wàn)個(gè)官方和社區(qū)鏡像,是最主要的鏡像來(lái)源:
- 官方鏡像:由 Docker 官方或軟件廠(chǎng)商維護(hù)(如
python、node、nginx、mysql),安全性高、更新及時(shí)、兼容性好; - 社區(qū)鏡像:由開(kāi)發(fā)者或社區(qū)維護(hù),可能包含定制化配置,但需注意安全性(避免惡意鏡像)。
4.1.2 私有鏡像倉(cāng)庫(kù)
企業(yè)內(nèi)部通常會(huì)搭建私有鏡像倉(cāng)庫(kù)(如 Docker Registry、Harbor),用于存儲(chǔ)內(nèi)部定制的鏡像:
- 避免敏感代碼 / 配置泄露;
- 提高鏡像拉取速度(無(wú)需訪(fǎng)問(wèn)公網(wǎng));
- 統(tǒng)一管理企業(yè)內(nèi)部的鏡像版本。
4.2 選擇鏡像的核心原則
4.2.1 優(yōu)先選擇官方鏡像
官方鏡像經(jīng)過(guò)嚴(yán)格測(cè)試,安全性和穩(wěn)定性有保障,且有清晰的版本更新記錄。
例如:選擇 python:3.9-alpine 而非社區(qū)維護(hù)的 xxx/python:3.9。
4.2.2 選擇輕量化的鏡像版本
鏡像體積越小,拉取速度越快,占用存儲(chǔ)空間越少。常見(jiàn)的輕量化版本:
- alpine 版本:基于 Alpine Linux(輕量級(jí) Linux 發(fā)行版,體積約 5MB),是最常用的輕量化版本,如
python:3.9-alpine、nginx:alpine; - slim 版本:精簡(jiǎn)版,去掉了不必要的組件,體積介于 full 版本和 alpine 版本之間,如
python:3.9-slim; - full 版本:完整版本,包含所有組件,體積大,適合需要完整工具鏈的場(chǎng)景。
注意:alpine 版本可能缺少部分系統(tǒng)庫(kù),若應(yīng)用依賴(lài)特定庫(kù)(如 glibc),需手動(dòng)安裝。
4.2.3 明確指定鏡像標(biāo)簽,避免使用 latest
latest 是鏡像的默認(rèn)標(biāo)簽,指向最新版本,但無(wú)法保證版本的穩(wěn)定性(可能隨時(shí)更新)。生產(chǎn)環(huán)境中必須指定具體版本標(biāo)簽,如 python:3.9.18-alpine 而非 python:latest。
標(biāo)簽命名規(guī)則:通常包含 “主版本。次版本。補(bǔ)丁版本 - 系統(tǒng)版本”,如 node:18.18.2-alpine3.18。
4.2.4 關(guān)注鏡像的安全性
- 查看鏡像的漏洞掃描報(bào)告(Docker Hub 提供鏡像的安全掃描功能);
- 避免使用未知來(lái)源的社區(qū)鏡像,防止包含惡意代碼;
- 定期更新鏡像,修復(fù)已知漏洞。
4.2.5 考慮鏡像的維護(hù)性
選擇維護(hù)活躍的鏡像,避免使用已停止更新的版本(如 Python 2.7 已停止維護(hù),應(yīng)避免使用)。可通過(guò) Docker Hub 查看鏡像的 “Last Updated” 時(shí)間,判斷維護(hù)狀態(tài)。
4.3 不同場(chǎng)景的鏡像選擇示例
| 應(yīng)用場(chǎng)景 | 推薦鏡像 | 選擇理由 |
|---|---|---|
| Python 微服務(wù)(生產(chǎn)) | python:3.9-alpine | 體積小、資源占用低,適合生產(chǎn)環(huán)境 |
| Python 開(kāi)發(fā)環(huán)境 | python:3.9-slim | 包含基礎(chǔ)工具鏈,便于調(diào)試 |
| Node.js 前端項(xiàng)目部署 | node:18-alpine | 輕量化,適合打包和運(yùn)行前端代碼 |
| Java Spring Boot 應(yīng)用 | openjdk:17-jdk-alpine | 體積小,支持 Spring Boot 3.x |
| Nginx 靜態(tài)資源托管 | nginx:alpine | 輕量級(jí),性能高,適合靜態(tài)資源部署 |
| MySQL 數(shù)據(jù)庫(kù)(測(cè)試) | mysql:5.7-alpine | 輕量化,適合測(cè)試環(huán)境 |
| MySQL 數(shù)據(jù)庫(kù)(生產(chǎn)) | mysql:8.0.36 | 完整版本,穩(wěn)定性高,支持生產(chǎn)環(huán)境特性 |
4.4 鏡像拉取的核心命令與實(shí)操
4.4.1 搜索鏡像
使用 docker search 命令搜索 Docker Hub 上的鏡像:
bash運(yùn)行:
# 搜索 Python 鏡像 docker search python # 篩選官方鏡像(--filter=is-official=true) docker search --filter=is-official=true python # 篩選星數(shù)≥1000的鏡像(--filter=stars=1000) docker search --filter=stars=1000 python
4.4.2 拉取鏡像
使用 docker pull 命令拉取鏡像,格式:docker pull 鏡像名:標(biāo)簽。
bash運(yùn)行:
# 拉取官方 Python 3.9-alpine 鏡像 docker pull python:3.9-alpine # 拉取指定版本的 Nginx 鏡像 docker pull nginx:1.25.3-alpine # 拉取私有倉(cāng)庫(kù)的鏡像(需先登錄) docker pull registry.example.com/my-app:v1.0
若不指定標(biāo)簽,默認(rèn)拉取 latest 標(biāo)簽:
bash運(yùn)行:
docker pull python # 等價(jià)于 docker pull python:latest
4.4.3 登錄私有鏡像倉(cāng)庫(kù)
拉取 / 推送私有鏡像前,需先登錄倉(cāng)庫(kù):
bash運(yùn)行:
# 登錄 Docker Hub docker login # 登錄私有倉(cāng)庫(kù) docker login registry.example.com
輸入用戶(hù)名和密碼后,登錄信息會(huì)保存在 ~/.docker/config.json 文件中。
4.5 鏡像的本地管理
4.5.1 查看本地鏡像
bash運(yùn)行:
# 查看所有本地鏡像
docker images
# 精簡(jiǎn)輸出格式(只顯示鏡像ID、名稱(chēng)、標(biāo)簽、大小)
docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}\t{{.Size}}"
# 查看鏡像的詳細(xì)信息
docker inspect python:3.9-alpine
4.5.2 重命名鏡像
使用 docker tag 命令為鏡像添加新標(biāo)簽(常用于推送鏡像到私有倉(cāng)庫(kù)):
bash運(yùn)行:
# 格式:docker tag 原鏡像名:標(biāo)簽 新鏡像名:標(biāo)簽 docker tag python:3.9-alpine registry.example.com/my-python:3.9-alpine
4.5.3 刪除鏡像
使用 docker rmi 命令刪除本地鏡像:
bash運(yùn)行:
# 刪除指定鏡像(通過(guò)鏡像名:標(biāo)簽) docker rmi python:3.9-alpine # 刪除指定鏡像(通過(guò)鏡像ID) docker rmi 1234567890ab # 強(qiáng)制刪除(鏡像被容器使用時(shí),需加 -f) docker rmi -f python:3.9-alpine # 刪除所有未使用的鏡像(清理空間) docker image prune -a
注意:刪除鏡像前,需先刪除基于該鏡像創(chuàng)建的容器(或強(qiáng)制刪除)。
4.5.4 查看鏡像構(gòu)建歷史
使用 docker history 命令查看鏡像的分層構(gòu)建歷史,可排查鏡像體積過(guò)大的原因:
bash運(yùn)行:
docker history python:3.9-alpine
4.5.5 運(yùn)行容器 / 退出容器 / 管理鏡像 / 啟動(dòng)已停止容器
(一)運(yùn)行容器
(docker run:基于鏡像創(chuàng)建 + 啟動(dòng)新容器,核心是「run 鏡像」)
1. 基礎(chǔ)語(yǔ)法
bash 運(yùn)行:
docker run [可選參數(shù)] <鏡像名/鏡像ID> [容器內(nèi)要執(zhí)行的命令]
- 鏡像名 / ID:必須指定(比如
ubuntu:20.04、python:3.9-slim,或鏡像 ID 如f8c79dc85f05); - 可選參數(shù):控制容器的運(yùn)行方式(交互式、后臺(tái)、命名、端口映射等);
- 容器內(nèi)命令:可選,比如
bash(進(jìn)入終端)、python app.py(運(yùn)行腳本)。
2. 常用示例(從簡(jiǎn)單到復(fù)雜)
| 場(chǎng)景 | 命令示例 | 說(shuō)明 |
|---|---|---|
| 最簡(jiǎn)運(yùn)行(前臺(tái)) | docker run ubuntu:20.04 | 基于 ubuntu:20.04 鏡像創(chuàng)建容器,執(zhí)行鏡像默認(rèn)命令(通常是 bash),但無(wú)終端交互,運(yùn)行后立即退出 |
| 交互式運(yùn)行(常用) | docker run -it ubuntu:20.04 bash | -it:-i(交互式輸入)+-t(分配終端),進(jìn)入容器的 bash 終端,可執(zhí)行命令 |
| 后臺(tái)運(yùn)行(守護(hù)態(tài)) | docker run -d --name my-ubuntu ubuntu:20.04 sleep 3600 | -d:后臺(tái)運(yùn)行;--name:給容器命名(避免隨機(jī)名稱(chēng));sleep 3600:容器后臺(tái)運(yùn)行 1 小時(shí) |
| 端口映射 + 后臺(tái)運(yùn)行 | docker run -d -p 8080:80 --name my-nginx nginx | -p 8080:80:主機(jī) 8080 端口映射到容器 80 端口,訪(fǎng)問(wèn)主機(jī) 8080 = 訪(fǎng)問(wèn)容器 80 |
3. 關(guān)鍵參數(shù)解釋
-it:必選(交互式操作),缺一則無(wú)法進(jìn)入容器終端;-d:后臺(tái)運(yùn)行(守護(hù)進(jìn)程),容器在后臺(tái)執(zhí)行,不占用當(dāng)前終端;--name:自定義容器名(如my-app),否則 Docker 會(huì)隨機(jī)生成名稱(chēng);-p:端口映射(主機(jī)端口:容器端口),對(duì)外暴露容器服務(wù);-v:目錄掛載(主機(jī)目錄:容器目錄),實(shí)現(xiàn)主機(jī)和容器文件共享(如-v /host/data:/container/data)。
(二)退出容器
退出容器的核心是區(qū)分「是否停止容器」,取決于你運(yùn)行容器的方式(前臺(tái) / 后臺(tái))。
1. 場(chǎng)景 1:交互式容器(-it 前臺(tái)運(yùn)行,比如 docker run -it ubuntu bash)
| 退出方式 | 命令 / 操作 | 效果 |
|---|---|---|
| 停止容器并退出 | 在容器終端輸入 exit | 容器停止運(yùn)行,回到 Linux 主機(jī)終端,容器狀態(tài)變?yōu)?nbsp;exited |
| 不停止容器并退出 | 按快捷鍵 Ctrl + P → Q | 容器繼續(xù)后臺(tái)運(yùn)行(狀態(tài) up),僅退出容器終端,回到 Linux 主機(jī)終端 |
2. 場(chǎng)景 2:后臺(tái)容器(-d 運(yùn)行,比如 docker run -d my-nginx)
后臺(tái)容器本身不占用終端,無(wú)需 “退出”,若要操作 / 停止:
bash 運(yùn)行:
# 先進(jìn)入后臺(tái)容器的終端(可選) docker exec -it my-nginx bash # 進(jìn)入后可執(zhí)行命令,退出用 exit(僅退出終端,容器仍運(yùn)行) # 停止后臺(tái)容器(徹底“退出”容器運(yùn)行) docker stop my-nginx # 按容器名停止;也可用容器ID:docker stop <容器ID>
(三)“啟動(dòng)已停止的容器”
docker run 是創(chuàng)建新容器(每次 run 都會(huì)生成新容器),而已停止的容器(比如 exit 后的容器)需要用 docker start 啟動(dòng),這才是 “運(yùn)行已有容器” 的正確方式。
1. 先查看所有容器(找到已停止的容器)
bash 運(yùn)行:
docker ps -a # -a:顯示所有容器(運(yùn)行中+已停止) # 輸出示例: # CONTAINER ID IMAGE COMMAND STATUS NAMES # abc123 ubuntu:20.04 "bash" Exited (0) 5min ago my-ubuntu
2. 啟動(dòng)已停止的容器(「運(yùn)行容器」的正確方式)
bash 運(yùn)行:
# 語(yǔ)法:docker start [可選參數(shù)] <容器名/容器ID> docker start my-ubuntu # 啟動(dòng)名為my-ubuntu的容器(后臺(tái)運(yùn)行) docker start -i my-ubuntu # -i:交互式啟動(dòng)(前臺(tái)運(yùn)行,可輸入命令)
3. 重啟容器(停止 + 啟動(dòng))
bash 運(yùn)行:
docker restart my-ubuntu # 重啟容器(無(wú)論當(dāng)前是否運(yùn)行)
(四)刪除容器 / 鏡像
1. 刪除容器(需先停止,或強(qiáng)制刪除)
bash 運(yùn)行:
# 先停止容器 docker stop my-ubuntu # 刪除容器 docker rm my-ubuntu # 強(qiáng)制刪除運(yùn)行中的容器(不推薦,除非緊急) docker rm -f my-ubuntu # 批量刪除所有已停止容器(常用) docker rm $(docker ps -aq --filter status=exited)
2. 刪除鏡像(需先刪除基于該鏡像的所有容器)
bash 運(yùn)行:
# 先查看鏡像 docker images # 輸出鏡像名、標(biāo)簽、ID # 示例:REPOSITORY TAG IMAGE ID CREATED SIZE # ubuntu 20.04 f8c79dc85f05 2 hours ago 72.8MB # 刪除鏡像(語(yǔ)法:docker rmi <鏡像名:標(biāo)簽/鏡像ID>) docker rmi ubuntu:20.04 # 按名稱(chēng)+標(biāo)簽刪除 docker rmi f8c79dc85f05 # 按鏡像ID刪除 # 強(qiáng)制刪除被容器引用的鏡像(不推薦,先刪容器) docker rmi -f ubuntu:20.04
五、實(shí)戰(zhàn):將自己的代碼運(yùn)行在 Docker 容器中
掌握了鏡像的選擇和拉取后,接下來(lái)進(jìn)入核心實(shí)戰(zhàn)環(huán)節(jié):將自己的代碼打包成鏡像,并在容器中運(yùn)行。本節(jié)將講解通用流程,并提供多語(yǔ)言示例,確保你能直接落地。
5.1 前提準(zhǔn)備:Docker 環(huán)境安裝與驗(yàn)證
5.1.1 安裝 Docker
Linux(Ubuntu/Debian):
bash運(yùn)行:
# 更新軟件源 sudo apt update # 安裝依賴(lài) sudo apt install -y ca-certificates curl gnupg lsb-release # 添加 Docker 官方 GPG 密鑰 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg # 添加 Docker 軟件源 echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 安裝 Docker sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io # 啟動(dòng) Docker 服務(wù) sudo systemctl start docker # 設(shè)置開(kāi)機(jī)自啟 sudo systemctl enable docker # 將當(dāng)前用戶(hù)加入 docker 組(避免每次使用 sudo) sudo usermod -aG docker $USER # 重新登錄生效 logout
Windows/macOS:下載 Docker Desktop(https://www.docker.com/products/docker-desktop/),安裝后打開(kāi)即可,內(nèi)置 Docker Engine、Docker Compose 等工具。
5.1.2 驗(yàn)證 Docker 安裝
bash運(yùn)行:
# 查看 Docker 版本 docker --version # 運(yùn)行 hello-world 容器(驗(yàn)證環(huán)境是否正常) docker run hello-world
若輸出 “Hello from Docker!”,說(shuō)明 Docker 安裝成功。
5.2 通用流程:代碼容器化的核心步驟
無(wú)論使用哪種編程語(yǔ)言,代碼容器化的核心流程都包含以下 5 步:
- 整理代碼與依賴(lài);
- 編寫(xiě) Dockerfile;
- 構(gòu)建 Docker 鏡像;
- 啟動(dòng)容器運(yùn)行代碼;
- 驗(yàn)證與調(diào)試。
5.2.1 步驟 1:整理代碼與依賴(lài)
將代碼和依賴(lài)清單放在同一個(gè)目錄(稱(chēng)為 “Docker 上下文目錄”),避免冗余文件(如日志、緩存、編譯產(chǎn)物),減少鏡像體積。
依賴(lài)清單的常見(jiàn)形式:
- Python:
requirements.txt; - Node.js:
package.json/package-lock.json; - Java:
pom.xml(Maven)/build.gradle(Gradle); - Go:
go.mod/go.sum。
5.2.2 步驟 2:編寫(xiě) Dockerfile(核心)
Dockerfile 是鏡像構(gòu)建腳本,定義了鏡像的構(gòu)建步驟。Dockerfile 是無(wú)后綴的純文本文件(無(wú) .txt/.sh 等后綴),默認(rèn)文件名是 Dockerfile(首字母大寫(xiě),行業(yè)通用規(guī)范,小寫(xiě) dockerfile 也可,但不推薦);若需區(qū)分環(huán)境(如開(kāi)發(fā) / 生產(chǎn)),也可自定義命名(如 Dockerfile.dev/Dockerfile.prod),構(gòu)建時(shí)需手動(dòng)指定文件名。
不同系統(tǒng)創(chuàng)建 Dockerfile 的方法
1. Linux/macOS(終端操作)
直接通過(guò)終端命令創(chuàng)建空的 Dockerfile,或用編輯器編輯:
bash 運(yùn)行:
# 1. 創(chuàng)建空的 Dockerfile(最快捷) touch Dockerfile # 2. 編輯 Dockerfile(選其一) vim Dockerfile # 用 vim 編輯(需會(huì) vim 基本操作) nano Dockerfile # 用 nano 編輯(更簡(jiǎn)單,新手推薦) code Dockerfile # 用 VS Code 編輯(需安裝 VS Code)
其他操作(自定義Dockerfile文件生成位置):
1. 確定當(dāng)前所在文件夾
執(zhí)行以下命令,終端會(huì)輸出絕對(duì)路徑(比如 /home/yourname/project),這是你當(dāng)前的位置:
bash 運(yùn)行:
pwd # 打印當(dāng)前工作目錄(Print Working Directory)
2. 方式 1:指定目錄創(chuàng)建 Dockerfile(推薦,先切換目錄再創(chuàng)建)
步驟:先 cd 到目標(biāo)文件夾,再創(chuàng)建 Dockerfile,確保文件落在預(yù)期位置。
bash 運(yùn)行:
# 示例:想把Dockerfile創(chuàng)建在 /opt/my-docker-project 目錄下 # 1. 切換到目標(biāo)目錄(如果目錄不存在,先創(chuàng)建:mkdir -p /opt/my-docker-project) cd /opt/my-docker-project # 2. 確認(rèn)已切換成功(可選) pwd # 輸出應(yīng)是 /opt/my-docker-project # 3. 創(chuàng)建空的Dockerfile touch Dockerfile # 4. 驗(yàn)證文件是否存在(可選) ls # 會(huì)看到 Dockerfile 列在輸出中
3. 方式 2:直接指定路徑創(chuàng)建(無(wú)需切換目錄)
如果不想 cd 到目標(biāo)目錄,可直接通過(guò)「絕對(duì) / 相對(duì)路徑」創(chuàng)建 Dockerfile,比如:
bash 運(yùn)行:
# 絕對(duì)路徑創(chuàng)建:直接指定 Dockerfile 的完整保存路徑 touch /opt/my-docker-project/Dockerfile # 相對(duì)路徑創(chuàng)建:基于當(dāng)前目錄的子目錄(比如當(dāng)前在 /home/yourname,想創(chuàng)建到 ./docker 子目錄) mkdir -p ./docker # 先創(chuàng)建子目錄(如果不存在) touch ./docker/Dockerfile
4. 驗(yàn)證 Dockerfile 的位置(避免建錯(cuò)路徑)
bash 運(yùn)行:
# 查看文件的絕對(duì)路徑(最直觀(guān)) realpath Dockerfile # 若在目標(biāo)目錄,輸出如 /opt/my-docker-project/Dockerfile # 或查看指定路徑下的文件 ls /opt/my-docker-project/ # 看是否有 Dockerfile
2. Windows 系統(tǒng)
Windows 需注意避免自動(dòng)添加 .txt 后綴,推薦 3 種方式:
方式 1:記事本手動(dòng)創(chuàng)建
- 右鍵桌面 / 項(xiàng)目目錄 → 新建 → 文本文檔;
- 打開(kāi)記事本,輸入內(nèi)容后點(diǎn)擊「文件 → 另存為」;
- 「文件名」填
Dockerfile(無(wú)引號(hào)),「保存類(lèi)型」選「所有文件」,「編碼」選UTF-8,點(diǎn)擊保存; - 刪除自動(dòng)生成的 .txt 文件(若有)。
方式 2:PowerShell/CMD 命令打開(kāi)終端,進(jìn)入目標(biāo)目錄,執(zhí)行:
powershell
# Windows PowerShell New-Item Dockerfile -ItemType File # 或 CMD 命令 type nul > Dockerfile
方式 3:編輯器(VS Code/Notepad++)
- 打開(kāi) VS Code → 新建文件(Ctrl+N);
- 直接命名為
Dockerfile(無(wú)后綴); - 保存到目標(biāo)目錄(Ctrl+S)。
Dockerfile內(nèi)容的核心指令:
| 指令 | 作用 |
|---|---|
| FROM | 指定基礎(chǔ)鏡像(必須是第一行),如 python:3.9-alpine |
| WORKDIR | 設(shè)置容器內(nèi)的工作目錄(避免文件散落) |
| COPY | 把本地文件復(fù)制到容器內(nèi)(格式:COPY 本地路徑 容器路徑) |
| ADD | 類(lèi)似 COPY,支持解壓壓縮包、下載遠(yuǎn)程文件 |
| RUN | 構(gòu)建鏡像時(shí)執(zhí)行的命令(如安裝依賴(lài)、編譯代碼) |
| ENV | 設(shè)置環(huán)境變量 |
| EXPOSE | 聲明容器暴露的端口(僅提示,不實(shí)際映射) |
| CMD | 容器啟動(dòng)時(shí)執(zhí)行的命令(只能有一個(gè),多寫(xiě)會(huì)覆蓋) |
| ENTRYPOINT | 容器啟動(dòng)的入口命令(與 CMD 配合使用,優(yōu)先級(jí)更高) |
| VOLUME | 聲明數(shù)據(jù)卷(用于持久化數(shù)據(jù)) |
| USER | 指定后續(xù)命令的執(zhí)行用戶(hù) |
Dockerfile 編寫(xiě)原則:
- 盡量減少分層:將多個(gè)
RUN命令合并為一個(gè)(用&&連接),減少鏡像層數(shù); - 清理緩存:安裝依賴(lài)后清理緩存文件(如
apt clean、pip cache purge),減小鏡像體積; - 使用
.dockerignore文件:排除不需要復(fù)制到容器的文件(如.git、node_modules、__pycache__)。
5.2.3 步驟 3:構(gòu)建 Docker 鏡像
使用 docker build 命令構(gòu)建鏡像,格式:docker build -t 鏡像名:標(biāo)簽 上下文路徑。
參數(shù)說(shuō)明:
-t:給鏡像打標(biāo)簽(方便識(shí)別);.:上下文路徑(當(dāng)前目錄,Docker 會(huì)讀取該目錄下的所有文件用于構(gòu)建);--no-cache:不使用緩存(強(qiáng)制重新構(gòu)建所有層,用于調(diào)試)。
5.2.4 步驟 4:?jiǎn)?dòng)容器運(yùn)行代碼
使用 docker run 命令啟動(dòng)容器,核心參數(shù):
-p:端口映射(宿主機(jī)端口:容器端口),如-p 8080:5000;-d:后臺(tái)運(yùn)行容器;--name:給容器命名;-v:掛載數(shù)據(jù)卷(本地目錄:容器目錄);--env:設(shè)置容器環(huán)境變量;--restart:容器重啟策略(如always,容器崩潰后自動(dòng)重啟)。
5.2.5 步驟 5:驗(yàn)證與調(diào)試
- 查看容器運(yùn)行狀態(tài):
docker ps; - 訪(fǎng)問(wèn)應(yīng)用:
curl http://localhost:8080; - 查看容器日志:
docker logs 容器名; - 進(jìn)入容器內(nèi)部調(diào)試:
docker exec -it 容器名 /bin/sh; - 查看容器詳細(xì)信息:
docker inspect 容器名。
5.3 多語(yǔ)言實(shí)戰(zhàn)示例
5.3.1 示例 1:Python Flask 應(yīng)用容器化
項(xiàng)目結(jié)構(gòu)(在Linux主機(jī)中創(chuàng)建)
my-python-app/ ├── app.py # 業(yè)務(wù)代碼 ├── requirements.txt # 依賴(lài)清單 ├── Dockerfile # 鏡像構(gòu)建腳本 └── .dockerignore # 忽略文件
代碼文件
app.py

python文件內(nèi)容:
from flask import Flask
import os
app = Flask(__name__)
# 讀取環(huán)境變量
APP_NAME = os.getenv("APP_NAME", "Docker Python App")
@app.route('/')
def hello():
return f"Hello from {APP_NAME}! My code is running in Docker container."
if __name__ == '__main__':
# 綁定 0.0.0.0,容器外可訪(fǎng)問(wèn)
app.run(host='0.0.0.0', port=5000)
requirements.txt
flask==2.3.3

.dockerignore
# Git 相關(guān) .git .gitignore # Python 編譯/虛擬環(huán)境 __pycache__/ *.pyc *.pyo *.pyd venv/ .venv/ # 敏感/本地配置 .env .env.* # 編輯器/系統(tǒng)文件 .idea/ .vscode/ .DS_Store # 日志/臨時(shí)文件 *.log tmp/
使用
touch .dockerignore
創(chuàng)建,因?yàn)?開(kāi)頭的文件是隱藏文件,所以創(chuàng)建后是看不到的,可以用:
ls -a

查看文件夾中的所有文件,看到輸出有.dockerignore即可。如果需要向ignore中寫(xiě)入內(nèi)容,可以通過(guò)文本編輯器vim或nano實(shí)現(xiàn):(打開(kāi)nano,將要寫(xiě)入的內(nèi)容粘貼進(jìn)去,粘貼完成后,按 Ctrl+O 保存,這時(shí)底部會(huì)出現(xiàn)保存的文件名,再按enter鍵完成保存。接下來(lái)按 Ctrl+X 退出 nano。)
nano .dockerignore

Dockerfile
FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt && pip cache purge COPY . . ENV APP_NAME="My Python Docker App" EXPOSE 5000 CMD ["python", "app.py"]
使用:touch Dockerfile構(gòu)建
【注:雖然后面沒(méi)有手動(dòng)執(zhí)行 docker pull 命令,但鏡像拉取的動(dòng)作在 docker build 階段被自動(dòng)觸發(fā)了—— 核心是 Dockerfile 里的 FROM 指令,Docker 會(huì)在構(gòu)建時(shí)自動(dòng)完成 “檢查本地鏡像→缺失則拉取” 的流程?!傅葍r(jià)于 docker pull python:3.9-slim」的操作】
構(gòu)建與運(yùn)行
bash運(yùn)行:
# 構(gòu)建鏡像 docker build -t my-python-app:v1 . # 啟動(dòng)容器(端口映射 8080:5000,后臺(tái)運(yùn)行) docker run -p 8080:5000 -d --name my-python-container my-python-app:v1 # 驗(yàn)證 curl http://localhost:8080 # 輸出:Hello from My Python Docker App! My code is running in Docker container. # 查看日志 docker logs my-python-container
如果構(gòu)建過(guò)程中卡住了,可以通過(guò)Ctrl+C結(jié)束進(jìn)程,通過(guò):
docker builder prune -f
清理 Docker 構(gòu)建緩存。如果之前構(gòu)建過(guò) my-python-app:v1 鏡像,想刪除后重新構(gòu)建,執(zhí)行:
# 刪除指定鏡像 docker rmi my-python-app:v1 # 若鏡像被容器引用,先刪除容器再刪鏡像: docker rm -f flask-app && docker rmi my-python-app:v1
之后再運(yùn)行構(gòu)建代碼,構(gòu)建完成:

運(yùn)行容器:
docker run -d -p 5000:5000 --name flask-app my-python-app:v1
在瀏覽器頂部訪(fǎng)問(wèn):http://localhost:5000,即可查看到運(yùn)行結(jié)果

如果使用后想停止運(yùn)行容器,可以使用docker ps查看容器列表
# 僅顯示運(yùn)行中的容器 docker ps # 或查看所有容器(包括已停止的) docker ps -a
輸出示例(關(guān)鍵看 NAMES 列是 flask-app,PORTS 列是 0.0.0.0:5000->5000/tcp):

臨時(shí)停止容器(保留容器,可重啟)
如果只是想停止運(yùn)行,但后續(xù)還想重啟(比如修改代碼后重新啟動(dòng)),bash 運(yùn)行:
# 方式1:用容器名稱(chēng)停止(推薦,直觀(guān)) docker stop flask-app # 方式2:用容器ID停止(替換為你的容器ID,比如 abc123456789) docker stop abc123456789

停止后,再次執(zhí)行 docker ps 會(huì)看不到該容器,docker ps -a 能看到狀態(tài)變?yōu)?nbsp;Exited (0)。
重啟已停止的容器(臨時(shí)停止后想恢復(fù)運(yùn)行)
bash 運(yùn)行:
# 用名稱(chēng)重啟 docker start flask-app # 用ID重啟 docker start abc123456789
4. 徹底停止并刪除容器(無(wú)需保留)
如果確認(rèn)后續(xù)不需要該容器,可直接停止并刪除,bash 運(yùn)行:
# 方式1:先停止再刪除(穩(wěn)妥) docker stop flask-app && docker rm flask-app # 方式2:強(qiáng)制刪除運(yùn)行中的容器(無(wú)需先停止,快捷) docker rm -f flask-app
清理關(guān)聯(lián)資源(可選)
刪除鏡像(如果后續(xù)不需要該鏡像)連構(gòu)建的 my-python-app:v1 鏡像也刪除。bash 運(yùn)行:
# 先確保容器已刪除,再刪鏡像 docker rmi my-python-app:v1 # 若鏡像被其他容器引用,強(qiáng)制刪除 docker rmi -f my-python-app:v1
5.4 進(jìn)階優(yōu)化:讓容器運(yùn)行更實(shí)用
5.4.1 數(shù)據(jù)卷(Volume):持久化數(shù)據(jù)
容器內(nèi)的數(shù)據(jù)默認(rèn)存儲(chǔ)在可寫(xiě)層中,容器刪除后數(shù)據(jù)會(huì)丟失。數(shù)據(jù)卷用于將容器內(nèi)的目錄掛載到宿主機(jī)或命名卷,實(shí)現(xiàn)數(shù)據(jù)持久化。
綁定掛載(本地目錄 → 容器目錄)
bash運(yùn)行:
# 將本地 ./data 目錄掛載到容器 /app/data 目錄 docker run -p 8080:5000 -v $(pwd)/data:/app/data my-python-app:v1
命名卷(Docker 管理的卷)
bash運(yùn)行:
# 創(chuàng)建命名卷 docker volume create my-data # 掛載命名卷到容器 docker run -p 8080:5000 -v my-data:/app/data my-python-app:v1 # 查看卷信息 docker volume inspect my-data
5.4.2 Docker Compose:多容器管理
當(dāng)應(yīng)用依賴(lài)多個(gè)服務(wù)(如 MySQL、Redis)時(shí),使用 Docker Compose 可一鍵啟動(dòng)所有服務(wù)。
示例 docker-compose.yml
yaml
version: '3.8'
services:
# 應(yīng)用服務(wù)
app:
build: .
ports:
- "8080:5000"
environment:
- APP_NAME=My Python Docker App
- REDIS_HOST=redis
- MYSQL_HOST=mysql
- MYSQL_USER=root
- MYSQL_PASSWORD=123456
- MYSQL_DB=test
volumes:
- ./data:/app/data
depends_on:
- redis
- mysql
restart: always
# Redis 服務(wù)
redis:
image: redis:alpine
ports:
- "6379:6379"
volumes:
- redis-data:/data
restart: always
# MySQL 服務(wù)
mysql:
image: mysql:5.7
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=test
volumes:
- mysql-data:/var/lib/mysql
restart: always
# 命名卷
volumes:
redis-data:
mysql-data:
啟動(dòng) / 停止服務(wù)
bash運(yùn)行:
# 啟動(dòng)所有服務(wù)(后臺(tái)運(yùn)行) docker-compose up -d # 查看服務(wù)狀態(tài) docker-compose ps # 查看日志 docker-compose logs app # 停止服務(wù) docker-compose down # 停止服務(wù)并刪除數(shù)據(jù)卷 docker-compose down -v
5.4.3 熱重載(開(kāi)發(fā)環(huán)境)
開(kāi)發(fā)環(huán)境中,修改代碼后希望容器自動(dòng)重啟,無(wú)需重新構(gòu)建鏡像。
Python 示例(使用 flask-reload)
修改 Dockerfile 的啟動(dòng)命令:
CMD ["python", "-m", "flask", "run", "--host=0.0.0.0", "--port=5000", "--reload"]
啟動(dòng)容器時(shí)掛載代碼目錄:
bash運(yùn)行:
docker run -p 8080:5000 -v $(pwd):/app my-python-app:v1
修改本地 app.py 后,F(xiàn)lask 會(huì)自動(dòng)重啟,無(wú)需重啟容器。
5.5 調(diào)試與排錯(cuò):容器運(yùn)行常見(jiàn)問(wèn)題解決
5.5.1 容器啟動(dòng)后訪(fǎng)問(wèn)不通
- 檢查端口映射:確認(rèn)
docker run命令使用了-p參數(shù),且宿主機(jī)端口未被占用; - 檢查代碼綁定地址:確保服務(wù)綁定
0.0.0.0,而非127.0.0.1(容器內(nèi) 127.0.0.1 僅容器自身可訪(fǎng)問(wèn)); - 檢查防火墻:宿主機(jī)防火墻是否放行映射的端口;
- 查看容器日志:
docker logs 容器名,排查代碼報(bào)錯(cuò)。
5.5.2 依賴(lài)安裝失敗
- 檢查網(wǎng)絡(luò):容器是否能訪(fǎng)問(wèn)外網(wǎng)(可進(jìn)入容器
ping baidu.com測(cè)試); - 使用國(guó)內(nèi)源:在 Dockerfile 中配置國(guó)內(nèi)源(如 pip、npm、maven 國(guó)內(nèi)源);
- 檢查依賴(lài)版本:依賴(lài)版本與基礎(chǔ)鏡像不兼容(如 Python 3.9 安裝不支持的包版本)。
5.5.3 鏡像體積過(guò)大
- 使用多階段構(gòu)建:僅保留運(yùn)行所需文件;
- 清理緩存:安裝依賴(lài)后清理緩存(如
apt clean、pip cache purge); - 合并
RUN命令:減少鏡像層數(shù); - 使用輕量化基礎(chǔ)鏡像(如 alpine 版本)。
5.5.4 容器崩潰自動(dòng)重啟
- 設(shè)置重啟策略:
docker run --restart=always; - 查看崩潰原因:
docker logs 容器名,排查代碼或依賴(lài)問(wèn)題; - 限制容器資源:
docker run --memory=512m --cpus=1,避免資源耗盡。
六、總結(jié)
Docker 作為容器化技術(shù)的標(biāo)桿,已成為現(xiàn)代軟件開(kāi)發(fā)和運(yùn)維的必備工具。其核心價(jià)值在于解決了環(huán)境一致性、資源隔離、快速部署等核心痛點(diǎn),為微服務(wù)架構(gòu)、CI/CD 流水線(xiàn)、云原生應(yīng)用提供了堅(jiān)實(shí)的基礎(chǔ)。本文從 Docker 的定義、使用價(jià)值、核心概念、鏡像選擇、代碼容器化實(shí)戰(zhàn)等維度,全面講解了 Docker 的核心知識(shí)。
總結(jié)核心要點(diǎn):
- Docker 是輕量級(jí)的容器化平臺(tái),核心是 “一次構(gòu)建,到處運(yùn)行”;
- Docker 容器是宿主機(jī)上的受限制進(jìn)程,基于鏡像運(yùn)行,鏡像為只讀模板;
- 選擇鏡像時(shí)應(yīng)優(yōu)先官方、輕量化、指定版本的鏡像;
- 代碼容器化的核心是編寫(xiě) Dockerfile,通過(guò)
docker build構(gòu)建鏡像,docker run啟動(dòng)容器; - 結(jié)合 Docker Compose 可輕松管理多服務(wù)依賴(lài),提升部署效率。
未來(lái),Docker 將繼續(xù)與 Kubernetes(k8s) 深度融合,成為云原生技術(shù)的核心組件。掌握 Docker 不僅能提升開(kāi)發(fā) / 部署效率,更是進(jìn)入云原生領(lǐng)域的必備技能。
附錄:Docker 常用命令速查表
鏡像管理
| 命令 | 作用 |
|---|---|
| docker search <name> | 搜索鏡像 |
| docker pull <name>:<tag> | 拉取鏡像 |
| docker images | 查看本地鏡像 |
| docker rmi <name>:<tag> | 刪除鏡像 |
| docker tag <old> <new> | 重命名鏡像 |
| docker history <name> | 查看鏡像構(gòu)建歷史 |
| docker image prune -a | 刪除未使用的鏡像 |
容器管理
| 命令 | 作用 |
|---|---|
| docker run <options> <image> | 啟動(dòng)容器 |
| docker ps | 查看運(yùn)行中的容器 |
| docker ps -a | 查看所有容器 |
| docker stop <name/id> | 停止容器 |
| docker start <name/id> | 啟動(dòng)已停止的容器 |
| docker restart <name/id> | 重啟容器 |
| docker rm <name/id> | 刪除容器 |
| docker exec -it <name/id> sh | 進(jìn)入容器內(nèi)部 |
| docker logs <name/id> | 查看容器日志 |
| docker inspect <name/id> | 查看容器 / 鏡像詳細(xì)信息 |
| docker container prune | 刪除已停止的容器 |
Docker Compose
| 命令 | 作用 |
|---|---|
| docker-compose up | 啟動(dòng)服務(wù) |
| docker-compose up -d | 后臺(tái)啟動(dòng)服務(wù) |
| docker-compose down | 停止并刪除服務(wù) |
| docker-compose ps | 查看服務(wù)狀態(tài) |
| docker-compose logs <service> | 查看服務(wù)日志 |
| docker-compose build | 構(gòu)建服務(wù)鏡像 |
| docker-compose restart <service> | 重啟服務(wù) |
最后
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
k8s和Docker關(guān)系簡(jiǎn)單說(shuō)明
這篇文章主要介紹了k8s和Docker關(guān)系簡(jiǎn)單說(shuō)明,本文利于圖文講解的很透徹,有需要的同學(xué)可以研究下2021-03-03
Docker數(shù)據(jù)卷的核心原理與管理邏輯解讀
Docker數(shù)據(jù)卷實(shí)現(xiàn)容器與宿主機(jī)的數(shù)據(jù)持久化,分為綁定掛載(手動(dòng)指定路徑)和管理卷(自動(dòng)管理),前者適合開(kāi)發(fā)環(huán)境,后者適用于生產(chǎn)環(huán)境,還支持多容器共享、備份遷移及清理,保障數(shù)據(jù)安全與資源高效利用2025-08-08
skywalking容器化部署docker鏡像構(gòu)建k8s從測(cè)試到可用
這篇文章主要為大家介紹了skywalking容器化部署docker鏡像構(gòu)建k8s從測(cè)試到可用的構(gòu)建部署過(guò)程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03
使用Docker容器運(yùn)行Mysql實(shí)戰(zhàn)記錄
這篇文章主要給大家介紹了關(guān)于使用Docker容器運(yùn)行Mysql的相關(guān)資料,助大家更好的理解和學(xué)習(xí)使用docker,感興趣的朋友可以了解下,需要的朋友可以參考下2023-09-09
如何查看docker run啟動(dòng)參數(shù)命令(推薦)
這篇文章主要介紹了如何查看docker run啟動(dòng)參數(shù)命令,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
docker部署管理工具portainer-ce的實(shí)現(xiàn)
Portainer是一個(gè)可視化的容器鏡像的圖形管理工具,利用Portainer可以輕松構(gòu)建,管理和維護(hù)Docker環(huán)境,本文主要介紹了docker部署管理工具portainer-ce的實(shí)現(xiàn),感興趣的可以了解一下2023-08-08

