Docker打包 Asp.Net Core應用,在CentOS上運行

来源:http://www.cnblogs.com/ibeisha/archive/2017/09/09/netcoreondocker.html
-Advertisement-
Play Games

本文主要介紹下運用docker虛擬技術打包Asp.net core應用。 Docker作為一個開源的應用容器引擎,近幾年得到廣泛的應用,使用Docker我們可以輕鬆實現應用的持續集成部署,一次打包,到處運行。 ...


本文主要介紹下運用docker虛擬技術打包Asp.net core應用。 Docker作為一個開源的應用容器引擎,近幾年得到廣泛的應用,使用Docker我們可以輕鬆實現應用的持續集成部署,一次打包,到處運行。

開篇借用百科上對docker的介紹。

    Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發佈到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面。

方便大家學習:

http://www.docker.org.cn/(中文站) 

https://www.docker.com/(英文站)

docker鏡像站:https://hub.docker.com/

【搭建環境】

系統:CentOS 7.0    容器:Docker 1.12.6          .Net Core版本: .NET Core 1.1

工具:putty、winScp

 

一、首先,我們先介紹下關於docker容器的安裝。

直接用黃狗安裝工具安裝docker。

 #安裝Docker
$ yum install docker
$ #啟動docker服務
$ systemctl  start docker.service
$ #配置開機啟動
$ systemctl  enable docker.service

 

安裝併成功啟動docker服務後,可以通過以下命令查看docker版本信息

docker version
Client:
 Version:         1.12.6
 API version:     1.24
 Package version: docker-1.12.6-32.git88a4867.el7.centos.x86_64
 Go version:      go1.7.4
 Git commit:      88a4867/1.12.6
 Built:           Mon Jul  3 16:02:02 2017
 OS/Arch:         linux/amd64

Server:
 Version:         1.12.6
 API version:     1.24
 Package version: docker-1.12.6-32.git88a4867.el7.centos.x86_64
 Go version:      go1.7.4
 Git commit:      88a4867/1.12.6
 Built:           Mon Jul  3 16:02:02 2017
 OS/Arch:         linux/amd64

  

docker客戶端、服務端版本信息都展示出來了。

二、安裝Docker加速器。

 我目前使用的阿裡開發者提供的docker加速服務。

有阿裡雲賬號直接登錄,https://dev.aliyun.com/search.html

如何使用Docker加速器

針對Docker客戶端版本大於1.10的用戶

您可以通過修改daemon配置文件/etc/docker/daemon.json來使用加速器:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://ihllojuv.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

為什麼要安裝Docker加速器?

摘自網友的話:眾所周知的原因,要想流暢地使用Docker,需要配置Docker加速器,否則你會覺得回到了撥號上網的時代 。

三、發佈Asp.Net Core程式。

 我這裡是新建了也給Asp.Net Core web程式。

紅色圈住部分,是後來手動添加進去的,dockerfile是你的應用部署到docker上所必須的配置信息,只是個不帶擴展名的純文本文件而已。hosting.json需要是配置服務啟動時,監聽信息。使用配置文件,需要手動修改Program.cs中的入口程式。

/// <summary>
        /// 
        /// </summary>
        /// <param name="args"></param>
        public static void Main(string[] args)
        {
            //實例化一個配置生成器
            var config = new ConfigurationBuilder()
          .SetBasePath(Directory.GetCurrentDirectory())
          .AddJsonFile("hosting.json", optional: true)//添加配置文件hosting.json
          .Build();

            var host = new WebHostBuilder()
                .UseKestrel()
                .UseConfiguration(config)//使用配置信息
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseStartup<Startup>()
                .UseApplicationInsights()
                .Build();

            host.Run();
        }

完成以上操作後,我們發佈這個demo程式,解決方案,右鍵發佈。

發佈成功後,預設在bin/release/publishOutPut文件夾下。

然後,我把publishOutPut重命名為publish後,通過WinScp工具把文件傳到root/docker/下。

另外,我們在網站根目錄下,創建的Dockerfile文件,排上用場了,我們編輯修改文件。

FROM microsoft/aspnetcore:1.1
COPY . /publish
WORKDIR /publish    
EXPOSE 80
CMD ["dotnet", "demo.dll"]

 指定容器對外暴露埠80。註意,COPY .後面有空格,表示是當前位置,意思是從當前位置複製文件到/publish目錄下。網上有篇博客,少了個.,導致copy requires at least one argument這樣的錯誤。

 

四、打包鏡像

首先,我們進入/docker/publish目錄

執行以下命令:

docker build -t demo-netcore .

  

意思是生成一個名為demo-netcore的鏡像。(註意:最後空格後面有一個.)。

這個命令會,根據當前目錄下dockerfile配置文件,進行打包。

[root@localhost publish]# docker build -t demo-netcore .
Sending build context to Docker daemon 17.84 MB
Step 1 : FROM microsoft/aspnetcore:1.1
 ---> 983c2fe9cbef
Step 2 : COPY . /publish
 ---> ae9533f162da
Removing intermediate container d8bdd1cb7061
Step 3 : WORKDIR /publish
 ---> Running in 06a5fbef40ea
 ---> c63de53ebe20
Removing intermediate container 06a5fbef40ea
Step 4 : EXPOSE 80
 ---> Running in 8d0eaa657905
 ---> 228e30d1bf74
Removing intermediate container 8d0eaa657905
Step 5 : EXPOSE 8080
 ---> Running in a38fd6c59d4a
 ---> ab126ceac6ae
