什麼是映像檔?
說明
既然 容器 (container) 是一個隔離的程序,那它的檔案和設定從哪裡來?你該如何分享這些環境呢?
這就是容器映像檔 (container images) 的用途。容器映像檔是一個標準化的套件,包含了執行容器所需的所有檔案、二進位檔、函式庫與設定。
以 PostgreSQL 映像檔為例,該映像檔封裝了資料庫二進位檔、設定檔以及其他依賴項。若是 Python 網頁應用程式,則會包含 Python 執行環境、你的應用程式碼以及所有依賴項。
關於映像檔有兩個重要原則
映像檔是不可變的 (immutable)。映像檔一旦建立,就無法修改。你只能建立新的映像檔或在其之上新增變更。
容器映像檔由「層 (layers)」組成。每一層都代表了一組檔案系統的變更,包括新增、移除或修改檔案。
這兩個原則讓你能夠擴充或增加現有的映像檔。例如,如果你正在建置 Python 應用程式,你可以從 Python 映像檔 開始,並新增額外的層來安裝應用程式的依賴項並加入你的程式碼。這讓你能夠專注於應用程式本身,而不是 Python 環境。
尋找映像檔
Docker Hub 是預設的全球市集,用於儲存與散佈映像檔。它擁有超過 10 萬個由開發人員建立的映像檔,你可以直接在本地執行。你可以搜尋 Docker Hub 的映像檔,並直接透過 Docker Desktop 執行它們。
Docker Hub 提供各種由 Docker 支援與認可的映像檔,稱為「Docker 信任內容 (Docker Trusted Content)」。這些映像檔提供全託管的服務,或是作為你個人映像檔的絕佳起點。其中包括:
- Docker 官方映像檔 (Docker Official Images) - 一組經過 Docker 審核的儲存庫,是大眾使用者的首選起點,也是 Docker Hub 上最安全的映像檔之一。
- Docker 驗證發布者 (Docker Verified Publishers) - 由商業發布者提供、經 Docker 驗證的高品質映像檔。
- Docker 贊助的開源專案 (Docker-Sponsored Open Source) - 由 Docker 透過其開源計畫所贊助的開源專案所發布與維護的映像檔。
例如,Redis 和 Memcached 是幾種熱門且可立即使用的 Docker 官方映像檔。你可以下載這些映像檔並在幾秒鐘內啟動這些服務。此外也有基礎映像檔,例如 Node.js Docker 映像檔,你可以將其作為起點並加入你自己的檔案與設定。
試試看
在本實作中,你將學習如何使用 Docker Desktop GUI 搜尋並拉取 (pull) 容器映像檔。
搜尋並下載映像檔
開啟 Docker Desktop 儀表板,並在左側導覽選單中選擇 Images (映像檔) 檢視。

點選 Search images to run (搜尋映像檔以執行) 按鈕。如果沒看到該按鈕,請選擇畫面頂端的全域搜尋列。

在 Search (搜尋) 欄位中輸入「welcome-to-docker」。搜尋完成後,選擇
docker/welcome-to-docker映像檔。

點選 Pull (拉取) 以下載該映像檔。
了解映像檔資訊
下載映像檔後,你可以透過 GUI 或 CLI 了解該映像檔的更多詳細資訊。
在 Docker Desktop 儀表板中,選擇 Images (映像檔) 檢視。
選擇 docker/welcome-to-docker 映像檔以開啟詳細資訊。

映像檔詳細資訊頁面會呈現關於該映像檔的層、安裝的套件與函式庫,以及任何已發現的弱點資訊。

