本教程的前提是,你已經在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可以訪問,最終運行效果如下:
如果您在閱讀過程中,遇到一些問題,歡迎留言討論。
未完待續……

