網站首頁 編程語言 正文
一、前言
隨著容器技術的發展,現在很多的應用程序系統都會選擇使用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 [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。?
原文鏈接:https://www.cnblogs.com/dotnet261010/p/13283176.html
相關推薦
- 2022-12-04 WxPython界面如何用pubsub展示進程工作的進度條_python
- 2022-10-06 Python3中常見配置文件寫法匯總_python
- 2022-06-18 深入解析Go?變量字符串與字符編碼問題_Golang
- 2022-06-19 教你用vbs實現微信自動發送消息功能_vbs
- 2023-07-17 uniapp H5頁面內獲取手機號撥打電話
- 2022-10-15 C語言庫函數qsort的使用及模擬實現_C 語言
- 2022-05-28 python按列索引提取文件夾內所有excel指定列匯總(示例代碼)_python
- 2022-09-19 C/C++淺析鄰接表拓撲排序算法的實現_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支