請依照指示使用 CLI 搜尋並拉取 Docker 映像檔,以檢視其分層。
搜尋並下載映像檔
開啟終端機,並使用
docker search指令搜尋映像檔。docker search docker/welcome-to-docker您將會看到類似下方的輸出
NAME DESCRIPTION STARS OFFICIAL docker/welcome-to-docker Docker image for new users getting started w… 20此輸出會顯示關於 Docker Hub 上可用相關映像檔的資訊。
使用
docker pull指令拉取該映像檔。docker pull docker/welcome-to-docker您將會看到類似下方的輸出
Using default tag: latest latest: Pulling from docker/welcome-to-docker 579b34f0a95b: Download complete d11a451e6399: Download complete 1c2214f9937c: Download complete b42a2f288f4d: Download complete 54b19e12c655: Download complete 1fb28e078240: Download complete 94be7e780731: Download complete 89578ce72c35: Download complete Digest: sha256:eedaff45e3c78538087bdd9dc7afafac7e110061bbdd836af4104b10f10ab693 Status: Downloaded newer image for docker/welcome-to-docker:latest docker.io/docker/welcome-to-docker:latest每一行都代表下載的映像檔中的不同層。請記住,每一層都是一組檔案系統的變更,並提供了映像檔的功能。
了解映像檔資訊
使用
docker image ls指令列出你下載的映像檔。docker image ls您將會看到類似下方的輸出
REPOSITORY TAG IMAGE ID CREATED SIZE docker/welcome-to-docker latest eedaff45e3c7 4 months ago 29.7MB該指令會顯示目前系統中可用的 Docker 映像檔清單。
docker/welcome-to-docker的總大小約為 29.7MB。映像檔大小
此處顯示的映像檔大小反映的是映像檔的解壓縮後大小,而非各層的下載大小。
使用
docker image history指令列出該映像檔的層。docker image history docker/welcome-to-docker您將會看到類似下方的輸出
IMAGE CREATED CREATED BY SIZE COMMENT 648f93a1ba7d 4 months ago COPY /app/build /usr/share/nginx/html # buil… 1.6MB buildkit.dockerfile.v0 <missing> 5 months ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B <missing> 5 months ago /bin/sh -c #(nop) STOPSIGNAL SIGQUIT 0B <missing> 5 months ago /bin/sh -c #(nop) EXPOSE 80 0B <missing> 5 months ago /bin/sh -c #(nop) ENTRYPOINT ["/docker-entr… 0B <missing> 5 months ago /bin/sh -c #(nop) COPY file:9e3b2b63db9f8fc7… 4.62kB <missing> 5 months ago /bin/sh -c #(nop) COPY file:57846632accc8975… 3.02kB <missing> 5 months ago /bin/sh -c #(nop) COPY file:3b1b9915b7dd898a… 298B <missing> 5 months ago /bin/sh -c #(nop) COPY file:caec368f5a54f70a… 2.12kB <missing> 5 months ago /bin/sh -c #(nop) COPY file:01e75c6dd0ce317d… 1.62kB <missing> 5 months ago /bin/sh -c set -x && addgroup -g 101 -S … 9.7MB <missing> 5 months ago /bin/sh -c #(nop) ENV PKG_RELEASE=1 0B <missing> 5 months ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.25.3 0B <missing> 5 months ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B <missing> 5 months ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B <missing> 5 months ago /bin/sh -c #(nop) ADD file:ff3112828967e8004… 7.66MB此輸出會顯示所有的層、它們的大小,以及用於建立該層的指令。
檢視完整指令
如果你在指令中加入
--no-trunc旗標,你將能看到完整的指令。請注意,由於輸出是以表格格式呈現,較長的指令會導致輸出內容變得非常難以閱讀。
在本教學中,你搜尋並拉取了一個 Docker 映像檔。除了拉取映像檔外,你還了解了 Docker 映像檔的分層架構。
其他資源
下列資源將幫助你深入了解如何探索、尋找與建置映像檔:
- Docker 信任內容 (Docker trusted content)
- 探索 Docker Desktop 中的「映像檔 (Image)」檢視
- Docker 建置概述 (Docker Build overview)
- Docker Hub
下一步
既然你已經了解了映像檔的基礎知識,接下來該了解如何透過 Registry (登錄庫) 散佈映像檔了。
什麼是 Registry(登錄檔)?