以 SCD 與 FDD 發佈到 Linux

.NET Core 為跨平台解決方案,我們可在 macOS 或 Windows 開發 .NET Core App,最後再發佈到 Linux 主機上。

.NET Core 提供 FDD 與 SCD 兩種發佈方式。

Version


macOS High Sierra 10.13.4
.NET Core 2.0.7
Docker for Mac 18.03.1-ce-mac65 (24312)
Ubuntu 16.04 LTS

建立 Ubuntu Container


1
$ docker run --name MyUbuntu -dt -v /Users/Oomusou/Code:/var/code ubuntu:16.04

注意指令是下在 host os,不是 container 內

使用 docker run 由 image 建立 container,當 Docker 發現本機沒有 image,會自動從 Docker Hub 下載。

  • –name : 替 container 取一個人能夠識別的名字 MyUbuntu ( 若省略,Docker 將隨機命名 )
  • -d : detach,建立 container 後,就脫離目前 process
  • -t : terminal,預設執行 /bin/bash process,為了讓 container 啟動後不會立即停止
  • -v : volumn,定義 container 與 host os 的共用路徑,: 左側的 /Users/Oomusou/Code 為 host os 的路徑; : 右側的 /var/code 為 Ubuntu container 內部的路徑
  • ubuntu:16.04 : Ubuntu 的官方 image 名稱,特別指定版本 16.04

因為目前 Ubuntu 18.04 LTS 已經發布,但 .NET Core SCD 尚未支援 Ubuntu 18.04,所以先暫時使用 Ubuntu 16.04

linux000

  1. 輸入 docker run 下載 Ubuntu 16.04 LTS image 並執行 container

進入 Ubuntu

1
$ docker exec -it MyUbuntu bash

注意指令是下在 host os,不是 container 內

使用 docker exec 對已經執行中的 container 下指令。

  • -i : interactive,可對 terminal 輸入資料
  • -t : terminal,可對 terminal 顯示資料
  • MyUbuntu : Container 名稱
  • bash : 對 container 下的指令

linux001

  1. 輸入 docker exec -it MyUbuntu bash 進入 Ubuntu
  2. 顯示 Ubuntu command prompt

安裝 Linux Library

1
2
3
root@0677c0f17607 $ apt-get update
root@0677c0f17607 $ apt-get install -y libunwind8 liblttng-ust0 libcurl3 libssl1.0.0 libuuid1 libkrb5-3 zlib1g libicu55
root@0677c0f17607 $ exit

注意指令是下在 container 內,不是 host os

.NET Core 要能執行在 Linux,除了 .NET Core Runtime Library 外,有些 Linux 的 Library 也必須具備。

根據 Prerequisites for .NET Core on Linux 所建議,一個能執行 .NET Core 的 Ubuntu,必須具備以下 library:

  • libunwind8
  • liblttng-ust0
  • libcurl3
  • libssl1.0.0
  • libuuid1
  • libkrb5-3
  • zlib1g
  • libicu52 (for 14.X)
  • libicu55 (for 16.X)
  • libicu57 (for 17.X)

一般 Ubuntu Desktop 或 Ubuntu Server,這些 library 都已經內建,不用另外安裝,但 Ubuntu Docker 則需要另外安裝這些 library

linux002

  1. 輸入 apt-get update 更新本機套件清單
  2. 輸入 apt-get … 安裝 Linux library

安裝完 Linux library 後,輸入 exit 暫時離開 container 回到 host os

建立 .NET Core App


1
$ dotnet new console -o MyConsole

注意指令是下在 host os,不是 container 內

使用 dotnet new 建立專案。

  • console : 建立 console 類型專案
  • -o : o output,建立在 MyConsole 目錄下

linux003

  1. 輸入 dotnet new console -o MyConsole 建立 .NET Core App

SCD


SCD

Self-Contained Deployment

Linux 不需事先安裝 .NET Core SDK,直接將檔案複製到 Linux 即可執行

以 SCD 發佈

1
2
~ $ cd MyConsole
~/MyConsole $ dotnet publish -c Release -r linux-x64

注意指令是下在 host os,不是 container 內

使用 dotnet publish 將編譯後的 dll 與其 dependency 整理到 publish 目錄,將來只要將此目錄 deploy 到 server 即可。

  • -c : configuration,預設 dotnet publish 是將 Debug 模式的 dll 整理至 publish 目錄,若要整理 Release 模式的的 dll,需要配合 -c 參數
  • -rruntime,根據指定參數整理成該平台 SCD 所需要的所有檔案,其中 linux-x64 為 Linux 平台

linux004

  1. 進入專案目錄內
  2. 輸入 dotnet publish -c Release -r linux-x64 以 SCD 發佈
  3. 發佈到 /bin/Release/netcoreapp2.0/linux-x64/publish 目錄下

linux013

由於 SCD 不要求 Linux 預先安裝 .NET Core SDK,因此 publish 目錄下多達 178 個檔案。

再次進入 Ubuntu

1
$ docker exec -it MyUbuntu bash

注意指令是下在 host os,不是 container 內

linux006

  1. 輸入 docker exec -it MyUbuntu bash 再次進入 Ubuntu
  2. 顯示 Ubuntu command prompt

