主頁 > .NET開發 > Docker 跨平臺在 netCore 中的從入門到部署

Docker 跨平臺在 netCore 中的從入門到部署

2020-09-12 11:10:24 .NET開發

[跨平臺系列三Docker篇]:ASP.NET Core應用

前言

從題目我們可以看的出,今天是五部曲的第三部,你可能會好奇,為啥沒有見到前兩部呢?這里我簡單說下:

1、跨平臺第一部曲:MySql

如果你看我的所有開源專案,應該能發現我已經全部遷移到了Mysql資料庫了,這里不是說SqlServer就不是不跨平臺了,只是MySql用著可能更好些,當然,如果你是買的單獨資料庫服務器,比如阿里云的RDS資料庫,Azure DataBase資料庫的話,那就完全另說了,

[跨平臺系列三Docker篇]:ASP.NET Core應用

當然,不僅僅遷移過去就行了,這只是一個開頭,后期還是有很多東西,需要自己好好研究,比如快取,資料一致性,索引,存盤,鎖,佇列等等知識,只有用到了才會打開進一步專研的大門,

2、跨平臺第二部曲:Linux

既然要跨平臺,那多平臺的學習就是基礎中的基礎,重中之重了,相信每個人windows服務器已經玩兒到飛起了,所以Linux的學習和研究就很有必要,

我之前有篇文章已經對我的所有專案做了遷移,還是比較詳細的:

《[最全操作指南] 在線六個專案全部遷移Linux》

還是那句話,只有用了,才會去研究,螃蟹這東西,如果沒吃過,永遠不會知道是酸的還是甜的,因為這個Linux遷移基礎的比較簡單,或者說是一個長期學習的東西,所以一篇文章就搞定了,

3、剩下三部曲

從今天開始呢,我打算用三篇講解下Docker相關內容,打算把我六個在線專案都遷移到Docker上,等我完全搞懂了,就開始錄視頻說說,雖然我一直認為官網是最好的老師,因為今天不會講Docker的基本知識,所以到時候我會在視頻教程里詳細說

說完Docker,就說一說CI/CD相關的內容,應該就是基于Docker+Jenkins的吧,

最后一部曲就是K8S一把梭了,

(PS:我的講解速度,取決于各位的素質三連的速度了??)

好啦,今天就說說Docker在netCore中的從入門到部署吧!

1、服務器與工具準備

首先我們需要一個服務器,以后我都是用的Linux了,所以還是果斷的買了一個CentOS系統的服務器,相關配置:

[跨平臺系列三Docker篇]:ASP.NET Core應用

 

本次所用到的工具主要有:

1、git:提供源代碼管理;

2、docker:容器服務;

3、dotnetcore:SDK環境;

4、nginx:服務器代理;

[跨平臺系列三Docker篇]:ASP.NET Core應用

購買然后登錄上服務器,我們開始一一安裝,

2、安裝輔助工具

1、更新系統 [可選]

新買的系統,我們可以更新一下,畢竟有些包或者依賴最新的還是更好的,不過也不是必須的,
sudo yum update
預計310M,預計10~20分鐘

[跨平臺系列三Docker篇]:ASP.NET Core應用

2、安裝Git [可選]

我們如果要構建鏡像的話,肯定需要發布好的問題+Dockerfile,那發布有三種方式: 第一種就是本地發布,拷貝到服務器,build 鏡像;

第二種是本地發布,然后本地build,推到倉庫里,服務器拉取;

第三種就是服務器PULL代碼,然后服務器發布,再build;

我習慣了第三種,所以我這里安裝Git了,

sudo yum -y install git
預計5m,1~5分鐘

[跨平臺系列三Docker篇]:ASP.NET Core應用

3、安裝Nginx [必要]

我們創建好的容器run后,Docker會自己守護這個行程,但是還是需要一個服務器來做代理和反向代理,一般常用的就是Nginx了:
sudo yum install nginx
預計14m,1~5分鐘

啟用和啟動服務:

sudo systemctl enable nginx sudo systemctl start nginx

[跨平臺系列三Docker篇]:ASP.NET Core應用

4、安裝Dotnet SDK [核心]

每臺計算機只需要執行一次此操作,

sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm

[跨平臺系列三Docker篇]:ASP.NET Core應用

sudo yum install dotnet-sdk-3.1

預計119M,20~30分鐘,這個時間比較長,所以你可以考慮在本地發布好,ftp到服務器,當然如果創建了sdk,以后就省事兒了,反正各有利弊,

[跨平臺系列三Docker篇]:ASP.NET Core應用

 

安裝成功,測驗一下版本:

dotnet --list-sdks

[跨平臺系列三Docker篇]:ASP.NET Core應用

完成!

到了這里,我們輔助工具已經安裝完成了,接下來,重頭戲就來了——Docker安裝,

3、安裝Docker環境

1、安裝Docker源

