CodeGym /Adesua ahorow /Docker SELF /Dockerfile:創建和文件結構

Dockerfile:創建和文件結構

Docker SELF
等級 13 , 課堂 1
開放

2.1 Dockerfile 的基礎概念

Dockerfile 是一個 文字檔案,包含一系列指令,Docker 會利用它們來建立映像檔。它是個「食譜」,描述從基底層到最終狀態,映像應該如何組合起來。理解 Dockerfile 的結構和生成過程對於高效使用 Docker 很重要。

Dockerfile 的基本概念:

  1. 幂等性: Dockerfile 裡的指令應該是幂等的——重複執行會給出同樣的結果。
  2. 順序性: 指令會從上到下依序執行。順序非常重要,因為每個指令都會創建映像的新層。
  3. 分層結構: 幾乎每條指令都會新增一個映像層。這些層會被緩存,從而讓構建過程更優化。

Dockerfile 的結構:

Dockerfile 是由一些指令組成的,每條指令都有特定功能。以下是主要的指令:

  1. FROM: 指定用作基底的映像,將用來建立新的映像。
  2. MAINTAINER: 定義 Dockerfile 的作者(過時了,但對於信息來說還是有幫助)。
  3. RUN: 在容器裡執行命令並生成新的層。
  4. COPY: 將檔案和目錄從構建的上下文複製到容器的檔案系統中。
  5. ADD: 複製檔案和目錄,支持解壓存檔案和透過 URL 下載檔案。
  6. WORKDIR: 設置接下來指令的工作目錄。
  7. ENV: 設置環境變數。
  8. CMD: 定義預設命令,當容器啟動時執行。
  9. ENTRYPOINT: 設定容器啟動時執行的命令,支持傳遞參數。
  10. EXPOSE: 宣告容器使用的埠。
  11. VOLUME: 創建一個掛載點用於外部卷。

2.2 創建 Dockerfile

創建 Dockerfile 的範例

我們來看一個用於 Node.js 網頁應用的一個簡單 Dockerfile 範例。

步驟 1: 創建基本的 Dockerfile

在你的專案根目錄下創建一個名為 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 執行以下操作:

  1. FROM node:14: 使用 14 版本的官方 Node.js 映像作為基礎。
  2. WORKDIR /app: 設定工作目錄以供後續命令使用。
  3. COPY package*.json ./: 將 package.jsonpackage-lock.json 文件複製到工作目錄。
  4. RUN npm install: 安裝 package.json 中定義的依賴項。
  5. COPY . .: 將專案的所有文件複製到容器的工作目錄。
  6. EXPOSE 3000: 指定應用程序將使用端口 3000。
  7. CMD ["node", "app.js"]: 定義啟動應用程序的命令。

步驟 2: 構建映像

創建 Dockerfile 後,通過 docker build 命令構建一個映像:

Terminal

docker build -t my-node-app .

該命令將使用當前目錄的 Dockerfile 創建一個名為 my-node-app 的映像。

步驟 3: 啟動容器

使用 docker run 命令基於創建的映像運行一個容器:

Terminal

docker run -d -p 3000:3000 my-node-app

這個範例會在後台啟動容器,將容器的 3000 端口映射到主機的 3000 端口。現在,你可以通過 http://localhost:3000 訪問應用程序。

2.3 Dockerfile 進階指令

1. 設定環境變數

你可以使用 ENV 指令來設定在容器中可用的環境變數。

dockerfile

ENV NODE_ENV=production

2. 使用多個 RUN 指令

有時將多個指令結合成一個 RUN 指令是更好的選擇,可以減少圖層數量、減小映像大小並加速構建。

dockerfile

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。

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"]
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION