Rick's DevNotes
筆記關於我作品集
筆記類別
  • 全部
  • DockerDocker
  • NetworkNetwork
  • RxJSRxJS
  • NginxNginx
  • TypeScriptTypeScript
  • Data_Structure_And_AlgorithmData Structure And Algorithm
  • JavaScriptJavaScript
  • PostgreSQLPostgreSQL
  • ReactReact
  • GitGit

© 2026 Rick's DevNotes. All rights reserved.

# Container# Image

更新時間:2025/08/03

建立時間:2023/02/26

Docker 筆記 - 建立專案與製作 Image

假設我要建立一個 包含 React 的 Project,並且透過 Docker 來啟動,最後透過 Local 端連接,需要的步驟如下:

  1. 建立一個 Dockerfile
  2. 使用 Dockerfile 建立 Image
  3. 透過 Image 啟用 Container
  4. 透過瀏覽器連接到 Docker Container 內的 Nodejs

1. 建立 Dockerfile

Dockerfile 是 Docker 的一個檔案,其中包含了建立 Docker Image 所需的所有指令。使用 Dockerfile 可以將應用程式、服務、應用程序或任何軟體打包成 Container ,使它們可以在任何環境中運行,而不會受到該環境中的任何差異或限制。Dockerfile 指令由關鍵字、和參數構成,其中包括以下關鍵字:

  • FROM:指定 base Image 的 Docker Image。
  • COPY:從構建環境中複製文件或目錄到 Container 中。
  • WORKDIR:設置工作目錄,以指定 build Image 時使用的工作目錄。
  • RUN:在 Image 中運行指定的命令,用於安裝軟體、配置環境等。
  • CMD:指定 Container 啟動時要運行的命令或應用程序。

使用 Dockerfile 可以將這些指令結合在一起,定義 Image 中 Container 的所有屬性和配置。這樣可以確保 Image 在不同環境中的行為是可預測的,並且方便使用者部署和管理 Image 。

RUN : 用於在 Image 中建立一個新的 layer,用來執行命令,例如安裝套件、下載檔案等。當 Dockerfile 中的所有指令都執行完畢後,就會產生一個新的 Image。因此,RUN 通常用於在建立 Docker Image 時進行一些必要的系統配置和軟體安裝等操作,可以視為 Dockerfile 的編譯過程。

CMD : 則是用來設定 Image 執行時的預設命令。當使用者運行 Docker Container 時,可以透過參數覆蓋預設命令。若 Dockerfile 中沒有 CMD,使用者運行 Container 時必須額外指定要執行的命令。通常 CMD 會設定應用程式的啟動命令,例如 CMD ["node", "index.js"] 會設定預設啟動的是一個 Node.js 的應用程式。

什麼是 alpine?

alpine 是一種輕量級的 Linux 發行版,只包含了最基本的套件,可以用來建立最小化的 Docker Image 。而 node:alpine 則是基於 alpine 的 Image,並預先安裝了 Node.js 環境,可以直接在此 Image 上運行 Node.js 應用程式。使用 node:alpine 建立 Docker Image,可以大幅減少 Image 的大小,同時也提供了 Node.js 環境的基本套件和設定,方便開發者進行應用程式的開發和測試。

COPY 的用法

忽略不必要的文件和目錄

有些人會選擇在容器內部進行 npm install,而不是透過 COPY 方式將本地的 node_modules 搬到容器內,有可能是因為 1.跨平台相容性 2.版本一致性 3. Size 非常龐大,此時我們可以透過 .dockerignore 文件可以用來指定在 Image 在建構過程中要忽略複製到容器的文件和目錄。以下是使用 .dockerignore 的一個例子:

假設我們的專案結構如下:

我們希望在建立映像檔時排除 node_modules 目錄。可以在專案根目錄中創建一個 .dockerignore 文件,並將以下內容添加到文件中:

如此一來,建構 Docker Image 時,node_modules 目錄將不會被複製到容器內,保留容器中先前已經安裝的依賴關係。其他文件和目錄將根據 Dockerfile 中的 COPY 指令進行複製。

是否忽略 node_modules,具體的做法取決於專案的需求和開發團隊的偏好,有些場景可能仍然適合使用 COPY 方式複製本地的 node_modules。

2. 建立 Docker Image

如下方的指令,執行 docker build . 命令是為了在當前目錄下建立一個 Docker Image。其中 . 意味著指定當前目錄作為上下文(context)來建構 Image。在建構過程中,Docker 會執行每一個指令並建立出一個中間的容器,然後基於這個容器進行下一個指令,直到所有指令執行完畢建構出最終的 Image 並提供我們該 Image 的 ID 作為啟動的參數

3. & 4. 啟動並連接 Docker Container

此時我們就可以透過建構 Image 後所提供的 <image-id> 來啟動 Docker Container

上述指令有使用到 -p 參數,-p 可以將 Container 內的 Port 與 Local端上的 Port 進行連接,這個過程稱為 Container Port Mapping。30:3000 表示將 Local 30 port 映射到 Container 內的 3000 port。

這樣做的目的是將 Container 內的應用程式所使用的某個 Port 與 Local 端的某個 Port 進行綁定,使得我們可以透過 Local端上的指定 Port 來訪問 Container 內運行的應用程式。舉個例子,假設 Container 內的應用程式在 8080 Port 上運行,而我們希望通過 Local端 上的 8080 Port 訪問該應用程式。使用 -p 8080:8080,在 Local 端上使用瀏覽器訪問 http://localhost:8080 時,就相當於訪問了 Container 內運行的應用程式。

需要注意的是, Container 內的應用程式實際運行的 Port 可以是不同的,我們可以通過修改 Image 中的應用程式設定來調整。而 -p 參數則用於建立 Local Port 和 Container Port 之間的連接。


其他的 Docker 參數

指定 Image 的標籤(tag)

在 docker build 指令中,-t 是用於指定 Image 的標籤(tag)的選項。透過 -t 選項,可以為我們建立的 Image 指定一個易於識別的名稱,以方便後續使用該 Image 。以下是 -t 選項的用法:

其中,rick/nodejs 是我們為 Image 指定的名稱,可以自行命名,以便識別 Image 的用途、版本或其他相關資訊。透過 docker build -t rick/nodejs 就會建立一個名為 rick/nodejs 的 Image,可以在後續的指令中使用該名稱來引用這個 Image。

使用特定的 Dockerfile 名稱來建立 Image

一般情況下,Docker 會預設使用名稱為 Dockerfile 的檔案作為建構 Image 依據。然而,有時候我們可能需要使用不同的名稱來指定 Image 構建的指令檔案,例如當前目錄下有多個 Dockerfile,用於不同用途的 Image 構建,我們可以使用不同的檔案名稱來區分它們。這樣可以讓我們在同一個專案中擁有多個不同的 Image 構建配置。

若要使用特定名稱來建立 Image,我們可以使用 -f 或 --file 參數指定 Dockerfile 。

參考資料

  • Docker and Kubernetes: The Complete Guide