1. 程式人生 > >.NET Core容器化@Docker

.NET Core容器化@Docker

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

 1. 引言

我們知道. NET Core最大的特性之一就是跨平臺,而對於跨平臺,似乎大家印象中就是可以在非Windows系統上部署執行。而至於如何操作,可能就有所欠缺。那這一節我們就結合簡單例項一步一步教你如何藉助Docker來容器化 .NET Core應用,以完成跨平臺的構建和部署。

 2. 環境準備

自從玩.NET就一直和Windows系統打交道,如果還基於Windows來展開本節內容,不就跑題了嗎?!那咱們就切換到Linux系統。
如果沒有Linux基礎和Docker基礎,請自覺完成以下兩個實驗:
騰訊雲開發者實驗室:Linux 基礎入門
騰訊雲開發者實驗室:搭建 Docker 環境

完成了以上兩個實驗後,我們就離Linux的世界更近一步。
因為後續是基於Linux-CentOS系統進行實操演練,沒有Linux上機環境的,可以考慮從騰訊雲實驗室列表找一個CentOS相關的實驗專案作為本文的演練環境。

 3. Docker簡介

在開始之前,有必要對Docker做一下簡單瞭解,可以參考我的上一篇文章Hello Docker
這裡就簡要的再重複一下。
Docker是用Go語言編寫基於Linux作業系統的一些特性開發的,其提供了作業系統級別的抽象,是一種容器管理技術,它隔離了應用程式對基礎架構(作業系統等)的依賴。相較於虛擬機器而言,Docker共享的是宿主機的硬體資源,使用容器來提供獨立的執行環境來執行應用。虛擬機器則是基於Supervisor(虛擬機器管理程式)使用虛擬化技術來提供隔離的虛擬機器,在虛擬機器的作業系統上提供執行環境!雖然兩者都提供了很好的資源隔離,但很明顯Docker的虛擬化開銷更低!
Docker涉及了三個核心概念:Register、Image、Container。

1. Registry:倉庫。用來儲存Docker映象,比如Docker官方的Docker Hub就是一個公開的倉庫,在上面我們可以下載我們需要的映象。
2. Image:映象。開發人員建立一個應用程式或服務,並將它及其依賴關係打包到一個容器映象中。映象是應用程式的配置及其依賴關係的靜態形式。
3. Container:容器。Container是映象的執行例項,它是一個隔離的、資源受控的可移植的執行時環境,其中包含作業系統、需要執行的程式、執行程式的相關依賴、環境變數等。

它們三者的相互作用關係是:
當我們執行Docker pull或Docker run命令時,若本地無所需的映象,那麼將會從倉庫(一般為DockerHub)下載(pull)一個映象。Docker執行run方法得到一個容器,使用者在容器裡執行各種操作。Docker執行commit方法將一個容器轉化為映象。Docker利用login、push等命令將本地映象推送(push)到倉庫。其他機器或伺服器上就可以使用該映象去生成容器,進而執行相應的應用程式。

4. 安裝Docker

4.1. 使用指令碼自動安裝Docker

在測試或開發環境中 Docker 官方為了簡化安裝流程,提供了一套便捷的安裝指令碼,CentOS系統上可以使用這套指令碼安裝:

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

4.2. 啟動Docker

執行這個命令後,指令碼就會自動的將一切準備工作做好,並且把 Docker CE 的 Edge 版本安裝在系統中。

//啟動 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是否正確安裝

命令列執行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/

當執行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安裝完畢,我們來結合.NET Core玩一玩吧。

5.1. 拉取microsoft/dotnet映象

命令列執行docker pull microsoft/dotnet,等幾分鐘後即可安裝完畢,執行docker images可以看到本地已經包含microsoft/dotnetdocker.io/hello-world兩個映象。

5.2. 執行microsoft/dotnet映象

使用docker run <image>可以啟動映象,通過指定引數-it以互動模式(進入容器內部)啟動。依次執行以下命令:

//啟動一個dotnet映象
$ docker run -it microsoft/dotnet
//建立專案名為HelloDocker.Web的.NET Core MVC專案
dotnet new mvc -n HelloDocker.Web
//進入HelloDocker.Web資料夾
cd HelloDocker.Web
//啟動.NET Core MVC專案
dotnet run

