Ubuntu 16.04+.Net Core+Docker+Nginx安裝部署

前言linux

  最近公司的項目打算移植到.Net Core平臺,因此調研了一下.Net Core在Linux下的安裝部署。本篇文章會一步步的描述從安裝到配置到部署的所有過程。在文章的結構和內容裏,筆者借鑑了不少其餘博文的內容,但感受其餘博文中都只是實現了一部分或者沒有將配置內容寫全。筆者作的是整理一下本身的實際部署過程。nginx

目錄docker

1. 準備工做ubuntu

2. 建立一個非root用戶瀏覽器

3. 更新服務器安全

4. 安裝.Net Core服務器

5. 建立Demo網絡

6. 守護進程部署mvc

7. Nginx反向代理app

8. 安裝Docker

9. 在Docker中部署.Net Core項目

步驟

1. 準備工做

  • 一臺Linux服務器:筆者用的是VMWare的虛擬機模擬的環境,有條件的朋友可使用真實服務器做爲部署環境
  • Linux終端:筆者用的是MobaXterm

2. 建立一個非root用戶

$ sudo adduser docker_user
$ sudo usermod -aG sudo docker_user $ exit


3. 更新服務器

$ sudo apt-get update        
$ sudo apt-get upgrade       
$ sudo apt-get dist-upgrade  
$ sudo reboot

 

4. 安裝.Net Core

