目錄
docker build 筆記
1. 路徑解析
2. 關鍵注意事項
2.?docker compose up -d
核心區別對比
常見工作流
補充說明
1. 功能區別
2. 協作關系
場景 1:Compose 自動調用 Build
場景 2:先 Build 后 Compose
3. 關鍵區別
4. 為什么需要協作?
5. 實際工作流示例
開發階段
生產部署
總結
docker build
?和?docker compose up -d
?是 Docker 生態系統中兩個不同的命令,用于不同的場景。以下是它們的核心區別:
docker build 筆記
docker build -t my-app:1.0 .?
是的,docker build -t my-app:1.0 .
?命令會自動讀取當前目錄下的?Dockerfile
(文件名必須嚴格為?Dockerfile
,大小寫敏感)。以下是詳細說明:
1. 路徑解析
-
.
?表示“當前目錄”:
命令最后的?.
?是構建上下文(Build Context)的路徑,Docker 會將該目錄下的所有文件(遞歸)發送給 Docker 守護進程(daemon),并在其中查找?Dockerfile
。-
例如:若在?
/home/user/project
?下執行命令,則默認讀取?/home/user/project/Dockerfile
。
-
-
自定義?
Dockerfile
?路徑:
如果?Dockerfile
?不在當前目錄,或使用了其他文件名,需通過?-f
?指定:docker build -t my-app:1.0 -f ./subdir/CustomDockerfile .
-
此時仍以?
.
(當前目錄)為構建上下文,但使用指定文件作為構建指令。
-
2. 關鍵注意事項
-
Dockerfile
?必須存在:
如果當前目錄沒有?Dockerfile
,會報錯:ERROR: Cannot locate specified Dockerfile: Dockerfile
-
構建上下文的影響:
-
Docker 會將上下文目錄的所有文件發送給守護進程(可能導致傳輸量大)。
-
通過?
.dockerignore
?文件可排除不需要的文件(類似?.gitignore
)。
-
-
鏡像標簽(
-t
):
-t my-app:1.0
?為生成的鏡像指定名稱和標簽,后續可通過?docker run my-app:1.0
?運行。
2.?docker compose up -d
作用:
根據?docker-compose.yml
?文件啟動和管理多容器應用(包括構建鏡像、創建網絡、掛載卷等)。
關鍵特點:
-
輸入:需要一個?
docker-compose.yml
?文件(定義多容器服務的配置)。 -
輸出:啟動一個或多個容器(基于現有鏡像或自動構建鏡像)。
-
典型用途:
-
啟動復雜的多服務應用(如 Web + 數據庫 + Redis)。
-
管理容器間的依賴關系和網絡配置。
-
一鍵啟停整個應用環境。
-
示例:
docker compose up -d # 根據 docker-compose.yml 啟動所有服務(-d 表示后臺運行)
核心區別對比
特性 | docker build | docker compose up -d |
---|---|---|
作用對象 | 單個鏡像 | 多容器應用(服務、網絡、卷等) |
輸入文件 | Dockerfile | docker-compose.yml |
輸出結果 | 生成鏡像 | 啟動容器(可能包含構建鏡像的步驟) |
典型場景 | 構建自定義鏡像 | 部署完整的多服務環境 |
依賴關系 | 不涉及其他容器 | 可定義服務間的依賴(如數據庫先啟動) |
網絡/卷管理 | 無 | 自動創建網絡和卷 |
常見工作流
-
開發階段:
-
用?
docker build
?構建鏡像。 -
用?
docker compose up
?測試多服務交互。
-
-
生產部署:
-
直接使用?
docker compose up -d
(如果?docker-compose.yml
?中已定義鏡像來源)。
-
-
調試:
-
docker build
?失敗時檢查?Dockerfile
。 -
docker compose up
?失敗時檢查服務配置或日志。
-
補充說明
-
如果?
docker-compose.yml
?中包含?build
?字段,docker compose up
?會自動構建鏡像(相當于隱式調用?docker build
)。 -
-d
?參數表示“后臺運行”(detached mode),不加則會附著到容器日志輸出。 -
推薦組合使用:先?
build
?測試鏡像,再通過?compose
?編排完整環境。
1. 功能區別
命令/工具 | docker build | docker compose |
---|---|---|
核心職責 | 構建鏡像(從?Dockerfile ?生成鏡像) | 編排多容器應用(定義和運行多服務環境) |
輸入文件 | Dockerfile | docker-compose.yml |
操作對象 | 單個鏡像 | 多個容器、網絡、存儲卷等資源 |
典型場景 | 將代碼打包成可運行的鏡像 | 一鍵啟動完整的應用棧(如 Web + DB + Redis) |
2. 協作關系
場景 1:Compose 自動調用 Build
如果?docker-compose.yml
?中定義了?build
?字段,運行?docker compose up
?時會自動觸發?docker build
:
services:webapp:build: . # 根據當前目錄的 Dockerfile 構建鏡像ports:- "8000:8000"
執行命令:
docker compose up -d # 自動構建鏡像并啟動容器
場景 2:先 Build 后 Compose
-
手動構建鏡像:
docker build -t my-app:1.0 .
-
在 Compose 中引用已有鏡像:
services:webapp:image: my-app:1.0 # 直接使用已構建的鏡像ports:- "8000:8000"
-
啟動服務:
docker compose up -d
3. 關鍵區別
維度 | docker build | docker compose |
---|---|---|
層級 | 底層命令(鏡像構建) | 高層工具(應用編排) |
依賴 | 只需要?Dockerfile | 依賴?docker-compose.yml ?和鏡像 |
是否管理容器 | 否 | 是(創建、啟動、停止容器) |
網絡/卷 | 不涉及 | 自動管理網絡和存儲卷 |
4. 為什么需要協作?
-
開發效率:
docker compose
?通過一個命令即可完成鏡像構建(如果需要)和容器啟動,簡化流程。 -
環境一致性:
docker-compose.yml
?可定義完整的服務依賴(如數據庫先于應用啟動),避免手動操作錯誤。 -
復用性:
構建好的鏡像(docker build
?生成)可被多個 Compose 項目共享。
5. 實際工作流示例
開發階段
-
編寫?
Dockerfile
?定義應用環境。 -
編寫?
docker-compose.yml
?配置服務依賴。 -
運行:
docker compose up --build # 強制重新構建鏡像并啟動
生產部署
-
構建生產鏡像:
docker build -t my-app:prod .
-
通過 Compose 部署:
# docker-compose.prod.yml services:app:image: my-app:prod # 直接使用構建好的鏡像deploy:replicas: 3
-
啟動:
docker compose -f docker-compose.prod.yml up -d
總結
-
docker build
?是構建鏡像的工具,docker compose
?是編排多容器應用的工具。 -
Compose?可以依賴 Build(通過?
build:
?字段),但也可以直接使用已存在的鏡像(通過?image:
?字段)。 -
兩者結合使用能實現從代碼到完整應用環境的無縫管理。