執行結果如下所示:

[[email protected] ~]# docker run -it microsoft/dotnet
[email protected]:/# 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.

[email protected]:/# cd HelloDocker.Web
[email protected]:/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即可關閉應用,輸入exit即可退出當前容器。

是不是簡單的幾步就完成了一個.NET Core MVC專案的建立和執行?!這個時候你可能會好奇,Linux宿主機上並沒有安裝.NET Core SDK啊,MVC專案是如何建立的呢?這就是Docker神奇的地方,我們從映象倉庫中拉取的dotnet映象,包含了建立、構建、執行.NET Core專案所需的一切依賴和執行時環境。

退出容器之後,執行find -name HelloDocker.Web(查詢HelloDocker.Web檔案),我們發現並沒有找到。這說明我們剛才建立的.NET Core MVC專案是在容器內部建立的,是與宿主機完全隔離的。這個時候你可能會想,每次都要在容器中安裝原始碼太不方便了,我們能不能讓容器執行我們宿主機的原始碼專案?嗯,這是個好問題。下面我們就來解答這個問題。

5.3. 掛載原始碼

為了在宿主機上建立.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

安裝完畢後,我們依次執行以下命令建立一個.NET Core MVC專案:

//回到根目錄
$ cd $HOME
//建立demo資料夾
$ mkdir demo
$ cd demo
//建立專案名為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目錄下成功建立了MVC專案,下一步我們就將該目錄下的原始碼專案通過掛載的方式共享到容器中去。

5.3.2. 掛載宿主機專案到容器中

在啟動Docker映象時,Docker允許我們通過使用-v引數掛載宿主機的檔案到容器的指定目錄下。換句話說,就相當於宿主機共享指定檔案供容器去訪問。廢話不多說,實踐出真知。

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

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

[[email protected] HelloDocker.Web]# docker run -it \
> -v $HOME/demo/HelloDocker.Web:/app \
> microsoft/dotnet:latest
[email protected]:/# ls
app  bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[email protected]:/# cd app
[email protected]:/app# ls
Controllers  HelloDocker.Web.csproj  Models  Program.cs  Startup.cs  Views  appsettings.Development.json  appsettings.json  bundleconfig.json  obj  wwwroot
[email protected]:/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.

從上面的執行結果來看,容器內部中的app目錄下包含了宿主機上的原始碼專案。
上面說到是以共享的形式,而不是容器擁有一份宿主機目錄的拷貝,意味著,在宿主機上對目錄的更改,會即時反應到容器中。但反過來,容器中對共享目錄的更改,不會反應到宿主機上,不然就打破了容器具有的隔離特性。

通過這樣一個簡單場景,聰明的你是否會聯想到這一場景在我們日常編碼的應用之處呢?是的,我們可以用來持續構建(CI)。基本思路是,通過git clone原始碼到宿主機上,然後將原始碼目錄掛載到容器中去進行構建。

5.4. 藉助Dockerfile

Dockerfile用來定義你將要在容器中執行的系列操作。我們來建立第一個Dockerfile:

//確保進入我們建立的MVC專案目錄中去
$ cd $HOME/demo/HelloDocker.Web
//使用touch命令建立Dockerfile
$ touch Dockerfile
//使用vi命令編輯Dockerfile
vi Dockerfile

進入VI編輯介面後,複製以下程式碼,使用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"]

上面的命令我依次解釋一下:

  1. 使用FROM指定容器使用的映象
  2. 使用WORKDIR指定工作目錄
  3. 使用COPY指令,複製當前目錄(其中.即代表當前目錄)到容器中的/app目錄下
  4. 使用RUN命令指定容器中執行的命令
  5. 使用EXPOSE指定容器暴露的埠號
  6. 使用ENV指定環境引數,上面用來告訴.NETCore專案在所有網路介面上監聽5000埠
  7. 使用ENTRYPOINT制定容器的入口點

Dockerfile就緒,我們就可以將我們當前專案打包成映象以分發部署。
使用docker build -t <name> <path>指令打包映象:

$ docker build -t hellodocker.web .

