標籤:
NET Core Web 應用程式部署到 Docker 中運行環境介紹 :
虛擬機器:VirtualBox 5.1.6
系 統:Ubuntu 16.04.1 LTS
系統準備完成後可以使用 sudo apt-get udpate 和 sudo 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-certificatessudo 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 updatesudo apt-get purge lxc-dockerapt-cache policy docker-enginesudo apt-get updatesudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtualsudo reboot //重啟系統sudo apt-get updatesudo apt-get install docker-enginesudo 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_2cd web_2/dotnet new -t webdotnet restoredotnet 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 restore 和 dotnet publish。然後後重新構建 docker 鏡像並運行。哇,成功了!
總結:
通過上面的介紹,我們體驗了在 docker 中運行 .net core web 應用。一步一步執行下來發現都是通過命令列安裝各種執行環境,有 dotnet core 運行環境,有 docker 運行環境,有 node.js 運行環境。與編碼人員的關係並不是太大。有時候按著 step by step 走,結果發現走不通,這個時候我們就要仔細分析給出的錯誤描述是什麼,一步一步的找到問題所在,並解決掉。
不過我們想想上面的這些步驟自動化之後,將是一種怎麼樣的體驗?我們來暢想一下。每次開發人員編寫完代碼提交後,通過 CI 工具,自動構建應用並自動發布,完了再自動構建 docker 鏡像並運行。測試通過後,直接將鏡像用於生產環境。再進行迴歸測試。
NET Core Web 應用程式部署到 Docker 中運行