執行 .NET Core App

1
2
3
root@0677c0f17607 $ cd /var/code/CSharp/MyConsole/bin/Release/netcoreapp2.0/linux-x64
/publish
root@0677c0f17607 $ ./MyConsole

注意指令是下在 container 內,不是 host os

由於目前 Ubuntu container 與 host os 共用目錄,因此不用特別將檔案複製到 Ubuntu 內,直接將目錄切換到 /var/code/CSharp/MyConsole/bin/Release/netcoreapp2.0/linux-x64 /publish 執行 MyConsole

linux006

  1. 將目錄切換到 publish 目錄下
  2. 執行 MyConsole
  3. 成功顯示 Hello World!

注意此時 Ubuntu 並未安裝任何 .NET Core Runtime,只安裝了 .NET Core 所要求的 library 而已,一般 Ubuntu Desktop 或 Ubuntu Server 甚至連 library 都不用安裝,可以說真的將 publish 複製到 Ubuntu 即可執行

FDD


FDD

Framework-Dependent Deployment

須先在該平台安裝 .NET Core SDK,然後將相關 DLL 複製過去即可執行

安裝 Curl Library

1
root@0677c0f17607 $ apt-get install curl

注意指令是下在 container 內,不是 host os

由於需使用 curl 下載 .NET Core SDK,先安裝 curl library。

linux007

安裝 microsoft.qpg

1
2
3
root@0677c0f17607 $ curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
root@0677c0f17607 $ mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg
root@0677c0f17607 $ sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-xenial-prod xenial main" > /etc/apt/sources.list.d/dotnetdev.list'

注意指令是下在 container 內,不是 host os

  1. 輸入 curl … 下載 microsoft.qpg 到本機
  2. microsoft.qpg 移到適當目錄
  3. 加入 Microsoft 套件庫位置

安裝 .NET Core SDK

1
root@0677c0f17607 $ apt-get install apt-transport-https

注意指令是下在 container 內,不是 host os

安裝 apt-transport-https 套件。

linux008

  1. 輸入 apt-get install apt-transport-https 安裝 apt-transport-https套件
1
root@0677c0f17607 $ apt-get update

注意指令是下在 container 內,不是 host os

由於剛剛新加入了 Microsoft 自己的套件庫,所以需要在執行 apt-get update 更新一次本機套件清單。

linux009

  1. 輸入 apt-get update 更新本機套件清單
1
2
root@0677c0f17607 $ apt-get install -y dotnet-sdk-2.1.4
root@0677c0f17607 $ exit

注意指令是下在 container 內,不是 host os

正式安裝 .NET Core SDK 2.1.4。

linux010

  1. 輸入 apt-get install -y dotnet-sdk-2.1.4 安裝 .NET Core SDK

安裝完 .NET Core SDK 後,輸入 exit 暫時回到 host os

以 FDD 發佈

1
2
~ $ cd MyConsole
~/MyConsole $ dotnet publish -c Release

注意指令是下在 host os,不是 container 內

使用 dotnet publish 將編譯後的 dll 與其 dependency 整理到 publish 目錄,將來只要將此目錄 deploy 到 server 即可。

  • -c : configuration,預設 dotnet publish 是將 Debug 模式的 dll 整理至 publish 目錄,若要整理 Release 模式的的 dll,需要配合 -c 參數

若不加 -r,預設即為 FDD

linux011

  1. 進入專案目錄內
  2. 輸入 dotnet publish -c Release 以 FDD 發佈
  3. 發佈到 /bin/Release/netcoreapp2.0/publish 目錄下

linux014

FDD 只需 4 個檔案而已。

再次進入 Ubuntu

1
$ docker exec -it MyUbuntu bash

注意指令是下在 host os,不是 container 內

linux006

  1. 輸入 docker exec -it MyUbuntu bash 再次進入 Ubuntu
  2. 顯示 Ubuntu command prompt

執行 .NET Core App

1
2
root@0677c0f17607 $ cd /var/code/CSharp/MyConsole/bin/Release/netcoreapp2.0/publish
root@0677c0f17607 $ dotnet MyConsole.dll

注意指令是下在 container 內,不是 host os

由於目前 Ubuntu container 與 host os 共用目錄,因此不用特別將檔案複製到 Ubuntu 內,直接將目錄切換到 /var/code/CSharp/MyConsole/bin/Release/netcoreapp2.0/publish 執行 MyConsole

linux012

  1. 將目錄切換到 publish 目錄下
  2. dotnet 執行 MyConsole.dll
  3. 成功顯示 Hello World!

Summary


我們可發現 SCD 與 FDD 各有優點:

  1. SCD 不需 client 事先安裝 .NET Core SDK,但所需檔案數很多
  2. FDD 所需檔案數很少,但 client 必須事先安裝 .NET Core SDK

Conclusion


  • SCD 與 FDD 都能使 .NET Core App 達成跨平台到 Linux 執行
  • 若是開發 Linux Console App,則建議使用 SCD,畢竟 user 不見的有安裝 .NET Core SDK
  • 若是要將 ASP.NET Core 安裝到到 Linux,則使用 SCD 或 FDD 皆可

Reference


.NET Core, Prerequisites for .NET Core on Linux

2018-05-07