首先,我們可以先執行下卸載命令,如果你之前安裝過,或者系統自帶了,需要卸載干凈:
sudo yum remove docker-ce

[跨平臺系列三Docker篇]:ASP.NET Core應用

然后我們就可以安裝指定的源了,有官方版本和阿里云版本,我這里嘗試使用阿里云版本的吧,聽說會快一些,
Step 1: 安裝必要的一些系統工具 sudo yum install -y yum-utils device-mapper-persistent-data lvm2

Step 2: 添加軟體源資訊
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

Step 3: 更新并安裝Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce

Step 4: 開啟Docker服務
sudo service docker start


安裝預計 5 分鐘

[跨平臺系列三Docker篇]:ASP.NET Core應用

設定docker開機啟動

systemctl enable docker

啟動docker

systemctl start docker

查看版本

docker --versio

[跨平臺系列三Docker篇]:ASP.NET Core應用

2、測驗Hello World

檢查docker是否可以正常運行(運行hello-world鏡像,如果本機沒有hello-world鏡像,系統會自動拉取hello-world鏡像)
docker run hello-world
如果本地沒有改鏡像,會自動從遠程倉庫拉取,然后再生成容器,

[跨平臺系列三Docker篇]:ASP.NET Core應用

這個時候,我們可以來檢查一下:

當前服務器有哪些鏡像:

docker images

[跨平臺系列三Docker篇]:ASP.NET Core應用

可以看到,這個就是剛剛我們拉取的鏡像:名稱是hello-world,ID是bf756fb1ae65,大小13.3k的鏡像,

那如何查看有哪些容器呢:

docker ps -a

[跨平臺系列三Docker篇]:ASP.NET Core應用

這個就是剛剛我們看到有輸出內容的容器:容器ID是4fb4bdc352ff,鏡像是hello-world,狀態是已退出,

PS:這里的鏡像就像我們定義了一個hello的Class類,
容器呢,就是這個class類生成的物件,當然可以創建很多個,

這個時候,我們的環境已經已經搞好了,接下來就是重中之重,將我們的專案發布鏡像檔案了,

4、發布自己的鏡像

1、添加Docker支持

這個操作是很簡單的,我們打開Blog.Core專案,選擇Web層,然后添加Docker支持:

[跨平臺系列三Docker篇]:ASP.NET Core應用

 
會生成一個Dockerfile的檔案,默認的資訊比較多,目前我就來個最簡單的精簡版:
FROM swr.cn-south-1.myhuaweicloud.com/mcr/aspnet:3.1-alpine
WORKDIR /app
COPY . . 
EXPOSE 8081 
ENTRYPOINT ["dotnet", "Blog.Core.dll","-b","0.0.0.0"]
 

簡介一下:

FROM:意思是我們的專案源鏡像是哪個;

WORKDIR:鏡像的作業目錄;

COPY:復制檔案(將Dockerfile所在目錄下檔案復制到鏡像中的作業目錄中)
EXPOSE:容器要開放的埠(我們用.NETCORE的8081埠)
ENTRYPOINT:為容器啟動后要執行的命令 (這里將執行dotnet Blog.Core.dll命令)

然后右鍵,始終屬性、始終復制到輸出(bin)目錄:

[跨平臺系列三Docker篇]:ASP.NET Core應用

接下來就是上次到Github了,

2、發布

我們在服務器用Git將代碼PULL下來,然后執行發布命令,我用一個批處理檔案,直接一鍵生成(主要是防止漏掉檔案):

[跨平臺系列三Docker篇]:ASP.NET Core應用

 

執行發布命令:

[跨平臺系列三Docker篇]:ASP.NET Core應用

就可以看到生成好的發布檔案夾.PublishFiles,

接下來就是docker 編譯鏡像了,

3、創建鏡像

進入到我們的發布檔案夾.PublishFiles檔案夾下,我們測驗一下這個檔案是否正常:
dotnet Blog.Core.dll

[跨平臺系列三Docker篇]:ASP.NET Core應用

可以看到已經正常的監聽了8081埠,這里要注意一下,我們在Program.cs檔案中,需要配置這樣:
.UseUrls("http://*:8081")
否則的話,系統找不到我們對應的埠資訊,

沒問題后,開始build了,還是在當前檔案夾下(記得那個點):

docker build -t laozhang/apkimg .
其中laozhang/apkimg是我們的鏡像名,

[跨平臺系列三Docker篇]:ASP.NET Core應用

因為我們的Dockerfile是五步,所以這里也正好是5個Step,

然后查看機器上的鏡像:

[跨平臺系列三Docker篇]:ASP.NET Core應用

這里多了兩個鏡像,一個是我們的鏡像ID為af75a6d4a8ad,大小146M的專案檔案,一個是我們Dockerfile的源鏡像,

4、推送鏡像到Docker hub倉庫

既然咱們有了鏡像,如果每次使用都要build,肯定是不對的,咱們可以統一推送到Hub倉庫里,

