今天小編給大家分享一下.NETCore Docker如何實(shí)現(xiàn)容器化與私有鏡像倉(cāng)庫(kù)管理的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),文圣企業(yè)網(wǎng)站建設(shè),文圣品牌網(wǎng)站建設(shè),網(wǎng)站定制,文圣網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,文圣網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
一、docker介紹
docker是用go語(yǔ)言編寫(xiě)基于linux操作系統(tǒng)的一些特性開(kāi)發(fā)的,其提供了操作系統(tǒng)級(jí)別的抽象,是一種容器管理技術(shù),它隔離了應(yīng)用程序?qū)A(chǔ)架構(gòu)(操作系統(tǒng)等)的依賴(lài)。相較于虛擬機(jī)而言,docker共享的是宿主機(jī)的硬件資源,使用容器來(lái)提供獨(dú)立的運(yùn)行環(huán)境來(lái)運(yùn)行應(yīng)用。虛擬機(jī)則是基于supervisor(虛擬機(jī)管理程序)使用虛擬化技術(shù)來(lái)提供隔離的虛擬機(jī),在虛擬機(jī)的操作系統(tǒng)上提供運(yùn)行環(huán)境!雖然兩者都提供了很好的資源隔離,但很明顯docker的虛擬化開(kāi)銷(xiāo)更低!
docker涉及了三個(gè)核心概念:register、image、container。
1. registry:倉(cāng)庫(kù)。用來(lái)存儲(chǔ)docker鏡像,比如docker官方的docker hub就是一個(gè)公開(kāi)的倉(cāng)庫(kù),在上面我們可以下載我們需要的鏡像。
2. image:鏡像。開(kāi)發(fā)人員創(chuàng)建一個(gè)應(yīng)用程序或服務(wù),并將它及其依賴(lài)關(guān)系打包到一個(gè)容器鏡像中。鏡像是應(yīng)用程序的配置及其依賴(lài)關(guān)系的靜態(tài)形式。
3. container:容器。container是鏡像的運(yùn)行實(shí)例,它是一個(gè)隔離的、資源受控的可移植的運(yùn)行時(shí)環(huán)境,其中包含操作系統(tǒng)、需要運(yùn)行的程序、運(yùn)行程序的相關(guān)依賴(lài)、環(huán)境變量等。
它們?nèi)叩南嗷プ饔藐P(guān)系是:
當(dāng)我們執(zhí)行docker pull或docker run命令時(shí),若本地?zé)o所需的鏡像,那么將會(huì)從倉(cāng)庫(kù)(一般為dockerhub)下載(pull)一個(gè)鏡像。docker執(zhí)行run方法得到一個(gè)容器,用戶(hù)在容器里執(zhí)行各種操作。docker執(zhí)行commit方法將一個(gè)容器轉(zhuǎn)化為鏡像。docker利用login、push等命令將本地鏡像推送(push)到倉(cāng)庫(kù)。其他機(jī)器或服務(wù)器上就可以使用該鏡像去生成容器,進(jìn)而運(yùn)行相應(yīng)的應(yīng)用程序。
二、docker安裝
1、使用yum源安裝, 由于國(guó)內(nèi)訪問(wèn)官方源慢,此處添加阿里的源
> wget -p /etc/yum.repos.d/ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo > yum install -y docker-ce
2、啟動(dòng)docker
//啟動(dòng) docker ce > systemctl start docker > systemctl enable docker //查看docker狀態(tài) > systemctl status docker //查看docker版本 > docker -v
3、測(cè)試docker是否正確安裝,執(zhí)行命令:
> docker run hello-world
a、當(dāng)執(zhí)行 docker run hello-world
時(shí),docker首先會(huì)從本地找 hello-world 的鏡像,如果本地沒(méi)有,它將會(huì)從默認(rèn)的鏡像倉(cāng)庫(kù)docker hub上拉取鏡像。鏡像拉取到本地后,就實(shí)例化鏡像得到容器,輸出hello from docker!。
b、docker engine
提供了docker的核心技術(shù): 圖像(images)和容器(containers). 在安裝教程的最后一步, 你運(yùn)行了engine命令docker run hello-world
. 這一個(gè)命令,使engine完成了docker的核心任務(wù), 該命令包含了三部分.
c、一個(gè)容器是一個(gè)精簡(jiǎn)版的linux操作系統(tǒng), 一個(gè)鏡像是加載到這個(gè)容器的軟件, 當(dāng)你運(yùn)行這個(gè)命令后, engine會(huì)做下面的事情:
1.檢查是否存在hello-world這個(gè)軟件鏡像
2.從docker hub下載鏡像(稍后了解docker hub)
3.加載這個(gè)鏡像到容器中, 并運(yùn)行它
三、.netcore項(xiàng)目在docker中運(yùn)行
1、拉取microsoft/dotnet鏡像,等幾分鐘后即可安裝完畢,執(zhí)行docker images
可以看到本地已經(jīng)包含microsoft/dotnet鏡像
> docker pull microsoft/dotnet
2、運(yùn)行microsoft/dotnet鏡像, 使用docker run
可以啟動(dòng)鏡像,通過(guò)指定參數(shù)-it以交互模式(進(jìn)入容器內(nèi)部)啟動(dòng)。依次執(zhí)行以下命令:
> docker run -it microsoft/dotnet //啟動(dòng)一個(gè)dotnet鏡像 > dotnet new mvc -n mvctest //創(chuàng)建項(xiàng)目名為mvctest的.net core mvc項(xiàng)目 > cd mvctest //進(jìn)入mvctest文件夾 > dotnet run //啟動(dòng).net core mvc項(xiàng)目
運(yùn)行結(jié)果如下圖所示:
鍵盤(pán)按住ctrl+c即可關(guān)閉應(yīng)用,輸入exit即可退出當(dāng)前容器
以上簡(jiǎn)單的幾步就完成了一個(gè).net core mvc項(xiàng)目的創(chuàng)建和運(yùn)行,這個(gè)時(shí)候你可能會(huì)好奇,linux宿主機(jī)上并沒(méi)有安裝.net core sdk啊,mvc項(xiàng)目是如何創(chuàng)建的呢?這就是docker神奇的地方,我們從鏡像倉(cāng)庫(kù)中拉取的dotnet鏡像,包含了創(chuàng)建、構(gòu)建、運(yùn)行.net core項(xiàng)目所需的一切依賴(lài)和運(yùn)行時(shí)環(huán)境。
退出容器之后,執(zhí)行find -name mvctest(查找mvctest文件),我們發(fā)現(xiàn)并沒(méi)有找到。這說(shuō)明我們剛才創(chuàng)建的.net core mvc項(xiàng)目是在容器內(nèi)部創(chuàng)建的,是與宿主機(jī)完全隔離的。這個(gè)時(shí)候你可能會(huì)想,每次都要在容器中安裝源代碼太不方便了,我們能不能讓容器運(yùn)行我們宿主機(jī)的源代碼項(xiàng)目?嗯,這是個(gè)好問(wèn)題。當(dāng)然是可以實(shí)現(xiàn)的,下面我們就來(lái)解答這個(gè)問(wèn)題。
四、 宿主機(jī)上創(chuàng)建.net core 項(xiàng)目
為了在宿主機(jī)上創(chuàng)建.net core 項(xiàng)目,這個(gè)時(shí)候我們就需要在linux宿主機(jī)上安裝.net core sdk
1、宿主機(jī)安裝.net core sdk
添加yum源:sudo rpm -uvh
開(kāi)始安裝:yum install -y dotnet-sdk-2.1
檢測(cè)安裝版本,如下圖表示安裝正確
2、創(chuàng)建.net core項(xiàng)目
> mkdir data > cd data > dotnet new mvc -n mvctest //創(chuàng)建項(xiàng)目名為mvctest的.net core mvc項(xiàng)目 > cd mvctest //進(jìn)入mvctest文件夾 > dotnet run //啟動(dòng).net core mvc項(xiàng)目
注:在program.cs文件中加入代碼.useurls(""),在瀏覽器中訪問(wèn)如下圖:
下一步我們就將該目錄下的源碼項(xiàng)目通過(guò)掛載的方式共享到容器中去
3、掛載宿主機(jī)項(xiàng)目到容器中
在啟動(dòng)docker鏡像時(shí),docker允許我們通過(guò)使用-v參數(shù)掛載宿主機(jī)的文件到容器的指定目錄下。換句話說(shuō),就相當(dāng)于宿主機(jī)共享指定文件供容器去訪問(wèn)
// 命令中的`\`結(jié)合`enter`鍵構(gòu)成換行符,允許我們換行輸入一個(gè)長(zhǎng)命令。 > docker run -it \ > -v /data/mvctest/:/app \ > microsoft/dotnet:latest
上面的命令就是把/data/mvctest/文件夾下的文件掛載到容器的\app目錄下
從上面的執(zhí)行結(jié)果來(lái)看,容器內(nèi)部中的app目錄下包含了宿主機(jī)上的源碼項(xiàng)目。
上面說(shuō)到是以共享的形式,而不是容器擁有一份宿主機(jī)目錄的拷貝,意味著,在宿主機(jī)上對(duì)目錄的更改,會(huì)即時(shí)反應(yīng)到容器中。但反過(guò)來(lái),容器中對(duì)共享目錄的更改,不會(huì)反應(yīng)到宿主機(jī)上,不然就打破了容器具有的隔離特性。
通過(guò)這樣一個(gè)簡(jiǎn)單場(chǎng)景,聰明的你是否會(huì)聯(lián)想到這一場(chǎng)景在我們?nèi)粘>幋a的應(yīng)用之處呢?是的,我們可以用來(lái)持續(xù)構(gòu)建(ci)?;舅悸肥?,通過(guò)git clone源碼到宿主機(jī)上,然后將源碼目錄掛載到容器中去進(jìn)行構(gòu)建
4、借助dockerfile文件
下篇我們升級(jí)此操作,不需dockerfile的依賴(lài),操作一條命令搞定。
dockerfile用來(lái)定義你將要在容器中執(zhí)行的系列操作。我們來(lái)創(chuàng)建第一個(gè)dockerfile
> cd /data/mvctest/ //確保進(jìn)入我們創(chuàng)建的mvc項(xiàng)目目錄中去 > touch dockerfile //使用touch命令創(chuàng)建dockerfile > vi dockerfile //使用vi命令編輯dockerfile
進(jìn)入vi編輯界面后,復(fù)制以下代碼,使用shift + ins命令即可粘貼。然后按ese退出編輯模式,按shift + :,輸入wq即可保存并退出編輯界面
from microsoft/dotnet:latest workdir /app copy . /app run dotnet restore expose 5000 env aspnetcore_urls http://*:5000 entrypoint ["dotnet","run"]
上面的命令我依次解釋一下:
使用from指定容器使用的鏡像
使用workdir指定工作目錄
使用copy指令,復(fù)制當(dāng)前目錄(其中.即代表當(dāng)前目錄)到容器中的/app目錄下
使用run命令指定容器中執(zhí)行的命令
使用expose指定容器暴露的端口號(hào)
使用env指定環(huán)境參數(shù),上面用來(lái)告訴.netcore項(xiàng)目在所有網(wǎng)絡(luò)接口上監(jiān)聽(tīng)5000端口
使用entrypoint制定容器的入口點(diǎn)
dockerfile就緒,我們就可以將我們當(dāng)前項(xiàng)目打包成鏡像以分發(fā)部署。
使用docker build -t
> docker build -t mvctest.web .
以上命令就是告訴docker將當(dāng)前目錄打包成鏡像,并命名為hellodocker.web
。命令執(zhí)行完畢,輸入docker images
即可看到我們新打包的鏡像
鏡像創(chuàng)建完畢我們就可以直接運(yùn)行了:
> docker run -d -p 80:5000 mvctest.web
上面的指令就是運(yùn)行我們新打包的鏡像,并通過(guò)-p參數(shù)映射容器的5000到宿主機(jī)的80端口,其中-d參數(shù)告訴docker以后臺(tái)任務(wù)形式運(yùn)行鏡像。因?yàn)?0是默認(rèn)的web端口,所以我們通過(guò)瀏覽器直接訪問(wèn)ip即可訪問(wèn)到我們?nèi)萜髦羞\(yùn)行的mvc網(wǎng)站
至此,我們借助docker就完美的完成了.net core項(xiàng)目的容器化部署,后續(xù)我們將鏡像部署在其它的機(jī)器上
五、推送鏡像到倉(cāng)庫(kù)
請(qǐng)自行到docker hub注冊(cè)個(gè)賬號(hào),然后我們把本地打包的鏡像放到自己賬號(hào)下的倉(cāng)庫(kù)下
1、注冊(cè)完畢后,執(zhí)行命令
> docker login
2、再執(zhí)行命令
> docker push
推送失敗,提示我們的鏡像命名不符規(guī)范。原來(lái)在推送之前要把鏡像按
以上信息表示推送成功了,查看自己的倉(cāng)庫(kù),如下圖:
最后我們換一臺(tái)機(jī)器,我們直接執(zhí)行以下命令,就完成了多重部署
> docker run -p 8081:5000 79522860/mvcdemo.web
以上自己的鏡像倉(cāng)庫(kù)做好了,是不是很方便,如果結(jié)合業(yè)務(wù),會(huì)發(fā)現(xiàn)需要的鏡像會(huì)比較多,分布式部署容器還要一個(gè)個(gè)啟動(dòng)容器?不,其它我們還可以通過(guò)配置文件來(lái)一鍵部署鏡像與容器,一下篇我們會(huì)講到
六、docker常用命令
1、容器相關(guān)操作
> docker ps //查看當(dāng)前正在運(yùn)行的容器 > docker ps -a //查看所有容器的狀態(tài) > docker start/stop id/name //啟動(dòng)/停止某個(gè)容器 > docker attach id //進(jìn)入某個(gè)容器(使用exit退出后容器也跟著停止運(yùn)行) > docker rm id/name //刪除某個(gè)容器,若正在運(yùn)行,需要先停止 > docker rm $(docker ps -a -q) //刪除已經(jīng)停止的容器 > docker logs -f hello-world //查看指定容器的日志記錄
> docker run -it --name hello_001 hello-world //創(chuàng)建一個(gè)容器,并指定標(biāo)簽
-i:允許我們對(duì)容器內(nèi)的 (stdin) 進(jìn)行交互
-t:在新容器內(nèi)指定一個(gè)偽終端或終端
--name:是給容器起一個(gè)名字,可省略,省略的話docker會(huì)隨機(jī)產(chǎn)生一個(gè)名字
2、鏡像相關(guān)操作
> docker images //查看本地鏡像 > docker rmi id/name //刪除某個(gè)鏡像,如果不指定tag,默認(rèn)刪除的是latest標(biāo)簽 > docker rmi $(docker images -q) //刪除所有鏡像,小心 > docker rmi $(docker images -f "dangling=true" -q) //刪除所有無(wú)名稱(chēng)鏡像(可能是構(gòu)建過(guò)程中產(chǎn)生的中間鏡像) > docker start/stop id/name //啟動(dòng)/停止某個(gè)容器 > docker attach id //進(jìn)入某個(gè)容器(使用exit退出后容器也跟著停止運(yùn)行)
通過(guò)id tag鏡像,下面是tag一個(gè)id為0e5574283393的本地鏡像到“fedora”存儲(chǔ)庫(kù),tag名稱(chēng)version1.0
> docker tag 0e5574283393 fedora/httpd:version1.0
通過(guò)名稱(chēng)tag鏡像, 使用名稱(chēng)“httpd” tag本地鏡像到存儲(chǔ)庫(kù)”fedora”,且其tag名為version1.0
> docker tag httpd fedora/httpd:version1.0
注意由于引用httpd的tag名稱(chēng)沒(méi)有指定,默認(rèn)引用httpd:latest
通過(guò)名稱(chēng)和tag名稱(chēng) tag一個(gè)鏡像,為名稱(chēng)為httpd和tag名稱(chēng)為test的本地鏡像做標(biāo)簽,其存儲(chǔ)庫(kù)為fedora,標(biāo)簽名為version1.0.test
> docker tag httpd:test fedora/httpd:version1.0.test
tag一個(gè)鏡像到私有的存儲(chǔ)庫(kù), 推送一個(gè)鏡像到一個(gè)私有的registry,而不是公共的docker registry,必須指定一個(gè)registry主機(jī)名和端口來(lái)tag此鏡像
> docker tag 0e5574283393 myregistryhost:5000/fedora/httpd:version1.
3、卸載 docker ce
a、卸載docker包
> yum remove docker-ce
b、主機(jī)上的images, containers, volumes或自定義配置文件不會(huì)自動(dòng)刪除。 刪除所有mages, containers, volumes命令
> rm -rf /var/lib/docker
六、額外知識(shí)普及
1、docker官方鏡像庫(kù)地址
2、microsoft/dotnet 鏡像版本之間的區(qū)別
a、microsoft/dotnet:
此映像包含帶有 .net core 和命令行工具 (cli) 的 .net core sdk。 此映像將映射到開(kāi)發(fā)方案。 可使用此映像進(jìn)行本地開(kāi)發(fā)、調(diào)試和單元測(cè)試。 此映像還可用于生成方案。 使用 microsoft/dotnet:sdk 始終都提供最新版本。
b、microsoft/dotnet:
此映像包含 .net core(運(yùn)行時(shí)和庫(kù)),并且針對(duì)在生產(chǎn)環(huán)境中運(yùn)行 .net core 應(yīng)用進(jìn)行了優(yōu)化。
c、microsoft/dotnet:
runtime-deps 映像包括具有 .net core 所需的所有本機(jī)依賴(lài)項(xiàng)的操作系統(tǒng)。 此映像適用于獨(dú)立應(yīng)用程序。
3、鏡像加速
鑒于國(guó)內(nèi)網(wǎng)絡(luò)問(wèn)題,后續(xù)拉取 docker 鏡像十分緩慢,我們可以配置加速器來(lái)解決,我使用的是網(wǎng)易的鏡像地址:。
新版的 docker 使用 /etc/docker/daemon.json(linux)
或者 %programdata%\docker\config\daemon.json(windows) 來(lái)配置 daemon。
請(qǐng)?jiān)谠撆渲梦募屑尤耄](méi)有該文件的話,請(qǐng)先建一個(gè)):
{ "registry-mirrors": ["http://hub-mirror.c.163.com"] }
#刷新配置文件并重啟docker
systemctl daemon-reload systemctl restart docker
**********如果使用aliyun,需要登陸自己的阿里云賬戶(hù)獲取自己的鏡像地址************
以上就是“.NETCore Docker如何實(shí)現(xiàn)容器化與私有鏡像倉(cāng)庫(kù)管理”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。