日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.NET Core容器化@Docker

發(fā)布時間:2025/3/15 asp.net 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET Core容器化@Docker 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)自圣杰。https://www.jianshu.com/p/23465dc86d3e

.NET Core容器化@Docker

圣杰 已關(guān)注 2017.12.22 21:59* 字數(shù) 2999 閱讀 49評論 0

溫馨提示:本文適合動手演練,效果更佳。

?

1. 引言

我們知道. NET Core最大的特性之一就是跨平臺,而對于跨平臺,似乎大家印象中就是可以在非Windows系統(tǒng)上部署運行。而至于如何操作,可能就有所欠缺。那這一節(jié)我們就結(jié)合簡單實例一步一步教你如何借助Docker來容器化 .NET Core應(yīng)用,以完成跨平臺的構(gòu)建和部署。

2. 環(huán)境準備

自從玩.NET就一直和Windows系統(tǒng)打交道,如果還基于Windows來展開本節(jié)內(nèi)容,不就跑題了嗎?!那咱們就切換到Linux系統(tǒng)。
如果沒有Linux基礎(chǔ)和Docker基礎(chǔ),請自覺完成以下兩個實驗:
騰訊云開發(fā)者實驗室:Linux 基礎(chǔ)入門
騰訊云開發(fā)者實驗室:搭建 Docker 環(huán)境

完成了以上兩個實驗后,我們就離Linux的世界更近一步。
因為后續(xù)是基于Linux-CentOS系統(tǒng)進行實操演練,沒有Linux上機環(huán)境的,可以考慮從騰訊云實驗室列表找一個CentOS相關(guān)的實驗項目作為本文的演練環(huán)境。

3. Docker簡介