以上命令就是告訴docker將當前目錄打包成映象,並命名為hellodocker.web。命令執行完畢,輸入docker images即可看到我們新打包的映象。映象建立完畢我們就可以直接運行了:

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

上面的指令就是執行我們新打包的映象,並通過-p引數對映容器的5000到宿主機的80埠,其中-d引數告訴docker以後臺任務形式執行映象。因為80是預設的web埠,所以我們通過瀏覽器直接訪問ip即可訪問到我們容器中執行的MVC網站。或者通過curl -i http://localhost來驗證。操作示例如下:

[[email protected] 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 0c8a9c4d5ba1
  Restore 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
[[email protected] HelloDocker.Web]# docker run -d -p 80:5000 hellodocker.web
9d28bb3fa553653e4c26bf727715c82a837a2c224a0942107f3fab08c0a2686d
[[email protected] 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專案的容器化部署。

結束了?還沒有!

我打包的映象是儲存在本地的,我如何把映象部署到其他機器上呢?請繼續看。

6. 推送映象到倉庫

在第三節中,我們就簡要介紹了,有個Registry是專門用來儲存映象的。請自行到Docker Hub註冊個賬號,然後我們把本地打包的映象放到自己賬號下的倉庫下不就得了?!
註冊完畢後,執行docker login

[[email protected] 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
[[email protected] HelloDocker.Web]# docker images
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
hellodocker.web             latest              532e44a7fd54        13 minutes ago      1.745 GB

再執行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)

推送失敗,提示我們的映象命名不符規範。原來在推送之前要把映象按<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
....

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

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

7.最後

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

本文的實戰演練就先到這裡,下一篇,我們來看如何藉助Docker使用Nginx完成.NET Core Web專案的反向代理!!!

參考資料

相關推薦

.NET Core容器@Docker

溫馨提示:本文適合動手演練,效果更佳。  1. 引言 我們知道. NET Core最大的特性之一就是跨平臺,而對於跨平臺,似乎大家印象中就是可以在非Windows系統上部署執行。而至於如何操作,可能就有所欠缺。那這一節我們就結合簡單例項一步一步教你如何藉助Docker來容器化 .NET Core應用,以完成

.NET Core容器之多容器應用部署-使用Docker-Compose

gre server rebuild asp ack 進行 add view created 1.引言 緊接上篇.NET Core容器化@Docker,這一節我們先來介紹如何使用Nginx來完成.NET Core應用的反向代理,然後再介紹多容器應用的部署問題。 2.

.NET Core容器開發系列(一)——Docker裡面跑個.NET Core

前言     部落格園中已經有很多如何在Docker裡面執行ASP.NET Core的介紹了。本篇主要介紹一些細節,幫助初學的朋友更加深入地理解如何在Docker中執行ASP.NET Core。 安裝Docker     Do

.NET Core容器開發系列(一)——Docker裏面跑個.NET Core

開源鏡像站 final 輸出 快速 image 測試版本 storage gem targe 前言 博客園中已經有很多如何在Docker裏面運行ASP.NET Core的介紹了。本篇主要介紹一些細節,幫助初學的朋友更加深入地理解如何在Docker中運行ASP.NET

.NET Core容器之多容器應用部署@Docker-Compose

1.引言緊接上篇.NET Core容器化@Docker,這一節我們先來介紹如何使用Nginx來完

.NET Core容器開發系列(零)——計劃

.NET Core相當完善的跨平臺特性以及其輕量化的底層介面為我們能順暢進行微服務開發提供了非常棒的基礎。 作為支撐微服務最常見的基礎技術——容器化將是本系列的核心內容。 接下來我計劃用一個月左右的時間記錄我在ASP.NET Core容器化開發中的一部分嘗試。文章大概剛要如下: .NET Core容器化開發系

一套標準的ASP.NET Core容器應用日誌收集分析方案

## 講故事 關注我公眾號的朋友,應該知道我寫了一些雲原生應用收集和分析相關的文章,其中內容大多聚焦某個具體的元件: - 超級有用的TraceId,快點用起來吧! - 如何利用NLog輸出結構化日誌,並在Kibana優雅分析日誌? | - 既然能直接向ElasticSearch寫日誌,為什麼

.net core 2.x - docker-linux容器-持續整合(jenkins)

  1.準備工作      先說明哈,以下操作都是在windows中:      a).需要下載安裝 jenkins 的windows版本      b).需要下載安裝 docker for windows,安裝之後使用的 linux容器,如果不知道的,可以看上一篇      c).我們這裡的演示使