咱們要運行.Net Core的項目,天然要安裝.Net Core的環境啦。這裏微軟提供了大部分Linux版本的安裝方案,我使用的是Ubuntu16.04,因此如下代碼是針對這個系統版本的,若是你使用的是其餘版本能夠參考(https://docs.microsoft.com/en-us/dotnet/core/linux-prerequisites?tabs=netcore2x

// 註冊微軟產品Key爲被信任的
$ curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
$ sudo mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg

// 設置所須要的版本主機包
$ sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-xenial-prod xenial main" > /etc/apt/sources.list.d/dotnetdev.list'
// APT支持Https
$ sudo apt-get install apt-transport-https
$ sudo apt-get update

// 安裝.Net Core SDK
$ sudo apt-get install dotnet-sdk-2.0.3

// 檢查安裝是否成功
$ dotnet --version

5. 建立Demo

由於是Demo項目,因此就在用戶根目錄下建立一個文件夾,將該文件夾做爲項目的根目錄。

5.1 建立項目

$ cd ~/
$ mkdir helloworld
$ cd helloworld
$ dotnet new mvc

5.2 發佈項目

$ dotnet restore
$ dotnet publish -c Release

5.3 運行發佈好的程序

經過上面的截圖咱們發現,發佈完的程序和在PC平臺上的差很少,是在bin/Release的目錄下。咱們先移動到這個目錄,而後用"dotnet"命令運行這個Demo

$ cd bin/Release/netcoreapp2.0/publish/
$ dotnet helloworld.dll

執行命令之後,終端會如上圖所示。這個時候就說明程序已經跑起來了。倒數第二行則說明了,程序默認的端口號是5000。這個時候咱們就能夠經過服務器IP+端口號5000訪問這個網站了。(注:若是是外網訪問,須要在防火牆打開5000端口的權限。這個就不在本文中擴展了。)

筆者是經過開啓另外一個終端來測試程序是否正常的,結果以下:

// 經過wget請求網站
$ wget http://localhost:5000

6. 守護進程部署

走到這一步,有很多同窗就發現了。如今的程序是須要咱們始終打開終端才能保證網站能夠被訪問的,那接下來咱們要作的就是將這個網站部署成一個自定義服務。讓網站能夠在後臺進程中運行。

6.1 準備運行目錄

按照Linux部署習慣,咱們在var目錄下建立一個www文件夾,並將剛纔發佈的Demo放到該目錄下

$ cd /var
$ sudo mkdir www
$ cd www
$ sudo mkdir helloworld
$ cd helloworld
$ sudo cp -r ~/helloworld/bin/Release/netcoreapp2.0/publish/* .

6.2 建立服務配置文件

$ cd /etc/systemd/system/
$ sudo touch dotnet-helloworld.service

6.3 編寫服務配置文件

$ sudo vi dotnet-helloworld.service

先經過vi進入該文件(注:vi是Linux下最經常使用的文本編輯器之一,若是對vi不瞭解,能夠自行百度,這裏就不擴展了)。進入編輯後,將如下代碼寫入配置文件

[Unit]
Description=DotNet Core HelloWorld Running on Ubuntu

[Service]
WorkingDirectory=/var/www/helloworld                             // 工做目錄,這裏咱們寫的是剛纔建立的網站工做目錄
ExecStart=/usr/bin/dotnet /var/www/helloworld/helloworld.dll     // 服務的實際執行命令
Restart=always
RestartSec=10
SyslogIdentifier=dotnet-example
User=docker_user                                                 // 已docker_user的身份啓動
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

[Install]
WantedBy=multi-user.target

上面這段配置文件我是參考微軟官方的部署文檔寫的(文檔連接

6.4 啓動服務

$ sudo systemctl enable dotnet-helloworld.service
$ sudo systemctl start dotnet-helloworld.service

6.5 檢查服務狀態

$ sudo systemctl status dotnet-helloworld.service

當服務啓動後,運行status命令查看服務狀態時,會返回服務執行的日誌,終端會顯示相似於下圖的代碼。

這段代碼和咱們以前直接用命令行啓動dotnet項目是類似,這也就說明咱們的服務部署成功了。咱們再使用wget驗證,一樣能夠訪問這個網站了。

7. Nginx反向代理

作到這裏,.Net Core項目的部署已經差很少了。接下來咱們就經過Nginx進行反向代理。

7.1 安裝Nginx

// 安裝命令
$ sudo apt-get install nginx

// 完成安裝後檢查安裝是否成功
$ nginx -v

7.2 配置反向代理

 

// 移動到Nginx配置文件夾
$ cd /etc/nginx/conf.d/

// 建立代理配置文件
$ sudo touch helloworld.conf

// 編輯配置文件
$ sudo vi helloworld.conf

// 配置內容
server {
    listen 80;

    location / {
        proxy_pass http://localhost:5000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection keep-alive;
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

// 測試配置
$ sudo nginx -t

// 從新加載配置
$ sudo nginx -s reload

 

當完成這一步後,咱們就能夠在瀏覽器裏直接輸入服務器的IP地址來訪問Demo網站了。

注:這裏有一個小坑,Nginx有一個默認配置文件,文件路徑在:/etc/nginx/sites-available下。文件名是default。若是訪問的時候打開的不是上面這個網站,那須要到這個配置文件下,把全部的配置都註釋掉,再從新reload一下Nginx。

 

8. 安裝Docker

經過上面的教程,你們已經能夠在本身電腦上訪問Linux服務器上的.Net Core項目了。接下來咱們將.Net Core項目放到Docker下運行,並一樣經過Nginx方向代理,使咱們能訪問到.Net Core項目。

8.1 卸載舊版本Docker

由於Ubuntu系統可能自帶Docker,因此在安裝新版Docker前先將舊版的Docker清楚乾淨

$ sudo apt-get remove docker \
docker-engine \
docker.io

8.2 安裝

$ sudo apt-get update

// 因爲apt源使用 HTTPS 以確保軟件下載過程當中不被篡改。所以,咱們首先須要添加使用HTTPS 傳輸的軟件包以及 CA 證書。
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common

// 鑑於國內網絡問題,強烈建議使用國內源,官方源請在註釋中查看。
// 爲了確認所下載軟件包的合法性,須要添加軟件源的  GPG  密鑰。
$ curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

// 官方源
// $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

// 向 source.list 中添加 Docker 軟件源
sudo add-apt-repository \
"deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) \
stable"

$ sudo apt-get update

// 執行安裝命令
$ sudo apt-get install docker-ce

8.3 啓動Docker服務

$ sudo systemctl enable docker
$ sudo systemctl start docker

8.4 創建Docker用戶組

默認狀況下,docker命令會使用 Unix socket 與 Docker 引擎通信。而只有 root 用戶和 docker 組的用戶才能夠訪問 Docker 引擎的 Unix socket。出於安全考慮,通常 Linux 系統上不會直接使用 root 用戶。所以,更好地作法是將須要使用 docker 的用戶加入 docker 用戶組。

 

// 創建docker用戶組,這行命令執行的時候可能會報該用戶組已存在。若是報這個錯,能夠直接跳過這條命令。
$ sudo groupadd docker

// 將當前用戶加入docker用戶組
$ sudo usermod -aG docker $USER

 

執行完這條命令後,退出終端從新登陸一下。就可使用docker命令來管理docker了。

8.5 鏡像加速器配置

鏡像(image)是docker的一個基礎元素,但當咱們在國內的網絡環境中拉取Docker Hub(官方Docker鏡像庫)鏡像時會變得比較困難,這時咱們就能夠配置鏡像加速器。這裏我使用的是Docker官方提供的國內加速器服務。

// docker文件夾默認是隻容許root訪問的。這裏筆者偷個懶就直接開放docker的文件夾權限了。
sudo chmod 777 /etc/docker
cd /etc/docker

// 建立並編輯加速器源
sudo touch daemon.js
sudo vi daemon.js

// 文件內容
{
    "registry-mirrors": [
        "https://registry.docker-cn.com"
    ]
}

// 重啓服務
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

 

9. 在Docker中部署.Net Core項目

9.1 拉取.Net Core鏡像

$ sudo docker pull microsoft/dotnet

9.2 修改Demo程序

以前咱們用的是默認的Demo程序運行,程序是運行在5000端口上的,在咱們的實際環境中,不可能每一個服務都用同一個端口號,因此此次咱們將端口好作一個小變更。

// 移動到最開始咱們建立的Demo中。編輯Program.cs
// $ cd ~/helloworld
// $ vi Program.cs

內容爲

namespace helloworld
{
    public class Program
    {
        public static void Main(string[] args)
        {
            BuildWebHost(args).Run();
        }

        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .UseUrls("http://*:10001")        // 使用10001做爲程序運行時端口
                .Build();
    }
}

完成以後,咱們從新發布

$ dotnet restore
$ dotnet publish -c Release

9.3 編寫Dockerfile

// 移動到發佈目錄
$ cd ~/helloworld/bin/Release/netcoreapp2.0/publish/// 建立Dockerfile
$ sudo touch Dockerfile

// 編輯Dockerfile
$ sudo vi Dockerfile

如下是Dockerfile的內容

// 基於.Net Core鏡像來構建咱們的鏡像
FROM microsoft/dotnet

// 將程序複製到鏡像中的publish目錄
COPY . /publish

// 定義工做目錄爲publish
WORKDIR /publish

// 設置Docker容器對外暴露的端口
EXPOSE 10001

// 執行dotnet命令
CMD ["dotnet", "helloworld.dll"]

9.4 構建Docker鏡像

$ docker build -t helloworld:1.0 .

注意最後有一個"."

 

9.5 運行構建的鏡像

$ docker run --name helloworld -d -p 10001:10001 helloworld:1.0

 

 

9.6 修改Nginx配置

在本文前半段,咱們讓Nginx代理了5000端口,如今咱們把他改成10001。

// 編輯以前建立的Nginx配置
$ cd /etc/nginx/conf.d/
$ vi helloworld.conf

// 只須要修改代理的端口就行
server {
  listen 80;

  location / {
    proxy_pass http://localhost:10001;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection keep-alive;
    proxy_set_header Host $http_host;
    proxy_cache_bypass $http_upgrade;
  }
}

// 重載Nginx
$ sudo nginx -t
$ sudo nginx -reload

好了。大功告成,咱們如今又能夠在瀏覽器中用服務器IP直接訪問到Demo網站了。

總結

此次學習的過程,總共花了大概兩天時間,反反覆覆看了不少其餘的教程。但大部分教程都感受要麼沒說清楚,要麼就是缺乏某個步驟而致使最後運行不起來,因此在完成配置之後,決定寫下這篇文章,算是給本身一個交代。也但願能夠幫到各位看客。

相關文章
相關標籤/搜索