最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在Docker環(huán)境中如何運(yùn)行自己的代碼

 更新時(shí)間:2026年03月10日 09:44:50   作者:鉉鉉這波能秀  
這篇文章主要介紹了在Docker環(huán)境中如何運(yùn)行自己的代碼實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一、什么是 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é):

  1. 一個(gè)鏡像可以創(chuàng)建多個(gè)容器(一個(gè)類(lèi)可以實(shí)例化多個(gè)對(duì)象);
  2. 容器啟動(dòng)時(shí),Docker 會(huì)加載鏡像的所有只讀層,并在頂部創(chuàng)建一個(gè)可寫(xiě)層;
  3. 容器停止后,可寫(xiě)層的數(shù)據(jù)不會(huì)丟失,重啟容器后仍可訪(fǎng)問(wèn);
  4. 刪除容器時(shí),可寫(xiě)層會(huì)被刪除,鏡像的只讀層不會(huì)受影響;
  5. 可通過(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、nodenginx、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 步:

  1. 整理代碼與依賴(lài);
  2. 編寫(xiě) Dockerfile;
  3. 構(gòu)建 Docker 鏡像;
  4. 啟動(dòng)容器運(yùn)行代碼;
  5. 驗(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)建

  1. 右鍵桌面 / 項(xiàng)目目錄 → 新建 → 文本文檔;
  2. 打開(kāi)記事本,輸入內(nèi)容后點(diǎn)擊「文件 → 另存為」;
  3. 「文件名」填 Dockerfile(無(wú)引號(hào)),「保存類(lèi)型」選「所有文件」,「編碼」選 UTF-8,點(diǎn)擊保存;
  4. 刪除自動(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++)

  1. 打開(kāi) VS Code → 新建文件(Ctrl+N);
  2. 直接命名為 Dockerfile(無(wú)后綴);
  3. 保存到目標(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ù)制到容器的文件(如 .gitnode_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-appPORTS 列是 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):

  1. Docker 是輕量級(jí)的容器化平臺(tái),核心是 “一次構(gòu)建,到處運(yùn)行”;
  2. Docker 容器是宿主機(jī)上的受限制進(jìn)程,基于鏡像運(yùn)行,鏡像為只讀模板;
  3. 選擇鏡像時(shí)應(yīng)優(yōu)先官方、輕量化、指定版本的鏡像;
  4. 代碼容器化的核心是編寫(xiě) Dockerfile,通過(guò) docker build 構(gòu)建鏡像,docker run 啟動(dòng)容器;
  5. 結(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)文章

  • Docker掛載資料卷保存MySQL數(shù)據(jù)

    Docker掛載資料卷保存MySQL數(shù)據(jù)

    這篇文章介紹了Docker掛載資料卷保存MySQL數(shù)據(jù)的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01
  • k8s和Docker關(guān)系簡(jiǎn)單說(shuō)明

    k8s和Docker關(guān)系簡(jiǎn)單說(shuō)明

    這篇文章主要介紹了k8s和Docker關(guān)系簡(jiǎn)單說(shuō)明,本文利于圖文講解的很透徹,有需要的同學(xué)可以研究下
    2021-03-03
  • Docker數(shù)據(jù)卷的核心原理與管理邏輯解讀

    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
  • Docker中限制CPU和內(nèi)存的使用的方法

    Docker中限制CPU和內(nèi)存的使用的方法

    在容器化的動(dòng)態(tài)世界中,Docker 已經(jīng)成為構(gòu)建、部署和管理容器化的關(guān)鍵工具應(yīng)用,設(shè)置適當(dāng)?shù)膬?nèi)存和 CPU 限制對(duì)于優(yōu)化 Docker 性能至關(guān)重要,確保每個(gè)容器在不使主機(jī)負(fù)擔(dān)過(guò)重的情況下獲得必要的資源,本文將深入探討有效設(shè)置這些限制的實(shí)用策略,需要的朋友可以參考下
    2025-01-01
  • skywalking容器化部署docker鏡像構(gòu)建k8s從測(cè)試到可用

    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)記錄

    使用Docker容器運(yùn)行Mysql實(shí)戰(zhàn)記錄

    這篇文章主要給大家介紹了關(guān)于使用Docker容器運(yùn)行Mysql的相關(guān)資料,助大家更好的理解和學(xué)習(xí)使用docker,感興趣的朋友可以了解下,需要的朋友可以參考下
    2023-09-09
  • 詳解Docker下nginx外掛配置和文件

    詳解Docker下nginx外掛配置和文件

    這篇文章主要介紹了Docker下nginx外掛配置和文件,啟動(dòng)容器、查看容器和停止容器的方式方法給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-01-01
  • 如何查看docker run啟動(dòng)參數(shù)命令(推薦)

    如何查看docker run啟動(dòng)參數(shù)命令(推薦)

    這篇文章主要介紹了如何查看docker run啟動(dòng)參數(shù)命令,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 使用Docker CE 還是 Docker EE

    使用Docker CE 還是 Docker EE

    這篇文章主要介紹了使用Docker CE 還是 Docker EE,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2007-06-06
  • docker部署管理工具portainer-ce的實(shí)現(xiàn)

    docker部署管理工具portainer-ce的實(shí)現(xiàn)

    Portainer是一個(gè)可視化的容器鏡像的圖形管理工具,利用Portainer可以輕松構(gòu)建,管理和維護(hù)Docker環(huán)境,本文主要介紹了docker部署管理工具portainer-ce的實(shí)現(xiàn),感興趣的可以了解一下
    2023-08-08

最新評(píng)論

双峰县| 鄂尔多斯市| 邻水| 九龙城区| 西乡县| 涪陵区| 曲松县| 固镇县| 泸定县| 维西| 芜湖县| 许昌市| 塘沽区| 滦平县| 安达市| 青州市| 阜南县| 龙州县| 利川市| 专栏| 玛纳斯县| 思南县| 喜德县| 新安县| 丰县| 马公市| 中宁县| 社会| 商水县| 蚌埠市| 黎川县| 青阳县| 永济市| 城步| 曲松县| 那曲县| 离岛区| 沙坪坝区| 绵阳市| 壶关县| 张家界市|