Docker鏡像與容器的導(dǎo)入導(dǎo)出操作實(shí)踐
一、前言
隨著容器技術(shù)的發(fā)展,現(xiàn)在很多的應(yīng)用程序系統(tǒng)都會選擇使用docker容器進(jìn)行部署,但是有時候使用docker容器進(jìn)行部署的時候會遇到問題,比如說我們的應(yīng)用程序里面需要依賴其他第三方的鏡像,如果這時候服務(wù)器是在內(nèi)網(wǎng)不能連接外網(wǎng)的情況下,那么就無法部署了?;谶@種情況,docker官方支持docker鏡像和容器的導(dǎo)入和導(dǎo)出,我們可以在一臺能夠聯(lián)網(wǎng)的機(jī)器上面編譯鏡像,然后導(dǎo)出鏡像或者容器,最后把導(dǎo)出的鏡像或者容器上傳到內(nèi)網(wǎng)服務(wù)器,然后在導(dǎo)入鏡像或者容器,這樣就可以了。
鏡像和容器的導(dǎo)入、導(dǎo)出操作主要涉及到下面的幾個命令:save、load、export、import。
演示過程中我們是在本地生成鏡像或者容器,然后把鏡像或者容器導(dǎo)出,最后上傳到阿里云服務(wù)器演示導(dǎo)入功能。
我們使用VS 2019創(chuàng)建一個ASP.NET Core MVC的項(xiàng)目,添加Dockerfile文件:
# 使用運(yùn)行時鏡像 FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim # 設(shè)置工作目錄 WORKDIR /app # 把目錄下的內(nèi)容都復(fù)制到當(dāng)前目錄下 COPY . . # 暴露80端口 EXPOSE 80 # 運(yùn)行鏡像入口命令和可執(zhí)行文件名稱 ENTRYPOINT ["dotnet", "DockerDemo.dll"]
然后發(fā)布項(xiàng)目。我們查看現(xiàn)有的docker鏡像
可以看到:現(xiàn)在只有兩個.net core的鏡像。我們生成鏡像:
docker build -t dockerdemo .
如下圖所示:
查看生成后的鏡像
然后我們根據(jù)生成的鏡像來運(yùn)行容器,首先查看現(xiàn)有的容器:
可以看到這時沒有任何容器。我們運(yùn)行容器:
可以看到:容器已經(jīng)運(yùn)行成功了。
二、docker鏡像的導(dǎo)入和導(dǎo)出
1、docker鏡像的導(dǎo)出
涉及到的命令:
docker save [options] images [images...]
我們使用上面的鏡像來演示鏡像的導(dǎo)出:
docker save -o dockerdemo.tar dockerdemo
如下圖所示:
這里導(dǎo)出的時候指定了導(dǎo)出后文件的路徑,如果不指定路徑,默認(rèn)是當(dāng)前文件夾。
或者也可以使用下面的命令導(dǎo)出:
docker save > dockerdemo.tar dockerdemo
其中-o和>表示輸出到文件,dockerdemo.tar為導(dǎo)出的目標(biāo)文件,dockerdemo為源鏡像名。
我們查看本地是否有了導(dǎo)出后的文件:
可以看到目錄下面已經(jīng)有了剛才導(dǎo)出的文件。
2、docker鏡像的導(dǎo)入
我們首先使用XFtp把上面導(dǎo)出的鏡像文件上傳到阿里云服務(wù)器
然后進(jìn)入文件所在的目錄
我們查看阿里云服務(wù)器上面有哪些鏡像:
從上圖中看出:現(xiàn)在阿里云服務(wù)器上面沒有任何的鏡像。
涉及到的導(dǎo)入命令load
docker load [options]
接下來我們導(dǎo)入剛才上傳的鏡像。
docker load -i dockerdemo.tar
如下圖所示:
或者也可以使用下面的命令
docker load < dockerdemo.tar
其中-i(i即imput)和<表示從文件輸入。上面的兩個命令都會成功導(dǎo)入鏡像以及相關(guān)元數(shù)據(jù),包括tag信息。
導(dǎo)入后查看鏡像:
可以看到有了我們剛才導(dǎo)入的鏡像。導(dǎo)入了鏡像以后就可以根據(jù)鏡像運(yùn)行容器,最后運(yùn)行應(yīng)用程序。
三、docker容器的導(dǎo)入和導(dǎo)出
接下來我們演示容器的導(dǎo)入和導(dǎo)出。
1、docker容器的導(dǎo)出
涉及到的命令export。
docker export [options] container
我們把上面生成的容器導(dǎo)出:
docker export -o D:\containers\dockerdemocontainer.tar dockerdemo
如下圖所示:
其中,-o表示輸出的文件,這里指定了輸出的路徑,如果沒有指定路徑,則默認(rèn)生成到當(dāng)前文件夾。dockerdemocontainer.tar為目標(biāo)文件,dockerdemo為源容器名。
我們查看目錄下面是否生成了導(dǎo)出的容器:
2、docker容器的導(dǎo)入
我們首先把導(dǎo)出的容器使用XFTP上傳到阿里云服務(wù)器。
涉及到的導(dǎo)入命令import。
docker import [options] file|URL|- [REPOSITORY[:TAG]]
如下圖所示
我們導(dǎo)入剛才上傳的容器
docker import [options] file|URL|- [REPOSITORY[:TAG]]
dockerdemocontainer.tar表示要導(dǎo)入的容器,dockerdemo:imp表示導(dǎo)入后的鏡像名稱,imp表示給導(dǎo)入的鏡像打tag。
如下圖所示
然后我們查看鏡像:
可以看到這時有我們剛才導(dǎo)入的鏡像了,導(dǎo)入的鏡像tag為imp。
四、總結(jié)
下面我們來總結(jié)一下鏡像和容器導(dǎo)入導(dǎo)出的區(qū)別:
- 鏡像導(dǎo)入是一個復(fù)制的過程,容器導(dǎo)入是將當(dāng)前容器變成一個新的鏡像。
- docker save命令保存的是鏡像(image),docker export命令保存的是容器(container)。
- export命令導(dǎo)出的tar文件略小于save命令導(dǎo)出的。
- 因?yàn)閑xport導(dǎo)出的是容器,export導(dǎo)出的文件在import導(dǎo)入時,無法保留鏡像所有的歷史(即每一層layer信息),不能進(jìn)行回滾操作。而save是根據(jù)鏡像來的,所以導(dǎo)入時可以完整保留下每一層layer信息。如下圖所示:dockerdemo:latest是save導(dǎo)出load導(dǎo)入的,dockerdemo:imp是export導(dǎo)出import導(dǎo)入的。
docker load不能對導(dǎo)入的鏡像重命名,而docker import導(dǎo)入可以為鏡像指定新名稱。例如,上面導(dǎo)入的時候指定dockerdeom:imp。
對于是使用鏡像導(dǎo)入導(dǎo)出還是使用容器導(dǎo)入導(dǎo)出該如何選擇呢?有下面兩點(diǎn)建議:
- 若是只想備份image,使用save和load。
- 若是在啟動容器后,容器內(nèi)容有變化,需要備份,則使用export和import。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Docker鏡像的導(dǎo)入導(dǎo)出的實(shí)現(xiàn)方法
- docker鏡像的導(dǎo)入和導(dǎo)出的實(shí)現(xiàn)
- Docker鏡像的導(dǎo)入導(dǎo)出代碼實(shí)例
- Docker?鏡像導(dǎo)入導(dǎo)出過程介紹
- Docker鏡像與容器的導(dǎo)入導(dǎo)出以及常用命令總結(jié)
- docker鏡像導(dǎo)入導(dǎo)出的兩種方法
- docker images導(dǎo)入導(dǎo)出方式
- idea使用docker生成鏡像(打包鏡像,導(dǎo)入鏡像,導(dǎo)出鏡像)
- Docker中conda環(huán)境的導(dǎo)出和導(dǎo)入
相關(guān)文章
Docker安裝MySQL并使用Navicat連接的操作方法
這篇文章主要介紹了Docker安裝MySQL并使用Navicat連接,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09Docker查看是否開機(jī)自啟及容器自啟動設(shè)置
Docker是當(dāng)前最流行的容器技術(shù),通過運(yùn)用容器打包應(yīng)用程序并部署到生產(chǎn)環(huán)境中,可大大提高部署的速度和可靠性,下面這篇文章主要給大家介紹了關(guān)于Docker查看是否開機(jī)自啟及容器自啟動設(shè)置的相關(guān)資料,需要的朋友可以參考下2024-01-01Docker部署MySQL主從復(fù)制的實(shí)現(xiàn)
本文主要介紹了Docker部署MySQL主從復(fù)制的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-10-10docker 實(shí)現(xiàn)容器與宿主機(jī)無縫調(diào)用shell命令
這篇文章主要介紹了docker 實(shí)現(xiàn)容器與宿主機(jī)無縫調(diào)用shell命令的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨想過來看看吧2021-03-03Docker容器下運(yùn)行Nginx并實(shí)現(xiàn)反向代理
這篇文章介紹了Docker容器下運(yùn)行Nginx并實(shí)現(xiàn)反向代理的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-03-03使用Docker運(yùn)行Microsoft SQL Server 2017的方法
本篇文章主要介紹了使用Docker運(yùn)行Microsoft SQL Server 2017的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11詳解基于docker-swarm搭建持續(xù)集成集群服務(wù)
這篇文章主要介紹了詳解基于docker-swarm搭建持續(xù)集成集群服務(wù),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10