將 Docker 容器打包為 Docker 映像

當我們以指定的 Docker 映像(Image)創建了一個 Docker 容器(Container)後,可以在容器中進行若干操作,但是如果此時刪掉容器再重啟時,一切又會回溯到映像中的原始內容。那要如何保存我們對容器進行的操作呢?

打包容器

如果要保存我們對容器進行的操作,我們可以在對容器進行了若干操作後,透過 docker commit 命令將容器打包為映像。具體的操作如下:

Bash
# 列出容器
$ docker ps

# 打包指定容器為映像
$ docker commit --author "Sean <[email protected]>" \
    --message "COMMIT MESSAGE" \
    --pause=false \
    --change "ENV DEBUG=true" \
    --change "ENTRYPOINT [\"/bin/bash\"]" \
    [CONTAINER_ID] [REPOSITORY:TAG]
    
# 列出映像
$ docker images
Bash

其中各個參數的說明如下:

  • --author:指定作者資訊
  • --message:添加提交訊息
  • --pause:是否在提交期間暫停容器(預設值為 true
  • --change:提交過程中套用 Dockerfile 指令。可以用來設置新的環境變數(ENV),或是入口(ENTRYPOINT)

載入映像

打包完後的映像會存在宿主機當中,其實這時候就可以透過 docker run 命令映像創建容器了。為了讓宿主機以外的機器也能夠使用映像,一般有兩種方式:

  • 託管服務:將映像上傳到具備容器映像託管服務的儲存庫如 Docker Hub、Google Container Registry (GCR)、Amazon Elastic Container Registry (ECR) 或 Azure Container Registry (ACR) 上。
  • 檔案共享:將映像打包為 .tar 壓縮檔案,可以在不同機器上轉移、備份與共享。

有鑑於並不是所有打包的映像都希望上傳到託管服務上,因此在這裡我們主要說明第二種方式。

Bash
# 打包映像
$ docker save --output my_image.tar [IMAGE]:[TAG]

# 載入映像
$ docker load --input my_image.tar

# 運行容器
$ docker run --detach [IMAGE]
Bash