1.1 Docker Images 基礎
Docker Images (Docker 映像檔) 是用於 Docker 容器的模板。它們包含運行應用程式所需的一切:代碼、庫、依賴項、工具及配置文件。了解什麼是 Docker Images,以及它們的結構如何,對於有效利用 Docker 非常重要。
Docker Image 是一個 不可變
的模板,用來創建容器。它包含應用在隔離環境中運行所需的一切組件。當你啟動一個容器時,Docker 創建一個映像檔的實例並啟動它。
Docker Images 的關鍵特性:
- 不可變性: Docker 映像檔是不可變的。對容器中的任何更改都不會影響原始映像檔。要更改映像檔的內容,必須創建新的映像檔。
- 分層結構: Docker Images 由多個層組成。每一層都是相較於前一層的更改。這使得可以通過重複利用層來有效地使用空間。
- 唯一標識: 每個映像檔都有一個唯一的標識符 (SHA256-hash),還可以有一個或多個標籤(tag),這讓管理映像檔版本變得更容易。
Docker Images 的結構:
Docker Images 擁有分層結構,每一層都是檔案系統。這些層存儲在 Docker 的快取中,並且可以被其他映像檔重複使用。分層結構使得 Docker 映像檔變得輕量且高效。例如,第一層是操作系統,第二層是 Python,第三層是你的應用程式。
Docker Images 結構的主要組成部分:
- 基礎層 (Base Layer): 映像檔的初始層,通常作為創建其他映像檔的基礎。例如,這可能是像 Ubuntu 或 Alpine Linux 這樣的最小版本的操作系統。
- 中間層 (Intermediate Layers): 這些層是基於在 Dockerfile 中執行的指令創建的(例如,安裝套件、複製文件等)。每一層都為前一層添加更改。
- 最終層 (Final Layer): 基於 CMD、ENTRYPOINT 指令或容器內的更改創建的最後一層稱為 "容器層"。這一層是臨時的,只在容器運行期間存在。
1.2 Docker Images 的層是如何運作的
每一層的 Docker Image 就是相較於前一層的改變集合。當 Docker 建立 Image 時,它會執行 Dockerfile 中的每條指令,並為每個改變新增一個新層。
建立層的範例:
- 基礎 Image:我們從一個基礎 Image 開始,例如
ubuntu:20.04
。這會是第一層。 - 安裝套件:指令
RUN apt-get update && apt-get install -y python3
會建立一個安裝好 Python 的新層。 - 複製檔案:指令
COPY . /app
會新增一層,將應用程式的檔案加入進來。 - 設定工作目錄:指令
WORKDIR /app
會新增一層,設定接下來指令的工作目錄。
使用層的好處:
- 重複使用:層可以被其他的 Image 重複使用。例如,如果兩個 Image 使用同一個基礎層,Docker 只會下載一次,節省空間和時間。
- 快取功能:Docker 會快取層,這能加速建立 Image 的過程。如果層沒有改變,Docker 會直接從快取使用,而不是重新建立。
- 模組化:層狀結構讓 Image 的開發變得模組化。你可以更新或更改單獨的層,而不需要影響整個 Image。
Docker Images 的識別與標籤:
每一個 Docker Image 都會有一個獨特的哈希值 (SHA256),這是根據 Image 的內容與所有層生成的。為了更方便管理與版本控制,Docker Images 還可以帶有標籤 (tags)。
Image 識別的範例:
以下指令會顯示系統中所有的 Image,包括它們的 repository、標籤、ID 和大小:
docker images
1.3 使用 Docker Images
Docker 提供了很多操作映像的指令。以下是主要的幾個:
- 創建映像:
docker build
- 從映像啟動容器:
docker run
- 列出所有映像:
docker images
- 刪除映像:
docker rmi
- 在 Docker Hub 搜尋映像:
docker search
- 從 Docker Hub 拉取映像:
docker pull
- 推送映像到 Docker Hub:
docker push
創建及使用 Docker Image 的範例:
1. 創建 Dockerfile:
# 使用基礎映像 Ubuntu
FROM ubuntu:20.04
# 安裝 Python
RUN apt-get update && apt-get install -y python3
# 將應用程序文件複製到容器中
COPY . /app
# 設置工作目錄
WORKDIR /app
# 指定應用程序啟動指令
CMD ["python3", "app.py"]
2. 編譯映像:
以下指令將使用目前目錄中的 Dockerfile 創建一個名為 my_python_app
的映像:
docker build -t my_python_app .
3. 從映像啟動容器:
使用以下指令從創建的映像 my_python_app
啟動一個後台模式的容器:
docker run -d my_python_app
GO TO FULL VERSION