Docker:docker鏡像與容器的導入和導出

一、前言

隨着容器技術的發展,現在很多的應用程序系統都會選擇使用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:\containers\dockerdemocontainer.tar dockerdemo

如下圖所示:

其中,-o表示輸出的文件,這裏指定了輸出的路徑,如果沒有指定路徑,則默認生成到當前文件夾。dockerdemocontainer.tar爲目標文件,dockerdemo爲源容器名。

我們查看目錄下面是否生成了導出的容器:

2、docker容器的導入

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

涉及到的導入命令import。

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

如下圖所示

我們導入剛纔上傳的容器

docker import dockerdemocontainer.tar dockerdemo:imp

dockerdemocontainer.tar表示要導入的容器,dockerdemo:imp表示導入後的鏡像名稱,imp表示給導入的鏡像打tag。

如下圖所示

然後我們查看鏡像:

可以看到這時有我們剛纔導入的鏡像了,導入的鏡像tag爲imp。 

四、總結

下面我們來總結一下鏡像和容器導入導出的區別:

  1. 鏡像導入是一個複製的過程,容器導入是將當前容器變成一個新的鏡像。
  2. docker save命令保存的是鏡像(image),docker export命令保存的是容器(container)。
  3. export命令導出的tar文件略小於save命令導出的。
  4. 因爲export導出的是容器,export導出的文件在import導入時,無法保留鏡像所有的歷史(即每一層layer信息),不能進行回滾操作。而save是根據鏡像來的,所以導入時可以完整保留下每一層layer信息。如下圖所示:dockerdemo:latest是save導出load導入的,dockerdemo:imp是export導出import導入的。
  5. docker load不能對導入的鏡像重命名,而docker import導入可以爲鏡像指定新名稱。例如,上面導入的時候指定dockerdeom:imp。

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

  1. 若是隻想備份image,使用save和load。
  2. 若是在啓動容器後,容器內容有變化,需要備份,則使用export和import。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章