2.1 Dockerfile 的基礎概念
Dockerfile 是一個 文字檔案
,包含一系列指令,Docker 會利用它們來建立映像檔。它是個「食譜」,描述從基底層到最終狀態,映像應該如何組合起來。理解 Dockerfile 的結構和生成過程對於高效使用 Docker 很重要。
Dockerfile 的基本概念:
- 幂等性: Dockerfile 裡的指令應該是幂等的——重複執行會給出同樣的結果。
- 順序性: 指令會從上到下依序執行。順序非常重要,因為每個指令都會創建映像的新層。
- 分層結構: 幾乎每條指令都會新增一個映像層。這些層會被緩存,從而讓構建過程更優化。
Dockerfile 的結構:
Dockerfile 是由一些指令組成的,每條指令都有特定功能。以下是主要的指令:
- FROM: 指定用作基底的映像,將用來建立新的映像。
- MAINTAINER: 定義 Dockerfile 的作者(過時了,但對於信息來說還是有幫助)。
- RUN: 在容器裡執行命令並生成新的層。
- COPY: 將檔案和目錄從構建的上下文複製到容器的檔案系統中。
- ADD: 複製檔案和目錄,支持解壓存檔案和透過 URL 下載檔案。
- WORKDIR: 設置接下來指令的工作目錄。
- ENV: 設置環境變數。
- CMD: 定義預設命令,當容器啟動時執行。
- ENTRYPOINT: 設定容器啟動時執行的命令,支持傳遞參數。
- EXPOSE: 宣告容器使用的埠。
- VOLUME: 創建一個掛載點用於外部卷。
2.2 創建 Dockerfile
創建 Dockerfile 的範例
我們來看一個用於 Node.js 網頁應用的一個簡單 Dockerfile 範例。
步驟 1: 創建基本的 Dockerfile
在你的專案根目錄下創建一個名為 Dockerfile
的文件,並加入以下內容:
# 使用 Node.js 的基礎映像
FROM node:14
# 設定工作目錄
WORKDIR /app
# 複製 package.json 和 package-lock.json
COPY package*.json ./
# 安裝依賴
RUN npm install
# 複製專案的所有文件
COPY . .
# 指定應用程序將使用的端口
EXPOSE 3000
# 定義啟動應用的命令
CMD ["node", "app.js"]
這個 Dockerfile 執行以下操作:
- FROM node:14: 使用 14 版本的官方
Node.js
映像作為基礎。 - WORKDIR /app: 設定工作目錄以供後續命令使用。
- COPY package*.json ./: 將
package.json
和package-lock.json
文件複製到工作目錄。 - RUN npm install: 安裝
package.json
中定義的依賴項。 - COPY . .: 將專案的所有文件複製到容器的工作目錄。
- EXPOSE 3000: 指定應用程序將使用端口 3000。
- CMD ["node", "app.js"]: 定義啟動應用程序的命令。
步驟 2: 構建映像
創建 Dockerfile 後,通過 docker build
命令構建一個映像:
docker build -t my-node-app .
該命令將使用當前目錄的 Dockerfile 創建一個名為 my-node-app
的映像。
步驟 3: 啟動容器
使用 docker run
命令基於創建的映像運行一個容器:
docker run -d -p 3000:3000 my-node-app
這個範例會在後台啟動容器,將容器的 3000 端口映射到主機的 3000 端口。現在,你可以通過 http://localhost:3000
訪問應用程序。
2.3 Dockerfile 進階指令
1. 設定環境變數
你可以使用 ENV
指令來設定在容器中可用的環境變數。
ENV NODE_ENV=production
2. 使用多個 RUN
指令
有時將多個指令結合成一個 RUN
指令是更好的選擇,可以減少圖層數量、減小映像大小並加速構建。
RUN apt-get update && apt-get install -y \
curl \
git \
&& rm -rf /var/lib/apt/lists/*
有幫助! 如果指令無法放在一行,你可以使用 \
來換行。這樣會被解釋為單一指令。
有幫助! 如果想在一行內執行多個命令,可以使用 &&
:command1 && command2 && command3
。這樣能連續執行多個指令。
指令順序最佳化
為了有效利用 Docker 的 cache,先複製不常變的檔案(例如 package.json
),然後安裝相依套件,再添加其餘的專案檔案。
進階 Dockerfile 範例
對於較為複雜的專案,可能需要帶有額外設定的進階 Dockerfile。
# 使用最小化的 Node.js 基本映像
FROM node:14-alpine
# 設定工作目錄
WORKDIR /usr/src/app
# 複製 package.json 並安裝相依套件
COPY package*.json ./
RUN npm install --only=production
# 複製原始碼
COPY . .
# 指定工作埠
EXPOSE 8080
# 設定環境變數
ENV NODE_ENV=production
# 啟動應用程式
CMD ["node", "server.js"]
GO TO FULL VERSION