什麼是映像檔?

說明

既然 容器 (container) 是一個隔離的程序,那它的檔案和設定從哪裡來?你該如何分享這些環境呢?

這就是容器映像檔 (container images) 的用途。容器映像檔是一個標準化的套件,包含了執行容器所需的所有檔案、二進位檔、函式庫與設定。

PostgreSQL 映像檔為例,該映像檔封裝了資料庫二進位檔、設定檔以及其他依賴項。若是 Python 網頁應用程式,則會包含 Python 執行環境、你的應用程式碼以及所有依賴項。

關於映像檔有兩個重要原則

  1. 映像檔是不可變的 (immutable)。映像檔一旦建立,就無法修改。你只能建立新的映像檔或在其之上新增變更。

  2. 容器映像檔由「層 (layers)」組成。每一層都代表了一組檔案系統的變更,包括新增、移除或修改檔案。

這兩個原則讓你能夠擴充或增加現有的映像檔。例如,如果你正在建置 Python 應用程式,你可以從 Python 映像檔 開始,並新增額外的層來安裝應用程式的依賴項並加入你的程式碼。這讓你能夠專注於應用程式本身,而不是 Python 環境。

尋找映像檔

Docker Hub 是預設的全球市集,用於儲存與散佈映像檔。它擁有超過 10 萬個由開發人員建立的映像檔,你可以直接在本地執行。你可以搜尋 Docker Hub 的映像檔,並直接透過 Docker Desktop 執行它們。

Docker Hub 提供各種由 Docker 支援與認可的映像檔,稱為「Docker 信任內容 (Docker Trusted Content)」。這些映像檔提供全託管的服務,或是作為你個人映像檔的絕佳起點。其中包括:

例如,RedisMemcached 是幾種熱門且可立即使用的 Docker 官方映像檔。你可以下載這些映像檔並在幾秒鐘內啟動這些服務。此外也有基礎映像檔,例如 Node.js Docker 映像檔,你可以將其作為起點並加入你自己的檔案與設定。

試試看

在本實作中,你將學習如何使用 Docker Desktop GUI 搜尋並拉取 (pull) 容器映像檔。

搜尋並下載映像檔

  1. 開啟 Docker Desktop 儀表板,並在左側導覽選單中選擇 Images (映像檔) 檢視。

    A screenshot of the Docker Desktop Dashboard showing the image view on the left sidebar
  2. 點選 Search images to run (搜尋映像檔以執行) 按鈕。如果沒看到該按鈕,請選擇畫面頂端的全域搜尋列

    A screenshot of the Docker Desktop Dashboard showing the search ta
  3. Search (搜尋) 欄位中輸入「welcome-to-docker」。搜尋完成後,選擇 docker/welcome-to-docker 映像檔。

    A screenshot of the Docker Desktop Dashboard showing the search results for the docker/welcome-to-docker image
  4. 點選 Pull (拉取) 以下載該映像檔。

了解映像檔資訊

下載映像檔後,你可以透過 GUI 或 CLI 了解該映像檔的更多詳細資訊。

  1. 在 Docker Desktop 儀表板中,選擇 Images (映像檔) 檢視。

  2. 選擇 docker/welcome-to-docker 映像檔以開啟詳細資訊。

    A screenshot of the Docker Desktop Dashboard showing the images view with an arrow pointing to the docker/welcome-to-docker image
  3. 映像檔詳細資訊頁面會呈現關於該映像檔的層、安裝的套件與函式庫,以及任何已發現的弱點資訊。

    A screenshot of the image details view for the docker/welcome-to-docker image

請依照指示使用 CLI 搜尋並拉取 Docker 映像檔,以檢視其分層。

搜尋並下載映像檔

  1. 開啟終端機,並使用 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 上可用相關映像檔的資訊。

  2. 使用 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
    

    每一行都代表下載的映像檔中的不同層。請記住,每一層都是一組檔案系統的變更,並提供了映像檔的功能。

了解映像檔資訊

  1. 使用 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。

    映像檔大小

    此處顯示的映像檔大小反映的是映像檔的解壓縮後大小,而非各層的下載大小。

  2. 使用 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 映像檔的分層架構。

其他資源

下列資源將幫助你深入了解如何探索、尋找與建置映像檔:

下一步

既然你已經了解了映像檔的基礎知識,接下來該了解如何透過 Registry (登錄庫) 散佈映像檔了。什麼是 Registry(登錄檔)?

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.