基於已有容器構建 Docker 映象
通過前面的介紹,我們知道了Docker 映象是多個基於 UnionFS 的映象層依次掛載的結果,而容器的檔案系統則是在以只讀方式掛載映象後增加的一個可讀可寫的檔案系統複合而成。
Docker 中為我們提供了將容器中的這個可讀可寫的環境持久化為一個映象層的方法,即docker commit
。 docker commit
將容器修改的內容儲存為映象,我們可以把它理解為提交容器的更改。
1.生成變更後的映象
我們以上一節的 busybox 為例:
# 重新建立一個busybox容器
docker run --name busybox -d -i busybox
# 進入容器
docker exec -it busybox sh
# 做些更改,新建個檔案
echo 'something' > something
# 檢視變更後的目錄和檔案
ls
exit
退出容器後,使用docker commit
進行提交變更
[root@centos8 ~]# docker commit -m 'something' busybox
sha256:19da0182bca9305944f6a66b1331ff7394a915bc8982cf520660a883484699fc
-m
引數進行提交的註釋,用法類似 git。
執行 docker commit
將容器記錄成映象層的時候,會先暫停容器的執行,以保證容器內的檔案系統處於一個相對穩定的狀態,確保資料的一致性。提交映象更新後,docker images
2. 為映象命名
在上面的例子裡,我們發現提交容器更新後產生的映象並沒有 REPOSITORY 和 TAG 的內容,也就是說,這個新的映象還沒有名字。 Docker 為我們提供了一個為映象取名的命令,也就是 docker tag
命令。
docker tag 19da0182bca9 mybusybox:1.0
使用 docker tag
也能夠對已有的映象建立一個新的別名副本(舊的映象與名稱也會保留)。
docker tag mybusybox:1.0 mybusybox:latest
當然,我們可以在提交變更的時候同時命名映象
docker commit -m 'something' busybox mybusybox2:latest
3. 遷移映象
在我們將更新匯出為映象後,我們還可以開始遷移映象。
由於 Docker 是以集中的方式管理映象的,所以在遷移之前,我們要先從 Docker 中取出映象。docker save
命令可以將映象輸出,提供了一種讓我們儲存映象到 Docker 外部的方式。
# 將 something:latest映象,匯出到something-latest.tar
docker save -o ./something-latest.tar something:latest
-o
選項,用來指定輸出檔案
在映象匯出之後,我們就可以找到已經儲存映象內容的 something-latest.tar 這個檔案了。如果使用解壓軟體檢視其中的內容,會看到裡面其實就是映象所基於的幾個映象層的記錄檔案。
我們可以通過很多種方式將匯出的映象檔案複製到另一臺機器上,在這麼操作之後,我們就要將映象匯入到這臺新機器中執行的 Docker 中。
匯入映象用 docker load
命令即可。
Tips: 我們並不真的需要一臺新的機器,把當前環境中 Docker something 映象刪掉即可
docker image rm something:latest
docker load -i something-latest.tar
映象匯入後,我們就可以通過 docker images
看到它了,匯入的映象會延用原有的映象名稱。
4. 從容器直接匯出到映象壓縮包
使用 docker export
命令我們可以直接匯出容器,我們可以把它理解為 docker commit
與 docker save
的結合體。
下面我們從容器 busybox 中直接匯出映象包:
docker export -o ./something-export.tar busybox
需要注意的是,這種方式匯出的映象壓縮包不能使用docker load
的方式匯入,而應該使用 docker import
。使用 docker import
並非直接將容器匯入,而是將容器執行時的內容以映象的形式匯入。所以匯入的結果其實是一個映象,而不是容器。在 docker import
的引數裡,我們需要給這個映象命名。
docker import ./something-export.tar something:export
5. 小結
這一節我們介紹瞭如何通過 docker commit
工具,從容器快速生成 Docker 映象,在開發的過程中,使用 docker save
和 docker load
,或者是使用 docker export
和 docker import
都可以達到遷移容器或者映象的目的。但這種方式可維護性較差,後面的章節我們會學習如何使用 Dockerfile,從基礎映象來構建新的映象,這也是 Docker 官方推薦的方式。