Removing intermediate container a38fd6c59d4a
Step 6 : CMD dotnet demo.dll
 ---> Running in 7dc71cdf0f87
 ---> 96ef55dd9fc9
Removing intermediate container 7dc71cdf0f87
Successfully built 96ef55dd9fc9

打包成功。

接下來,看看我們打包好的鏡像。

[root@localhost publish]# docker images
REPOSITORY                       TAG                 IMAGE ID            CREATED              SIZE
demo-netcore                     latest              96ef55dd9fc9        About a minute ago   322.8 MB
docker.io/microsoft/aspnetcore   1.1                 983c2fe9cbef        23 hours ago         305.1 MB
[root@localhost publish]#

因為,剛打包的鏡像demo-netcore是基於docker.io/microsoft/aspnetcore鏡像的,所以在打包demo-netcore的過程中,會優先從鏡像庫中拉取docker.io/microsoft/aspnetcore鏡像。至此,我們的第一個docker鏡像就打包成功了。接下來,在容器中運行鏡像。

五、運行docker容器

docker run --name demo  -p 8080:80 demo-netcore:late

其中,demo是制定容器的名稱,-p是進行宿主和容器之間埠的映射,(-p 宿主埠:容器埠),

 執行完以上命令後,正常情況下,會出現如下內容:

Hosting environment: Production
Content root path: /publish
Now listening on: http://+:80
Application started. Press Ctrl+C to shut down.

  這表明,你的asp.net core程式已經成功在docker容器中運行,監聽埠為80。這個80指的是容器的埠,以上信息都是在容器中執行的結果輸出。它會提示,按Ctrl+C終止當前應用程式。如果在執行docker run的時候,加上 -d命令,這樣容器就會一直運行,即使關掉終端視窗。於是,我們想讓docker程式一直運行,以上命令可以修改為:

docker run --name demo -d -p 808

  檢驗docker容器是否運行成功,執行如下命令:

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE                 COMMAND             CREATED                                                      STATUS              PORTS                            NAMES
1abf4952db5b        demo-netcore:latest   "dotnet demo.dll"   About a minute ago   

  

以上信息可以看到,容器ID,容器名稱,命令,鏡像名稱,

由於,我再dockerfier文件中,配置宿主的埠為8080,那麼我們訪問容器中的asp.net core程式時,需要通過8080埠訪問,完成以上步驟,接下來讓我們看下結果吧!瀏覽器打開http://localhost:8080或者執行

wget http://localhost:8080

  

第一個asp.net core docker應用運行起來了!

以下,是在本次操作中,常用的幾個docker命令。

 

#生成鏡像
docker build -t demo-netcore .

#運行容器
docker run --name demo  -p 8080:80 demo-netcore:latest


#刪除所有容器進程
docker rm $(docker ps -a -q)

#刪除一個鏡像
docker rmi 鏡像ID

#查看所有鏡像
docker images

  關於怎樣把本地鏡像推送到hub.docker.com,請訪問我的另一篇博客《推送docker 鏡像到hub.docker.com》

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在前面一篇博文記錄了C#中的APM非同步編程的知識,今天再來分享一下EAP(基於事件的非同步編程模式)非同步編程的知識。後面會繼續奉上TPL任務並行庫的知識,喜歡的朋友請持續關註哦。 ...
  • 1 概述 1 概述 本篇文章主要從操作上簡要分析Controller<=>View之間相互傳值,關於頁面之間傳值,如果感興趣,可參考我另外一篇文章ASP.NET 頁面之間傳值的幾種方式 。 Controller=》View:Model,ViewBag,ViewData,TempData,ViewBa ...
  • 距離上次發東西已經過去了貌似不知多少天了,突然發現自己懶得總結了。這毛病感覺不好,還得寫點東西來充實一下自己,不然這樣整天渾渾噩噩的過日子,也太平淡了,不管怎麼說,起碼得給自己的經歷留下點東西吧。閑話不扯了,最近一直在忙著搞GIS的東西;國內主流的二大地圖:百度和高德地圖,確實直接調用SDK是很不錯 ...
  • 但是這種操作方式存在兩個問題:1.通過反射的方式,效率不高。2.如果是一個感測器,那麼定義的實時數據屬性不多;如果是一個站點(可以理解為生產單位或網關層)上傳的數據,可能有成千上萬監測點,那麼不可能在繼承DeviceDynamic介面的子類中定義這麼多屬性。 ...
  • 本篇作為技術分享系列的第一篇,詳細講一下 SVG 的解析和繪製,這部分功能的研究和最終實現由團隊的 @黃超超 同學負責,感謝提供技術文檔和支持。 首先我們來看一下 SVG 的文件結構和組成 SVG (Scalable Vector Graphics) 是一種可縮放矢量圖形,使用 XML 格式來定義, ...
  • 開篇先來說一下寫這篇文章的初衷。 初到來畫,通讀了來畫 UWP App 的代碼,發現裡面確實有很多比較高深的技術點,同時也是有很多問題的,擴展性,耦合,性能,功能等等。於是我們決定從頭重構這個產品,做一個全新的 “來畫Pro” 出來,歷經三個月的世間,這個產品終於正式上架。 (做個小廣告,在 Win ...
  • 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 8 namespace Wrox.Pro... ...
  • 上個月在網上看到一個用web實現簡單AR效果的文章,然後自己一路折騰,最後折騰出來一個 Asp.net+WebSocket+Emgucv實時人臉識別的東西,網上也有不少相關資料,有用winform的也有asp.net的。其實人臉識別技術早就成熟了,就是沒機會接觸這方面。百度了一下 找到好多,Jque ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...