【Step By Step】將Dotnet Core部署到Docker上


本教程的前提是,你已經在Linux服務器上已經成功的安裝了Docker,我會大概介紹在此過程中用到的Docker命令,並不會介紹所有的Docker命令(因為我也不會)。

一、在Docker中運行Dotnet Core Hello World

微軟官方提供了已經集成好Dotnet Core運行所需環境的Docker Image,我們可以直接使用命令:

docker run -it microsoft/dotnet:latest

其中

-i :交互模式 (so we can interact with it)

-t :  分配一個(偽)tty (link is external

microsoft/dotnet:這是微軟提供的Docker Core的官方Image名稱,

latest :表示我們使用這個版本的Image

通過上面的命令,我們就創建了一個Docker Container,並且啟動它。

其實Docker Run,他是分了三步走的:

    • 查看本地是否有我們所需要啟動的鏡像,沒有的話,嘗試去服務器獲取
    • 創建一個容器,對應的Docker命令:
docker create -it microsoft/dotnet:latest

如果創建成功了,則會輸出一個容器的ID,我們也可以通過docker ps來查看

    • 啟動容器,對應的Docker命令
docker start  -a -i 容器ID

這時候,我們就把最基本的容器啟動起來了,在容器中,就可以執行一些Dotnet Core的控制台命令:

root@0260ab2fd089:/# dotnet new
Created new C# project in /.
root@0260ab2fd089:/# mkdir docker //創建一個文件夾,名字叫docker
root@0260ab2fd089:/# cd docker/
root@0260ab2fd089:/docker# dotnet new //創建一個Dotnet Core項目
Created new C# project in /docker.
root@0260ab2fd089:/docker# dotnet restore //還原Dotnet Core項目的依賴包
log  : Restoring packages for /docker/project.json...
log  : Writing lock file to disk. Path: /docker/project.lock.json
log  : /docker/project.json
log  : Restore completed in 4658ms.
root@0260ab2fd089:/docker# dotnet run //啟動Dotnet Core項目
Project docker (.NETCoreApp,Version=v1.0) will be compiled because expected outputs are missing
Compiling docker for .NETCoreApp,Version=v1.0

Compilation succeeded.
    0 Warning(s)
    0 Error(s)

Time elapsed 00:00:03.0599700
 

Hello World! //輸出結果

 

二、部署一個 Web API項目到Docker

1.創建API

我們來使用VS 2015創建一個WebAPI項目的名稱為:JaxApi,並對默認項目做以下調整:

A.升級項目所依賴的所有Nuget包

因為可能有的VS版本稍舊,他默認引用的包都是rc版本的,不升級可能會有一些小問題,我在最早嘗試的時候遇到過在本地跑的好好的,但是到了docker中就跑不起來的問題。

如果你的VS默認引用的rc版本,那么你升級后可能會遇到項目編譯不過的問題,好像是Nuget的一個Bug,他把project.json改了,我的解決辦法是,在frameworks    ->   netcoreapp1.0 節點下增加如下配置:

"Microsoft.NETCore.App": {
      "version": "1.0.0",
      "type": "platform"
    }

然后把dependencies中對Microsoft.NETCore.App的引用干掉。

這個問題最新的VS中不存在,只是我公司因為各種原因無法安裝最新版

B.讓WebApi不止監聽localhost來的請求

新建的API項目默認他只會監聽來自Localhost的web請求,我們需要在Program類中增加一個配置:

public class Program
{
    public static void Main(string[] args)
    {
        var host = new WebHostBuilder()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration()
            .UseUrls("http://*:9100")//監聽來自所有ip的9100端口的請求
            .UseStartup<Startup>()
            .Build();

        host.Run();
    }
}

C.發布Web API

通過文件系統發布WebAPI,這里與發布普通網站並沒有什么不同,所有選項默認,跟着VS一步一步來~

發布的時候最好留個后門,在Release和PublishOutput中間加上一層文件夾,待會兒告訴你啥用,比如我的發布目錄:.\bin\Release\Docker\PublishOutput

2.編寫DockerFile

打開剛才發布的目錄,新建一個沒有后綴的文件Dockerfile,與PublishOutput文件夾同級

這里我們如果使用命令行來把文件粘貼到服務器的話,文件夾要比粘貼單個文件方便的多,而且對於我本地測試來說,也沒有必要來回折騰壓縮文件。這種文件夾層級更加便於我們上傳文件~

Docker File 內容如下,注意端口號要和上面我們Program中配置的一樣:

FROM microsoft/dotnet:latest

WORKDIR /root

# Copy the app file to root

COPY PublishOutput /root/

# Configure the listening port to 9100
EXPOSE 9100/tcp

# Start the app
ENTRYPOINT dotnet JaxApi.dll

然后把Dockerfile和PublishOutput一起上傳到Linux服務器上,具體怎么上傳大家就八仙過海各顯神通吧~

3.編譯成Image並運行

在Linux服務器上Dockerfile所在目錄下,運行命令:

docker build -t jaxapi ./

docker build:根據Dockerfile來編譯一個Docker Image出來

-t : 給鏡像打個tag(標簽),類似於起個名字

這樣子,我們的docker鏡像就在我們的服務器上編譯好了,這時候,我們可以來啟動我們的api,供外界訪問

docker run -it -p 9100:9100 --name jaxapi jaxapi

-p :映射docker容器的端口,docker里面的9100端口映射到Linux的9100端口上

--name: 給我的container起個別名,這個可以不加

這樣子,如果你在控制台看到如下提示,就證明你已經成功了:

Hosting environment: Production
Content root path: /docker
Now listening on: http://*:9100
Application started. Press Ctrl+C to shut down.

查看一下你的Linux服務器的Ip,然后通過http://ip:9100 來訪問你的api吧,默認的API項目只有/api/values這個URL可以訪問,最終運行效果如下:

QQ截圖20160827004953

如果您在閱讀過程中,遇到一些問題,歡迎留言討論。

未完待續……


免責聲明!

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



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