Net core 2.x - docker(for windows)-linux配置及項目發布

區別 默認 context aml 配置說明 nds cor 開篇 -- 將.net core2.x+sqlserver項目發布到docker.呵呵,操作很自如,如下. 1.羅嗦幾句 在跑起來之前浪費了不少時間和精力,起初是將docker for windows的環境轉

容器-Docker實戰

管理 名稱 inspect mage 升級 yml metrics 構建 其它 一、前言  本文將系統性的介紹Docker相關的知識;包含Docker命令,Dockerfile語法,如何用Docker進行構建運行。二、Docker安裝  本文以centos7及以上版本為例來

容器-Docker介紹

arm 基礎 建立 net 快速 image 應用開發 均可 帶來 導讀:本文章對Docker技術進行了介紹,闡述了Docker的技術發展歷程、容器與虛擬機的差異、Docker原理、特點、Docker三組件和Docker帶來的影響,為我們進一步理解Docker打下基礎。 一

應用的容器-docker打包spring boot映象

應用容器化 容器佔用資源少、部署快,每個應用可以被打包成一個容器映象,每個應用與容器間成一對一關係也使容器有更大優勢,使用容器可以在build或release 的階段,為應用建立容器映象,因為每個應用不需要與其餘的應用堆疊組合,也不依賴於生產環境基礎結構,這使得

Docker & ASP.NET Core (5):Docker Compose

服務啟動 volumes 輸出日誌 遇到 www 規模 輸出 我想 star 原文:Docker & ASP.NET Core (5):Docker Compose第一篇:把代碼連接到容器 第二篇:定制Docker鏡像 第三篇:發布鏡像 第四篇:容器間的連接

CentOS配置持續整合(.net core/jenkins/rancher/docker

1、配置代理 1、 開發機開啟 Shadowsocks,允許其他裝置連入 2、 臨時開代理命令 (根據實際修改IP和埠) export http_proxy="http://10.5.21.127:1080" export https_proxy="http://10

微服務與容器Docker

src inf com 鏡像 http docke eight .com 技術分享 1、Docker的應用案例 2、 3、 4、docker的核心:鏡像、倉庫、容器 Build構建鏡像:類似於集裝箱。 Ship運輸鏡像,倉庫:類似於碼頭。將鏡像運輸到倉庫。 R

.NET Core中使用Docker

配置 平臺 too ade docker鏡像 access pull pan name 原文:.NET Core中使用Docker一、Docker簡介 Docker是基於Linux容器技術(LXC),使用Go語言實現的開源項目,誕生於2013年,遵循Apac

ASP.NET Core模組前後端分離快速開發框架介紹之1、開篇

原文首發:https://iamoldli.github.io/2019/05/20/net-core-mo-kuai-hua-kai-fa-kuang-jia/1-kai-pian/ 原始碼地址 GitHub:https://github.com/iamoldli/NetModular 演示地址 地址:ht

ASP.NET Core模組前後端分離快速開發框架介紹之2、快速建立一個業務模組

原始碼地址 GitHub:https://github.com/iamoldli/NetModular 演示地址(換了臺新伺服器,應該不怎麼卡了~) 地址:http://129.211.40.240:6220 賬戶:admin 密碼:admin 前端框架演示地址(臨時) 地址:http://progqx5cu

ASP.NET Core模組前後端分離快速開發框架介紹之3、資料訪問模組介紹

原始碼 GitHub:https://github.com/iamoldli/NetModular 演示地址 地址:http://129.211.40.240:6220 賬戶:admin 密碼:admin 前端框架演示地址(臨時) 地址:http://progqx5cu.bkt.clouddn.com/ski

ASP.NET Core模組前後端分離快速開發框架介紹之4、模組實現思路

原始碼 GitHub:https://github.com/iamoldli/NetModular 演示地址 地址:http://129.211.40.240:6220 賬戶:admin 密碼:admin 前端框架演示地址(臨時) 地址:http://progqx5cu.bkt.clouddn.com/ski