先注冊
(注意注冊的時候,第一個選項,這個Docker ID是我們創建的鏡像的ID,

也就是laozhangisphi/apkimg的laozhangisphi
當然如果不一樣,你后期也可以自己做配置,不要方,

[跨平臺系列三Docker篇]:ASP.NET Core應用

第二:驗證完郵件后,登錄,創建倉庫

[跨平臺系列三Docker篇]:ASP.NET Core應用

[跨平臺系列三Docker篇]:ASP.NET Core應用

 

第三步:服務器鏡像推送

[跨平臺系列三Docker篇]:ASP.NET Core應用

然后登錄賬號

[跨平臺系列三Docker篇]:ASP.NET Core應用

推送:
docker push laozhangisphi/apkimg:tagname
[跨平臺系列三Docker篇]:ASP.NET Core應用

檢查:

我們登錄管理后臺,查看結果

[跨平臺系列三Docker篇]:ASP.NET Core應用

可以看到已經成功推送了,這樣的話,我們就可以在任何的地方使用我的鏡像啦,
docker pull laozhangisphi/apkimg:latest
 

現在我們有了鏡像,那就可以創建容器了,因為有了容器才能運行,

5、生成并運行容器

生成容器

有了鏡像,我們來生成一個容器:
docker run -it -p 8081:8081 laozhang/apkimg 
8081是我們的埠號,然后后邊的laozhang/apkimg是我們的鏡像名,

[跨平臺系列三Docker篇]:ASP.NET Core應用

 
會看到輸出內容,如果沒有報錯的話,就恭喜啦,退出當前行程,查看下有哪些容器:

[跨平臺系列三Docker篇]:ASP.NET Core應用

這時候可以看到多了一個容器ID為53d047bb3a66,鏡像是laozhang/apkimg的容器,不過我們的專案容器是退出狀態,需要開啟下:
docker start 53d047bb3a66
 

[跨平臺系列三Docker篇]:ASP.NET Core應用

 

狀態已經是運行中了,那怎么測驗介面是否正常了呢,可以用curl命令:

curl http://localhost:8081/api/blog
 

[跨平臺系列三Docker篇]:ASP.NET Core應用

如果到了這里,恭喜你,Docker部署NetCore基本已經搞定了,如果你想看看容器內的日志資訊,

查看日志

直接輸入命令:
docker logs 53d047bb3a66

其他常用命令

查看所有鏡像 docker images

洗掉一個imageid的鏡像
docker rmi [IMAE_ID]

#洗掉所有鏡像
sudo docker rmi $(docker images -q)

#查看所有容器運行狀態
docker ps -a
docker container ls -all

#洗掉一個containerid的容器(實體)
docker rm 6f0c67de4b72

#洗掉所有容器
docker rm $(sudo docker ps -a -q)

容器日志

#查看指定時間后的日志,只顯示最后100行:
docker logs -f -t --since="2019-06-08" --tail=100 CONTAINER_ID

#查看某時間之后的日志:
docker logs -t --since="2019-06-08" CONTAINER_ID

#查看某時間段日志:
docker logs -t --since="2019-06-08" --until "2019-06-09" CONTAINER_ID

#查看最近30分鐘的日志:
docker logs --since 30m CONTAINER_ID

程序

1、停止容器 docker stop 5ab35ebcb6e2

2、洗掉容器 docker rm 5ab35ebcb6e2

3、洗掉鏡像 docker rmi 7567a38d491c

4、啟動容器 docker start 685cb02f53

剩下最后一步了,nginx代理,因為我們的Docker已經守護了這個行程,所以我們不需要其他的守護行程的作業,

6、Nginx代理服務

進入/etc/nginx/檔案夾
修改nginx.conf檔案,這里你可以使用 vim ,也可以下載到本地,修改,然后再提交上去,看自己的需要了,反正vim也很簡單,就是那幾個命令:

vim xxx

i

:wq!

如果看不懂,還是下載本地修改吧,

修改的內容如下:

###### apk begin #######
server {
listen 9001;
server_name localhost;


location / {
root html;
proxy_pass http://localhost:8081;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;


index index.html index.htm;
}




  
}


###### apk end #######

接下來就是重啟Nginx服務,首先可以檢測語法錯誤:

nginx -t

[跨平臺系列三Docker篇]:ASP.NET Core應用

nginx -s reload
這個時候,如果沒報錯,那恭喜,專案啟動成功了!

http://192.144.227.46:9001/index.html

好啦,今天到這里已經完全說完了,整個程序大約2個小時,中間沒發現什么問題,因為我有Linux的基礎,所以總體還是很簡單的,主要就是docker的那幾個常用命令,需要看檔案查一查,加油!

來源:老張的哲學

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/13546.html

標籤:.NET Core

上一篇:.Net Core微服務入門全紀錄(一)——專案搭建

下一篇:基于 abp vNext 和 .NET Core 開發博客專案 - Blazor 實戰系列(四)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more