.NET Core Web 應用部署到 Docker 中運行


環境介紹 :

  虛擬機:VirtualBox 5.1.6

  系 統:Ubuntu 16.04.1 LTS

  系統准備完成后可以使用 sudo apt-get udpatesudo apt-get upgrade 對系統進行更新,然后打開 https://www.microsoft.com/net/core#ubuntu 這個網址,在ubuntu系統中安裝 .net core 運行環境。直接復制/粘貼給出的命令就可以了。

安裝 Docker:

  什么是 Docker ? 這里面就不介紹了,直接打開 https://www.docker.com/what-docker 看吧或自行 google 中文的介紹。

  Docker 的安裝其實也是使用官方提供的 step by step 安裝步驟。如果不想看介紹可以直接使用下面我整理的命令:

//順序執行這些命令:
sudo apt-get install apt-transport-https ca-certificates
sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
//打開 /etc/apt/sources.list.d/docker.list 這個文件,如果不存在就創建一個(sudo touch docker.list)
//在 docker.list 中輸入下面這一行內容
deb https://apt.dockerproject.org/repo ubuntu-xenial main

//接着執行命令
sudo apt-get update
sudo apt-get purge lxc-docker
apt-cache policy docker-engine
sudo apt-get update
sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual
sudo reboot //重啟系統 sudo apt-get update
sudo apt-get install docker-engine
sudo service docker start

上面的命令執行后,一定要看一下響應的結果,有些會提示是不用更新的,忽略即可。接下來我們執行一下經典的 hello-world.命令如下:  

sudo docker run hello-world

  執行這個命令,首先會從 docker 的鏡像倉庫(https://hub.docker.com/)中拉取名為 hello-world 的鏡像,然后在本地運行。運行成功之后,我們會看到 hello world 輸出。

  這里說一下,docker 提供了一個集中管理鏡像的地方,即 https://hub.docker.com/,在這里我們可以找到自己想要的基礎鏡像,當然我們也可以把自己制作的鏡像推送到 docker 的鏡像倉庫中,前提是注冊一個自己的 docker hub 賬號。

Pull .NET Core image:

docker 安裝成功后,我們就去 docker hub 中找由 Microsoft 維護的 dotnet core 基礎鏡像(https://hub.docker.com/r/microsoft/dotnet/),執行下面的命令將鏡像拉取到本地:

docker pull microsoft/dotnet

等待鏡像拉取到本地之后,我們運行下面的命令並查看 dotnet core 環境是否正常(這里其實是多余的,MS 怎么可能給一個不能用的鏡像呢?):

docker run -it microsoft/dotnet /bin/bash

  這是進入到容器中的命令行。然后我們輸入 dotnet --version 查看到當前鏡像內的 dotnet CLI 版本號為:1.0.0-preview2-003131。輸入 exit 回車 退出容器。

  好吧,現在 dotnet core 的 docker 鏡像也有了。

創建 ASP.NET Core Web 應用:

  文章開頭說了我已經在 Ubuntu 虛擬機中也安裝了 dotnet core 環境。使用下面的 dotnet CLI 命令創建一個 ASP.NET Core Web 應用並嘗試運行:

mkdir web_2
cd web_2/
dotnet new -t web
dotnet restore
dotnet run

  我們嘗試運行,並看到運行成功。接下來使用 dotnet publish 將應用發布,默認發布到了 bin/Debug/netcoreapp1.0/publish/ 這個目錄。

  注:這里發布的時候,如果不修改 project.json 里面的 scripts 節點,將會用到 node.js ,可以將 prepublish 暫時注釋掉,或者安裝一下 node.js 並用 npm(安裝完 node.js 自帶的) 安裝 gulp bower 這些包。

    命令:npm install -g gulp bower

編寫 Dockerfile:

  在應用根目錄創建一個名為 Dockerfile 的文件(命令:touch Dockerfile)接下編輯 Dockerfile(命令:vi Dockerfile),輸入下面的內容:

# 聲明使用的基礎鏡像
FROM microsoft/dotnet:latest
# 將本地dotnet core 應用拷貝到 容器 /app/ 目錄下
COPY bin/Debug/netcoreapp1.0/publish/ /app/
# 設置工作目錄
WORKDIR /app
# 設置導出端口
EXPOSE 5000/tcp
# 指定應用入口點
ENTRYPOINT ["dotnet", "/app/web_2.dll"]

  完成 Dockerfile 的編寫,接下來構建一個鏡像。

  命令:docker build -t web_2 .

  不要忘記 web_2 后面的那個點。鏡像構建完成之后,我們就來運行試試吧。

  命令:docker run -it -p 5000:5000 web_2

  這里說一下 -it 是指:進入臨時交互模式

  -p 5000:5000 是指將容器的 5000 端口映射到 Docker 宿主機的 5000 端口

  web_2 是指剛才我們構建的鏡像。

  看到臨時交互命令行,顯示運行成功。我的 Ubuntu 的 IP 是 192.168.10.107。我們用瀏覽器訪問一下 http://192.168.10.107:5000 。壞了,什么也沒有顯示,查看 http 狀態碼為 500 ,這說明是應用報錯了。經過排查發現是 dotnet core web 應用引用類庫的版本問題。大家知道前兩天發布了 dotnet core 1.0.1,我就在 project.json 里面發現我通過 dotnet CLI 創建的應用已經在使用 1.0.1 版本的類庫了。但是基礎鏡像 microsoft/dotnet 中還是 dotnet 1.0.0 的類庫。好吧,知道了問題了,就來修改 project.json 中引用的版本吧。將 1.0.1 改為 1.0.0。再次執行 dotnet restoredotnet publish。然后后重新構建 docker 鏡像並運行。哇,成功了!

總結:

  通過上面的介紹,我們體驗了在 docker 中運行 .net core web 應用。一步一步執行下來發現都是通過命令行安裝各種執行環境,有 dotnet core 運行環境,有 docker 運行環境,有 node.js 運行環境。與編碼人員的關系並不是太大。有時候按着 step by step 走,結果發現走不通,這個時候我們就要仔細分析給出的錯誤描述是什么,一步一步的找到問題所在,並解決掉。

  不過我們想想上面的這些步驟自動化之后,將是一種怎么樣的體驗?我們來暢想一下。每次開發人員編寫完代碼提交后,通過 CI 工具,自動構建應用並自動發布,完了再自動構建 docker 鏡像並運行。測試通過后,直接將鏡像用於生產環境。再進行回歸測試。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM