docker部署Asp.net core應(yīng)用的完整步驟
1 容器概念
使用Docker前我們首先要簡(jiǎn)單了解一下容器的概念。MSDN上有一張?zhí)摂M機(jī)和容器的對(duì)比圖,很好的展示了虛擬機(jī)和容器的區(qū)別,如下所示,虛擬機(jī)包括應(yīng)用程序、必需的庫(kù)或二進(jìn)制文件以及完整的來(lái)賓操作系統(tǒng),每臺(tái)虛擬機(jī)都有一個(gè)單獨(dú)的內(nèi)核,我們完全可以把虛擬機(jī)看做是一臺(tái)真實(shí)的物理機(jī)。容器包括應(yīng)用程序及其所有依賴(lài)項(xiàng),與其他容器共享 OS 內(nèi)核,容器在主機(jī)操作系統(tǒng)上作為獨(dú)立進(jìn)程運(yùn)行,我們可以把容器看做是一個(gè)應(yīng)用沙盒。
我們經(jīng)常會(huì)遇到“我機(jī)器上可以運(yùn)行”的問(wèn)題吧,然后部署到其他機(jī)器時(shí)就遇到了各種坑,這多是因?yàn)槠渌O(shè)備上缺少應(yīng)用所需的環(huán)境或者缺少應(yīng)用的依賴(lài)項(xiàng)造成的。使用容器技術(shù)可以很好的解決這個(gè)問(wèn)題,容器是一個(gè)“應(yīng)用的沙盒”,這個(gè)沙盒內(nèi)部包含了應(yīng)用所需的環(huán)境和所有依賴(lài)項(xiàng),只要有這個(gè)沙盒存在,應(yīng)用在任何環(huán)境下都能正常的運(yùn)行,容器技術(shù)的典型特點(diǎn)就是“一次封裝,到處運(yùn)行”。
Docker 是一個(gè)使用go語(yǔ)言開(kāi)發(fā)的開(kāi)源的應(yīng)用容器引擎,讓開(kāi)發(fā)者可以打包他們的應(yīng)用以及依賴(lài)包到一個(gè)可移植的容器中,然后發(fā)布到任何流行的Linux機(jī)器上,也可以實(shí)現(xiàn)虛擬化。我們先了解Docker中的三個(gè)核心概念:
1 鏡像(Image)
鏡像是一種輕量級(jí)、可執(zhí)行的獨(dú)立軟件包,它包含運(yùn)行某個(gè)軟件所需的所有內(nèi)容,包括代碼、運(yùn)行時(shí)、庫(kù)、環(huán)境變量和配置文件。
2 容器(Container)
容器是鏡像的運(yùn)行時(shí)實(shí)例 ,執(zhí)行鏡像時(shí)內(nèi)存中運(yùn)行的就是容器。如果把鏡像看做面向?qū)ο笾械念?lèi),容器就是對(duì)象。使用類(lèi)時(shí)通過(guò)new來(lái)獲取一個(gè)對(duì)象,類(lèi)似的使用鏡像時(shí)通過(guò) docker run <鏡像名/鏡像id>創(chuàng)建一個(gè)容器。
3 倉(cāng)庫(kù)(Repository)
倉(cāng)庫(kù)時(shí)用來(lái)存放鏡像的地方,Docker hub是docker官方提供的倉(cāng)庫(kù),類(lèi)似于githhub,,通過(guò)push推送鏡像到倉(cāng)庫(kù),通過(guò)pull命令拉取鏡像。當(dāng)然我們也可以使用其他倉(cāng)庫(kù),或者自己搭建一個(gè)倉(cāng)庫(kù)。
2安裝docker
1 Windows安裝docker
docker是運(yùn)行在Linux系統(tǒng)上的,在Windows上使用docker默認(rèn)要用到Hyper-V功能,所以我們?cè)赪indows系統(tǒng)上安裝Docker必須先開(kāi)啟Hyper-V功能。首先打開(kāi)【控制面板】,找到【啟動(dòng)或關(guān)閉Windows功能】,然后勾選【Hyper-V】,點(diǎn)擊確定即可安裝Hyper-V。
安裝好Hyper-V后,到docker官網(wǎng)下載Windows版本的docker,docker需要登錄賬戶(hù)才能下載,我們可以創(chuàng)建一個(gè)賬戶(hù),牢記這個(gè)賬號(hào),我們以后會(huì)經(jīng)常用到。docke下載地址:docker下載。下載完成后,雙擊安裝包,一路next即可。安裝完成后需要重啟電腦,打開(kāi)命令行,輸入docker run hello-world
,如果出現(xiàn)以下界面,表示docker已經(jīng)安裝成功了。docker run hello-world
命令首先會(huì)在本地找名字為hello-world的鏡像,如果本地不存在這個(gè)鏡像就會(huì)從docker hub上拉取hello-world鏡像,然后運(yùn)行。
2 Centos安裝docker
Linux系統(tǒng)安裝常用軟件都十分方便,執(zhí)行下邊的命令即可安裝docker
#刪除舊版本 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine #安裝一些需要的工具 yum install -y yum-utils device-mapper-persistent-data lvm2 #添加軟件源信息 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #更新yum緩存 yum makecache fast #安裝docker yum -y install docker-ce #啟動(dòng)docker服務(wù) systemctl start docker #測(cè)試docker docker run hello-world
安裝完成后執(zhí)行docker run hello-world
命令,如果出現(xiàn)下邊的界面表示docker安裝成功了
3 Docker基本使用
1 使用官方docker實(shí)例
可以查看官方教程詳細(xì)地了解docker的使用,這里我們先用兩分鐘分鐘展示一下微軟官方提供的docker栗子,執(zhí)行命令docker run -p 8000:80 --name aspnetcore_sample mcr.microsoft.com/dotnet/core/samples:aspnetapp
,-p 8000:80表示將服務(wù)器的8000端口和容器的80端口建立映射,訪問(wèn)服務(wù)器8000端口時(shí)會(huì)去訪問(wèn)容器的80端口。--name設(shè)置鏡像的名字
打開(kāi)瀏覽器,訪問(wèn)虛擬機(jī)的8000端口如下,說(shuō)明我們的容器已經(jīng)成功啟動(dòng)了!
我們使用docker images
和docker container ls
查看一下本機(jī)的容器和鏡像,結(jié)果如下:
2 Docker常用命令
其實(shí)我們實(shí)際開(kāi)發(fā)中能用到的docker命令并不多,這里簡(jiǎn)單匯總一下最常用的docker命令。
## 查看docker版本和信息 #查看docker-cli的版本 docker --version #查看docker版本和信息 docker version docker info ## docker鏡像相關(guān)命令 #拉取鏡像 docker pull [imgName:tag] #運(yùn)行鏡像,執(zhí)行后會(huì)生成一個(gè)容器 docker run [imgName:tag/imgID] #查看所有的鏡像 docker images #刪除鏡像 執(zhí)行rmi命令前必須刪除所有該鏡像的container docker rmi [imgName:tag/imgID] #查看所有的容器,沒(méi)有-a表示查詢(xún)所有正在運(yùn)行中的容器 docker container ls -a #查看docker正在運(yùn)行和已經(jīng)停止的容器 docker ps -a #啟動(dòng)容器 docker start [ctnName/cID] #停止容器 docker stop [ctnName/cID] #刪除容器,執(zhí)行rm命令前必須先停止該容器 docke rm [ctnName/cID] ##清理鏡像和容器 #刪除所有的鏡像和容器 docker kill $(docker ps -q) ; docker rm $(docker ps -a -q) ; docker rmi $(docker images -q -a) #刪除所有的容器 docker kill $(docker ps -q) ; docker rm $(docker ps -a -q) #清除名稱(chēng)為none的鏡像 docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm docker images|grep none|awk '{print $3 }'|xargs docker rmi
有時(shí)候我們需要和容器交互,可以使用命令docker exec -it [name/id] common
。如我們啟動(dòng)一個(gè)mysql容器mysqlx1,執(zhí)行docker exec -it mysqlx1 mysql -p
表示和容器mysqlx1交互,執(zhí)行的命令是【mysql -p】進(jìn)行登錄,如下所示。Ctrl +p+q退出容器,回到服務(wù)器目錄。
3 定制容器
大多數(shù)用戶(hù)使用docker的核心目的是更方便的交付項(xiàng)目,就是將我們的應(yīng)用程序構(gòu)建成鏡像,然后交付鏡像即可,這里演示怎么構(gòu)建一個(gè)Aspnet core項(xiàng)目的鏡像。
1. 開(kāi)發(fā)aspnet core應(yīng)用
我們創(chuàng)建一個(gè)Asp net core MVC項(xiàng)目,項(xiàng)目名為DockerDemo,為了方便不勾選Https和Docker支持,如下:
簡(jiǎn)單修改首頁(yè),運(yùn)行一下,測(cè)試項(xiàng)目沒(méi)有bug,運(yùn)行首頁(yè)如下:
2 發(fā)布項(xiàng)目,添加Dockerfile
發(fā)布項(xiàng)目,然后在發(fā)布文件夾下添加Dockerfile文件,結(jié)構(gòu)如下:
Dockerfile的內(nèi)容如下:
#拉取runtime父鏡像,運(yùn)行aspnet core應(yīng)用必須要用runtime FROM microsoft/dotnet:2.2-aspnetcore-runtime #設(shè)置容器工作目錄 WORKDIR /DockerDemo #把當(dāng)前目錄的所有文件copy到工作目錄中 COPY . /DockerDemo #暴露一個(gè)端口讓外部可以訪問(wèn) EXPOSE 80 #容器入口命令,即容器啟動(dòng)時(shí)執(zhí)行dotnet DockerDemo.dll命令 ENTRYPOINT ["dotnet", "DockerDemo.dll"]
Dockerfile常見(jiàn)指令簡(jiǎn)單說(shuō)明
Dockerfile常用指令: #FROM:通常情況下,我們創(chuàng)建的鏡像時(shí)基于另外一個(gè)鏡像的,這時(shí)就要用FROM,當(dāng)然我們也可以完全從頭創(chuàng)建 #WORKDIR:設(shè)置容器的工作目錄 #MAINTAINER:該鏡像的維護(hù)人 #COPY:經(jīng)常需要把源碼復(fù)制到容器中,只用COPY就可以實(shí)現(xiàn)這一點(diǎn) #RUN:這里可以定義一些需要運(yùn)行的命令,執(zhí)行的目錄是WORKDIR。如npm install ,dotnet restore,dotnet run等 #ENTRYPOINT:定義容器的入口,通常是一些dotnet/node等命令,如dotnet xxx.dll #CMD:設(shè)置容器運(yùn)行的默認(rèn)命令和參數(shù),即容器啟動(dòng)時(shí)執(zhí)行的命令。當(dāng)容器運(yùn)行時(shí),可以通過(guò)命令行覆蓋CMD定義的命令 #EXPOSE:暴露端口 #ENV:設(shè)置環(huán)境變量
3 創(chuàng)建鏡像
docker創(chuàng)建鏡像很簡(jiǎn)單,執(zhí)行docker build -t dockerdemo:v1.0 .命令即可創(chuàng)建鏡像,其中dockerdemo:v1.0是鏡像的名字和版本tag,名字和tag可以隨便設(shè)置。然后通過(guò)docker images命令查看所有鏡像,如下:
4 運(yùn)行容器
使用命令docker run -d -p 8080:80dockerdemo:v1.0
啟動(dòng)容器,-d 表示后臺(tái)運(yùn)行,-p 8080:80表示服務(wù)器的8080端口映射到容器的80端口,我們也可以使用服務(wù)器的其他端口,容器的端口為Dockerfile中Expose的端口。執(zhí)行docker container ls查看容器,這里我們的容器已經(jīng)啟動(dòng)了,如下:
打開(kāi)瀏覽器,輸入【服務(wù)器IP:服務(wù)器端口】接口訪問(wèn)容器,如下:
到這一步,本地創(chuàng)建鏡像和運(yùn)行容器成功了。
5 使用docker hub存儲(chǔ)和分發(fā)鏡像
docker提供了遠(yuǎn)程倉(cāng)庫(kù)用于存儲(chǔ)和分發(fā)鏡像,其作用類(lèi)似于github,區(qū)別在于github托管代碼,而docker hub托管鏡像。我們創(chuàng)建好了鏡像可以推送(push)到遠(yuǎn)程倉(cāng)庫(kù),然后在其他設(shè)備上拉取(pull)鏡像,有了docker hub我們可以更方便的管理和分發(fā)鏡像。docker hub的使用非常簡(jiǎn)單,只記住三個(gè)命令就可以了
#標(biāo)記鏡像,就是設(shè)置遠(yuǎn)程鏡像名和標(biāo)記 docker tag localname:localtag dockeruser/repname:reptag #推送鏡像文件到docker hub docker push username/repname:reptag #拉取遠(yuǎn)程鏡像 docker pull repname:reptag #注:localname是本地鏡像名 localtag是本地鏡像tag # repname遠(yuǎn)程倉(cāng)庫(kù)的鏡像名 reptag是遠(yuǎn)程倉(cāng)庫(kù)的tag # username是我們的dockerhub用戶(hù)名
這里將上邊創(chuàng)建的本地鏡像推動(dòng)到docker hub。使用命令docker tag dockerdemo:v1.0 wyyxxx/resdockerdemo:v1.0
標(biāo)記,使用命令docker push wyyxxx/resdockerdemo:v1.0
推動(dòng)鏡像到遠(yuǎn)程倉(cāng)庫(kù),打開(kāi)鏡像倉(cāng)庫(kù),登陸后就可以看到我們自定義的鏡像了,如下所示。
然后使用另一臺(tái)安裝了docker的服務(wù)器,執(zhí)行命令docker run -p 8080:80 wyyxxx/resdockerdemo:v1.0
拉取遠(yuǎn)程鏡像并啟動(dòng),打開(kāi)瀏覽器輸入地址,如下:
我們?cè)谕ㄟ^(guò)拉取遠(yuǎn)程鏡像并運(yùn)行容器時(shí),不需要事先部署環(huán)境(如安裝runtime)等,因?yàn)殓R像中已經(jīng)設(shè)置了需要的所有環(huán)境和依賴(lài)資源,只需要使用docker run命令運(yùn)行即可。這也是使用容器交付的方便之處。
4 使用Docker的一點(diǎn)建議
① “3C原則”一個(gè)容器只運(yùn)行一個(gè)應(yīng)用
② 使用鏡像交付應(yīng)用程序,而不是直接部署
如果要在centos上部署一個(gè)aspnet core應(yīng)用程序。錯(cuò)誤的做法是:在docker中先安裝一個(gè)centos系統(tǒng),在centos系統(tǒng)中部署環(huán)境,然后部署我們的netcore應(yīng)用程序,,最后把部署的應(yīng)用程序生成鏡像。正確的做法是通過(guò)Dockerfile定義我們需要的環(huán)境和依賴(lài)項(xiàng),然后生成鏡像,通過(guò)鏡像去分發(fā)和執(zhí)行。
③ 分層構(gòu)建鏡像
還是上邊centos部署netcore應(yīng)用的栗子,如果從零定制鏡像時(shí),我們應(yīng)該把centos作為一層鏡像,環(huán)境runtime作為一層鏡像,最后我們的應(yīng)用做為一層鏡像,使用Dockerfile的FROM 指令拉取父鏡像。這樣做的好處是節(jié)省空間和復(fù)用鏡像。如上邊我們使用了2.2版本的runtime鏡像,當(dāng)我們創(chuàng)建了另一個(gè)web應(yīng)用再來(lái)定制鏡像時(shí),這兩個(gè)應(yīng)用程序鏡像可以 共用同一個(gè)runtime鏡像。
④ 不要把數(shù)據(jù)存儲(chǔ)在容器中
容器是隨時(shí)可能銷(xiāo)毀的,銷(xiāo)毀后容器內(nèi)部的數(shù)據(jù)就不存在了,所以最好不要在容器中存儲(chǔ)需要持久化的數(shù)據(jù)。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)我們的支持。
上一篇:.net core webapi jwt 更為清爽的認(rèn)證詳解
欄 目:ASP.NET
下一篇:.NET開(kāi)發(fā)人員關(guān)于ML.NET的入門(mén)學(xué)習(xí)
本文標(biāo)題:docker部署Asp.net core應(yīng)用的完整步驟
本文地址:http://mengdiqiu.com.cn/a1/ASP_NET/10929.html
您可能感興趣的文章
- 01-11如何給asp.net core寫(xiě)個(gè)簡(jiǎn)單的健康檢查
- 01-11ASP.NET Core靜態(tài)文件的使用方法
- 01-11asp.net Core3.0區(qū)域與路由配置的方法
- 01-11ASP.Net Core中使用枚舉類(lèi)而不是枚舉的方法
- 01-11Asp.net core利用MediatR進(jìn)程內(nèi)發(fā)布/訂閱詳解
- 01-11ASP.NET Core中間件計(jì)算Http請(qǐng)求時(shí)間示例詳解
- 01-11asp.net core集成JWT的步驟記錄
- 01-11ASP.NET Core MVC學(xué)習(xí)教程之路由(Routing)
- 01-11ASP.NET Core實(shí)現(xiàn)自定義WebApi模型驗(yàn)證詳解
- 01-11Linux服務(wù)器下利用Docker部署.net Core項(xiàng)目的全過(guò)程


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-11vscode extension插件開(kāi)發(fā)詳解
- 01-11VsCode插件開(kāi)發(fā)之插件初步通信的方法
- 01-11如何給asp.net core寫(xiě)個(gè)簡(jiǎn)單的健康檢查
- 01-11.net core高吞吐遠(yuǎn)程方法如何調(diào)用組件
- 01-11淺析.Net Core中Json配置的自動(dòng)更新
- 01-11.NET開(kāi)發(fā)人員關(guān)于ML.NET的入門(mén)學(xué)習(xí)
- 01-11.NET Core 遷移躺坑記續(xù)集之Win下莫名其
- 01-11.net core webapi jwt 更為清爽的認(rèn)證詳解
- 01-11docker部署Asp.net core應(yīng)用的完整步驟
- 01-11ASP.NET Core靜態(tài)文件的使用方法
隨機(jī)閱讀
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實(shí)例總結(jié)
- 04-02jquery與jsp,用jquery
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什