4.6 其它製作映象的方式

除了標準的使用 Dockerfile 生成映象的方法外,由於各種特殊需求和歷史原因,還提供了一些其它方法用以生成映象。

4.6.1 從 rootfs 壓縮封裝匯入

格式:docker import [選項] <檔案>|<URL>|- [<倉庫名>[:<標籤>]]

壓縮封裝可以是本地檔案、遠端 Web 檔案,甚至是從標準輸入中得到。壓縮封裝將會在映象 / 目錄展開,並直接作為映象第一層送出。

比如我們想要建立一個 OpenVZ 的 Ubuntu 16.04 樣板的映象:

版本提示noble 對應 Ubuntu 24.04 LTS。實際用於生產環境時,應選擇仍在安全維護期內的發行版,並按團隊的基礎映象更新策略定期重建。

$ docker import \
    http://download.openvz.org/template/precreated/ubuntu-16.04-x86_64.tar.gz \
    openvz/ubuntu:16.04

Downloading from http://download.openvz.org/template/precreated/ubuntu-16.04-x86_64.tar.gz
sha256:412b8fc3e3f786dca0197834a698932b9c51b69bd8cf49e100c35d38c9879213

這條指令自動下載了 ubuntu-16.04-x86_64.tar.gz 檔案,並且作為根檔案系統展開匯入,並儲存為映象 openvz/ubuntu:16.04

匯入成功後,我們可以用 docker image ls 看到這個匯入的映象:

$ docker image ls openvz/ubuntu
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
openvz/ubuntu       16.04               412b8fc3e3f7        55 seconds ago      505MB

如果我們檢視其歷史的話,會看到描述中有匯入的檔案連結:

$ docker history openvz/ubuntu:16.04
IMAGE               CREATED              CREATED BY          SIZE                COMMENT
f477a6e18e98        About a minute ago                       214.9 MB            Imported from http://download.openvz.org/template/precreated/ubuntu-16.04-x86_64.tar.gz

4.6.2 Docker 映象的匯入和匯出 docker savedocker load

Docker 還提供了 docker savedocker load 指令,用以將映象儲存為一個檔案,然後傳輸到另一個位置上,再載入進來。這是在沒有 Docker Registry 時的做法,現在已經不推薦,映象遷移應該直接使用 Docker Registry,無論是直接使用 Docker Hub 還是使用內網私有 Registry 都可以。

儲存映象

使用 docker save 指令可以將映象儲存為歸檔檔案。

比如我們希望儲存這個 alpine 映象。

$ docker image ls alpine
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
alpine              latest              baa5d63471ea        5 weeks ago         4.803 MB

版本提示alpine:latest 為最新版本的 Alpine Linux。如果需要特定版本號(如 alpine:3.20),可以明確指定以確保可重現性。 儲存映象的指令為:

$ docker save alpine -o filename
$ file filename
filename: POSIX tar archive

這裡的 filename 可以為任意名稱甚至任意字尾名,但檔案的本質都是歸檔檔案

注意:如果同名則會覆蓋 (沒有警告)

若使用 gzip 壓縮:

$ docker save alpine | gzip > alpine-latest.tar.gz

然後我們將 alpine-latest.tar.gz 檔案複製到了另一個機器上,可以用下面這個指令載入映象:

$ docker load -i alpine-latest.tar.gz
Loaded image: alpine:latest

如果我們結合這兩個指令以及 ssh 甚至 pv 的話,利用 Linux 強大的通道,我們可以寫一個指令完成從一個機器將映象遷移到另一個機器,並且帶進度條的功能:

docker save <映象名> | bzip2 | pv | ssh <使用者名>@<主機名> 'cat | docker load'
第 32 页,共 196 页
使用 mdPress 构建