在開始之前,有必要對Docker做一下簡單了解,可以參考我的上一篇文章Hello Docker。
這里就簡要的再重復(fù)一下。
Docker是用Go語言編寫基于Linux操作系統(tǒng)的一些特性開發(fā)的,其提供了操作系統(tǒng)級別的抽象,是一種容器管理技術(shù),它隔離了應(yīng)用程序?qū)A(chǔ)架構(gòu)(操作系統(tǒng)等)的依賴。相較于虛擬機而言,Docker共享的是宿主機的硬件資源,使用容器來提供獨立的運行環(huán)境來運行應(yīng)用。虛擬機則是基于Supervisor(虛擬機管理程序)使用虛擬化技術(shù)來提供隔離的虛擬機,在虛擬機的操作系統(tǒng)上提供運行環(huán)境!雖然兩者都提供了很好的資源隔離,但很明顯Docker的虛擬化開銷更低!
Docker涉及了三個核心概念:Register、Image、Container。

  • Registry:倉庫。用來存儲Docker鏡像,比如Docker官方的Docker Hub就是一個公開的倉庫,在上面我們可以下載我們需要的鏡像。
  • Image:鏡像。開發(fā)人員創(chuàng)建一個應(yīng)用程序或服務(wù),并將它及其依賴關(guān)系打包到一個容器鏡像中。鏡像是應(yīng)用程序的配置及其依賴關(guān)系的靜態(tài)形式。
  • Container:容器。Container是鏡像的運行實例,它是一個隔離的、資源受控的可移植的運行時環(huán)境,其中包含操作系統(tǒng)、需要運行的程序、運行程序的相關(guān)依賴、環(huán)境變量等。
  • 它們?nèi)叩南嗷プ饔藐P(guān)系是:
    當我們執(zhí)行Docker pull或Docker run命令時,若本地無所需的鏡像,那么將會從倉庫(一般為DockerHub)下載(pull)一個鏡像。Docker執(zhí)行run方法得到一個容器,用戶在容器里執(zhí)行各種操作。Docker執(zhí)行commit方法將一個容器轉(zhuǎn)化為鏡像。Docker利用login、push等命令將本地鏡像推送(push)到倉庫。其他機器或服務(wù)器上就可以使用該鏡像去生成容器,進而運行相應(yīng)的應(yīng)用程序。

    4. 安裝Docker

    4.1. 使用腳本自動安裝Docker

    在測試或開發(fā)環(huán)境中 Docker 官方為了簡化安裝流程,提供了一套便捷的安裝腳本,CentOS系統(tǒng)上可以使用這套腳本安裝:

    //使用腳本自動化安裝Docker $ curl -fsSL get.docker.com -o get-docker.sh $ sudo sh get-docker.sh --mirror Aliyun

    4.2. 啟動Docker

    執(zhí)行這個命令后,腳本就會自動的將一切準備工作做好,并且把 Docker CE 的 Edge 版本安裝在系統(tǒng)中。

    //啟動 Docker CE $ sudo systemctl enable docker $ sudo systemctl start docker //查看docker版本 $ sudo docker -v Docker version 1.12.6, build ec8512b/1.12.6

    4.3 測試Docker是否正確安裝

    命令行執(zhí)行docker run hello-world:

    $ docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world ca4f61b1923c: Pull complete Digest: sha256:be0cd392e45be79ffeffa6b05338b98ebb16c87b255f48e297ec7f98e123905c Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://cloud.docker.com/ For more examples and ideas, visit: https://docs.docker.com/engine/userguide/

    當執(zhí)行docker run hello-world時,docker首先會從本地找hello-world的鏡像,如果本地沒有,它將會從默認的鏡像倉庫Docker Hub上拉取鏡像。鏡像拉取到本地后,就實例化鏡像得到容器,輸出Hello from Docker!。

    4.4. 配置鏡像加速

    因為默認的鏡像倉庫遠在國外,拉取一個小的鏡像時間還可以忍受,若拉取一個上G的鏡像就有點太折磨人了,我們使用DaoCloud鏡像加速器來進行鏡像加速。Linux上配置方法如下:

    $ curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://37bb3af1.m.daocloud.io` $ sudo systemctl restart docker

    5. Hello Docker With .NET Core

    Docker安裝完畢,我們來結(jié)合.NET Core玩一玩吧。

    5.1. 拉取microsoft/dotnet鏡像

    命令行執(zhí)行docker pull microsoft/dotnet,等幾分鐘后即可安裝完畢,執(zhí)行docker images可以看到本地已經(jīng)包含microsoft/dotnet、docker.io/hello-world兩個鏡像。

    5.2. 運行microsoft/dotnet鏡像

    使用docker run <image>可以啟動鏡像,通過指定參數(shù)-it以交互模式(進入容器內(nèi)部)啟動。依次執(zhí)行以下命令:

    //啟動一個dotnet鏡像 $ docker run -it microsoft/dotnet //創(chuàng)建項目名為HelloDocker.Web的.NET Core MVC項目 dotnet new mvc -n HelloDocker.Web //進入HelloDocker.Web文件夾 cd HelloDocker.Web //啟動.NET Core MVC項目 dotnet run

    運行結(jié)果如下所示:

    [root@iZ288a3qazlZ ~]# docker run -it microsoft/dotnet root@816b4e94de67:/# dotnet new mvc -n HelloDocker.Web The template "ASP.NET Core Web App (Model-View-Controller)" was created successfully. This template contains technologies from parties other than Microsoft, see https://aka.ms/template-3pn for details.Processing post-creation actions... Running 'dotnet restore' on HelloDocker.Web/HelloDocker.Web.csproj...Restoring packages for /HelloDocker.Web/HelloDocker.Web.csproj...Generating MSBuild file /HelloDocker.Web/obj/HelloDocker.Web.csproj.nuget.g.props.Generating MSBuild file /HelloDocker.Web/obj/HelloDocker.Web.csproj.nuget.g.targets.Restore completed in 1.83 sec for /HelloDocker.Web/HelloDocker.Web.csproj.Restoring packages for /HelloDocker.Web/HelloDocker.Web.csproj...Restore completed in 376.14 ms for /HelloDocker.Web/HelloDocker.Web.csproj.Restore succeeded.root@816b4e94de67:/# cd HelloDocker.Web root@816b4e94de67:/HelloDocker.Web# dotnet run warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]No XML encryptor configured. Key {727df196-978f-4df8-b3d3-e92a77e410ee} may be persisted to storage in unencrypted form. Hosting environment: Production Content root path: /HelloDocker.Web Now listening on: http://localhost:5000 Application started. Press Ctrl+C to shut down.

    鍵盤按住Ctrl+C即可關(guān)閉應(yīng)用,輸入exit即可退出當前容器。

    是不是簡單的幾步就完成了一個.NET Core MVC項目的創(chuàng)建和運行?!這個時候你可能會好奇,Linux宿主機上并沒有安裝.NET Core SDK啊,MVC項目是如何創(chuàng)建的呢?這就是Docker神奇的地方,我們從鏡像倉庫中拉取的dotnet鏡像,包含了創(chuàng)建、構(gòu)建、運行.NET Core項目所需的一切依賴和運行時環(huán)境。

    退出容器之后,執(zhí)行find -name HelloDocker.Web(查找HelloDocker.Web文件),我們發(fā)現(xiàn)并沒有找到。這說明我們剛才創(chuàng)建的.NET Core MVC項目是在容器內(nèi)部創(chuàng)建的,是與宿主機完全隔離的。這個時候你可能會想,每次都要在容器中安裝源代碼太不方便了,我們能不能讓容器運行我們宿主機的源代碼項目?嗯,這是個好問題。下面我們就來解答這個問題。

    5.3. 掛載源代碼

    為了在宿主機上創(chuàng)建.NET Core 項目,這個時候我們就需要在Linux宿主機上安裝.NET Core SDK。

    5.3.1. 宿主機安裝.NET Core SDK

    步驟如下:

    sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc sudo sh -c 'echo -e "[packages-microsoft-com-prod]\nname=packages-microsoft-com-prod \nbaseurl= https://packages.microsoft.com/yumrepos/microsoft-rhel7.3-prod\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/dotnetdev.repo' sudo yum update sudo yum install libunwind libicu sudo yum install dotnet-sdk-2.1.3

    安裝完畢后,我們依次執(zhí)行以下命令創(chuàng)建一個.NET Core MVC項目:

    //回到根目錄 $ cd $HOME //創(chuàng)建demo文件夾 $ mkdir demo $ cd demo //創(chuàng)建項目名為HelloDocker.Web的.NET Core MVC項目 dotnet new mvc -n HelloDocker.Web //進入HelloDocker.Web文件夾 cd HelloDocker.Web //啟動.NET Core MVC項目 dotnet run

    如果知道本機的ip地址的話(可以使用ifconfig命令查詢),直接瀏覽器訪問http://<ip address>:5000即可訪問我們剛剛運行的MVC項目。

    這一步我們就在$HOME/demo/HelloDocker.Web目錄下成功創(chuàng)建了MVC項目,下一步我們就將該目錄下的源碼項目通過掛載的方式共享到容器中去。

    5.3.2. 掛載宿主機項目到容器中

    在啟動Docker鏡像時,Docker允許我們通過使用-v參數(shù)掛載宿主機的文件到容器的指定目錄下。換句話說,就相當于宿主機共享指定文件供容器去訪問。廢話不多說,實踐出真知。

    // 命令中的`\`結(jié)合`Enter`鍵構(gòu)成換行符,允許我們換行輸入一個長命令。 $ docker run -it \ -v $HOME/demo/HelloDocker.Web:/app \ microsoft/dotnet:latest

    上面的命令就是把$HOME/demo/HelloDocker.Web文件夾下的文件掛載到容器的\app目錄下。

    [root@iZ288a3qazlZ HelloDocker.Web]# docker run -it \ > -v $HOME/demo/HelloDocker.Web:/app \ > microsoft/dotnet:latest root@d70b327f4b7e:/# ls app bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@d70b327f4b7e:/# cd app root@d70b327f4b7e:/app# ls Controllers HelloDocker.Web.csproj Models Program.cs Startup.cs Views appsettings.Development.json appsettings.json bundleconfig.json obj wwwroot root@d70b327f4b7e:/app# dotnet run warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]No XML encryptor configured. Key {09a69edf-c1c5-4909-ad24-15a43a572fca} may be persisted to storage in unencrypted form. Hosting environment: Production Content root path: /app Now listening on: http://localhost:5000 Application started. Press Ctrl+C to shut down.

    從上面的執(zhí)行結(jié)果來看,容器內(nèi)部中的app目錄下包含了宿主機上的源碼項目。
    上面說到是以共享的形式,而不是容器擁有一份宿主機目錄的拷貝,意味著,在宿主機上對目錄的更改,會即時反應(yīng)到容器中。但反過來,容器中對共享目錄的更改,不會反應(yīng)到宿主機上,不然就打破了容器具有的隔離特性。

    通過這樣一個簡單場景,聰明的你是否會聯(lián)想到這一場景在我們?nèi)粘>幋a的應(yīng)用之處呢?是的,我們可以用來持續(xù)構(gòu)建(CI)。基本思路是,通過git clone源碼到宿主機上,然后將源碼目錄掛載到容器中去進行構(gòu)建。

    5.4. 借助Dockerfile

    Dockerfile用來定義你將要在容器中執(zhí)行的系列操作。我們來創(chuàng)建第一個Dockerfile:

    //確保進入我們創(chuàng)建的MVC項目目錄中去 $ cd $HOME/demo/HelloDocker.Web //使用touch命令創(chuàng)建Dockerfile $ touch Dockerfile //使用vi命令編輯Dockerfile vi Dockerfile

    進入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ù)制當前目錄(其中.即代表當前目錄)到容器中的/app目錄下
  • 使用RUN命令指定容器中執(zhí)行的命令
  • 使用EXPOSE指定容器暴露的端口號
  • 使用ENV指定環(huán)境參數(shù),上面用來告訴.NETCore項目在所有網(wǎng)絡(luò)接口上監(jiān)聽5000端口
  • 使用ENTRYPOINT制定容器的入口點
  • Dockerfile就緒,我們就可以將我們當前項目打包成鏡像以分發(fā)部署。
    使用docker build -t <name> <path>指令打包鏡像:

    $ docker build -t hellodocker.web .

    以上命令就是告訴docker將當前目錄打包成鏡像,并命名為hellodocker.web。命令執(zhí)行完畢,輸入docker images即可看到我們新打包的鏡像。鏡像創(chuàng)建完畢我們就可以直接運行了:

    docker run -d -p 80:5000 hellodocker.web

    上面的指令就是運行我們新打包的鏡像,并通過-p參數(shù)映射容器的5000到宿主機的80端口,其中-d參數(shù)告訴docker以后臺任務(wù)形式運行鏡像。因為80是默認的web端口,所以我們通過瀏覽器直接訪問ip即可訪問到我們?nèi)萜髦羞\行的MVC網(wǎng)站。或者通過curl -i http://localhost來驗證。操作示例如下:

    [root@iZ288a3qazlZ HelloDocker.Web]# docker build -t hellodocker.web . Sending build context to Docker daemon 3.3 MB Step 1 : FROM microsoft/dotnet:latest---> 7d4dc5c258eb Step 2 : WORKDIR /app---> Using cache---> 98d48a4e278c Step 3 : COPY . /app---> d5df216b274a Removing intermediate container 0a70f0f2b681 Step 4 : RUN dotnet restore---> Running in 0c8a9c4d5ba1Restore completed in 939.01 ms for /app/HelloDocker.Web.csproj.Restoring packages for /app/HelloDocker.Web.csproj...Restore completed in 1.38 sec for /app/HelloDocker.Web.csproj.---> 479f6b5cc7f0 Removing intermediate container 0c8a9c4d5ba1 Step 5 : EXPOSE 5000---> Running in f97feceb7f1b---> 562a95328196 Removing intermediate container f97feceb7f1b Step 6 : ENV ASPNETCORE_URLS http://*:5000---> Running in 403d8e2e25a6---> 16b7bd572410 Removing intermediate container 403d8e2e25a6 Step 7 : ENTRYPOINT dotnet run---> Running in 0294f87ce3fd---> 532e44a7fd54 Removing intermediate container 0294f87ce3fd Successfully built 532e44a7fd54 [root@iZ288a3qazlZ HelloDocker.Web]# docker run -d -p 80:5000 hellodocker.web 9d28bb3fa553653e4c26bf727715c82a837a2c224a0942107f3fab08c0a2686d [root@iZ288a3qazlZ HelloDocker.Web]# curl -i http://localhost HTTP/1.1 200 OK Date: Sat, 23 Dec 2017 14:23:15 GMT Content-Type: text/html; charset=utf-8 Server: Kestrel Transfer-Encoding: chunked

    至此,我們借助Docker就完美的完成了.NET Core項目的容器化部署。

    結(jié)束了?還沒有!

    我打包的鏡像是保存在本地的,我如何把鏡像部署到其他機器上呢?請繼續(xù)看。

    6. 推送鏡像到倉庫

    在第三節(jié)中,我們就簡要介紹了,有個Registry是專門用來存儲鏡像的。請自行到Docker Hub注冊個賬號,然后我們把本地打包的鏡像放到自己賬號下的倉庫下不就得了?!
    注冊完畢后,執(zhí)行docker login:

    [root@iZ288a3qazlZ HelloDocker.Web]# docker login Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. Username: shengjie Password: Login Succeeded [root@iZ288a3qazlZ HelloDocker.Web]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hellodocker.web latest 532e44a7fd54 13 minutes ago 1.745 GB

    再執(zhí)行docker push:

    $ docker push hellodocker.web Error response from daemon: You cannot push a "root" repository. Please rename your repository to docker.io/<user>/<repo> (ex: docker.io/shengjie/hellodocker.web)

    推送失敗,提示我們的鏡像命名不符規(guī)范。原來在推送之前要把鏡像按<user>/<repo>格式來命名。那如何重命名呢,我們用打標簽的方式重命名:

    $ docker tag hellodocker.web shengjie/hellodocker.web:v1 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE hellodocker.web latest 532e44a7fd54 35 minutes ago 1.745 GB shengjie/hellodocker.web v1 532e44a7fd54 35 minutes ago 1.745 GB $ docker push shengjie/hellodocker.web The push refers to a repository [docker.io/shengjie/hellodocker.web] 774b128a8c4f: Pushed 7bf42a9b5527: Pushed bd7f01c2dc6f: Pushed ....

    換一臺機器,我們直接執(zhí)行以下命令,就完成了多重部署。

    docker run -p 80:5000 <username>/hellodocker.web:v1

    7.最后

    如果你一步一步跟著練習的話,相信你對Docker以及.NET Core的跨平臺特性有了初步的理解,也相信你對Docker的Build, Ship, and Run Any App, Anywhere有了更深的體會。

    本文的實戰(zhàn)演練就先到這里,下一篇,我們來看如何借助Docker使用Nginx完成.NET Core Web項目的反向代理!!!

    參考資料

    Hello Docker
    HOSTING .NET CORE ON LINUX WITH DOCKER - A NOOB'S GUIDE
    Docker命令收集
    Linux常用命令

    學習筆記 ? 著作權(quán)歸作者所有 舉報文章

    轉(zhuǎn)載于:https://www.cnblogs.com/Tom-yi/p/8135355.html

    總結(jié)

    以上是生活随笔為你收集整理的.NET Core容器化@Docker的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。