首頁 > 軟體

Docker映象與容器的匯入匯出操作實踐

2022-03-26 19:00:02

一、前言

隨著容器技術的發展,現在很多的應用程式系統都會選擇使用docker容器進行部署,但是有時候使用docker容器進行部署的時候會遇到問題,比如說我們的應用程式裡面需要依賴其他第三方的映象,如果這時候伺服器是在內網不能連線外網的情況下,那麼就無法部署了。基於這種情況,docker官方支援docker映象和容器的匯入和匯出,我們可以在一臺能夠聯網的機器上面編譯映象,然後匯出映象或者容器,最後把匯出的映象或者容器上傳到內網伺服器,然後在匯入映象或者容器,這樣就可以了。

映象和容器的匯入、匯出操作主要涉及到下面的幾個命令:save、load、export、import。

演示過程中我們是在本地生成映象或者容器,然後把映象或者容器匯出,最後上傳到阿里雲伺服器演示匯入功能。

我們使用VS 2019建立一個ASP.NET Core MVC的專案,新增Dockerfile檔案:

# 使用執行時映象
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim
# 設定工作目錄
WORKDIR /app
# 把目錄下的內容都複製到當前目錄下
COPY . .
# 暴露80埠
EXPOSE 80
# 執行映象入口命令和可執行檔名稱
ENTRYPOINT ["dotnet", "DockerDemo.dll"]

然後釋出專案。我們檢視現有的docker映象

可以看到:現在只有兩個.net core的映象。我們生成映象:

docker build -t dockerdemo .

如下圖所示:

檢視生成後的映象

然後我們根據生成的映象來執行容器,首先檢視現有的容器:

可以看到這時沒有任何容器。我們執行容器:

可以看到:容器已經執行成功了。

二、docker映象的匯入和匯出

1、docker映象的匯出

涉及到的命令:

docker save [options]  images [images...]

我們使用上面的映象來演示映象的匯出:

docker save -o dockerdemo.tar  dockerdemo

如下圖所示:

這裡匯出的時候指定了匯出後檔案的路徑,如果不指定路徑,預設是當前資料夾。

或者也可以使用下面的命令匯出:

docker save > dockerdemo.tar dockerdemo

其中-o和>表示輸出到檔案,dockerdemo.tar為匯出的目標檔案,dockerdemo為源映象名。

我們檢視本地是否有了匯出後的檔案:

可以看到目錄下面已經有了剛才匯出的檔案。

2、docker映象的匯入

我們首先使用XFtp把上面匯出的映象檔案上傳到阿里雲伺服器

然後進入檔案所在的目錄

我們檢視阿里雲伺服器上面有哪些映象:

從上圖中看出:現在阿里雲伺服器上面沒有任何的映象。

涉及到的匯入命令load

docker load [options]

接下來我們匯入剛才上傳的映象。

docker load -i dockerdemo.tar

如下圖所示:

或者也可以使用下面的命令

docker load < dockerdemo.tar

其中-i(i即imput)和<表示從檔案輸入。上面的兩個命令都會成功匯入映象以及相關後設資料,包括tag資訊。

匯入後檢視映象:

可以看到有了我們剛才匯入的映象。匯入了映象以後就可以根據映象執行容器,最後執行應用程式。

三、docker容器的匯入和匯出

接下來我們演示容器的匯入和匯出。

1、docker容器的匯出

涉及到的命令export。

docker export [options]  container

我們把上面生成的容器匯出:

docker export -o D:containersdockerdemocontainer.tar dockerdemo

如下圖所示:

其中,-o表示輸出的檔案,這裡指定了輸出的路徑,如果沒有指定路徑,則預設生成到當前資料夾。dockerdemocontainer.tar為目標檔案,dockerdemo為源容器名。

我們檢視目錄下面是否生成了匯出的容器:

2、docker容器的匯入

我們首先把匯出的容器使用XFTP上傳到阿里雲伺服器。

涉及到的匯入命令import。

docker import [options] file|URL|- [REPOSITORY[:TAG]]

如下圖所示

我們匯入剛才上傳的容器

docker import [options] file|URL|- [REPOSITORY[:TAG]]

dockerdemocontainer.tar表示要匯入的容器,dockerdemo:imp表示匯入後的映象名稱,imp表示給匯入的映象打tag。

如下圖所示

然後我們檢視映象:

可以看到這時有我們剛才匯入的映象了,匯入的映象tag為imp。

四、總結

下面我們來總結一下映象和容器匯入匯出的區別:

  • 映象匯入是一個複製的過程,容器匯入是將當前容器變成一個新的映象。
  • docker save命令儲存的是映象(image),docker export命令儲存的是容器(container)。
  • export命令匯出的tar檔案略小於save命令匯出的。
  • 因為export匯出的是容器,export匯出的檔案在import匯入時,無法保留映象所有的歷史(即每一層layer資訊),不能進行回滾操作。而save是根據映象來的,所以匯入時可以完整保留下每一層layer資訊。如下圖所示:dockerdemo:latest是save匯出load匯入的,dockerdemo:imp是export匯出import匯入的。

  • docker load不能對匯入的映象重新命名,而docker import匯入可以為映象指定新名稱。例如,上面匯入的時候指定dockerdeom:imp。

對於是使用映象匯入匯出還是使用容器匯入匯出該如何選擇呢?有下面兩點建議:

  • 若是隻想備份image,使用save和load。
  • 若是在啟動容器後,容器內容有變化,需要備份,則使用export和import。 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com