發佈 .Net Core WebAPI 應用程序到 Docker

本文建立一個簡單的 .net core webapi 項目,並經過 Docker 運行起來。涉及到 Dockerfile 編寫,生成鏡像,並運行鏡像到容器裏。git

1. 建立 .net core webapi 項目

建立基於 .net core 2.0 的 webapi 項目,命名爲 GetMachNameWebAPI。github

並修改 ValuesController 的 Get() 方法返回當前機器的機器名或其餘操做。web

// GET api/values
[HttpGet]
public IEnumerable<string> Get()
{
    return new string[] { Environment.MachineName, Environment.OSVersion.Platform.ToString() };
}

2. 編譯應用

在項目根目錄使用 dotnet publish 命令發佈應用程序,發佈後的資源被保存在目錄
\bin\Debug\netcoreapp2.0\publish 下面。docker

3. 建立 Dockerfile 文件

在publish裏目錄裏面新建一個Dockerfile文件(文件名就是Dokerfile,沒有擴展名),並在該文件中定義以下的內容:shell

# 基於microsoft/aspnetcore:2.0構建Docker Image
FROM microsoft/aspnetcore:2.0
 
# 設置工做路徑
WORKDIR /app
 
# 將當前文件夾下的全部文件所有複製到工做目錄
COPY *.* ./
 
# 配置環境變量ASPNETCORE_URLS
ENV ASPNETCORE_URLS http://0.0.0.0:5000

# 暴露5000端口
EXPOSE 5000
 
# 執行dotnet GetMachNameWebAPI.dll命令
CMD ["dotnet", "GetMachNameWebAPI.dll"]

FROM:第一個指令必須爲 FROM。 此指令用於初始化新的生成階段,併爲剩餘指令設置基礎映像。可以使用多個FROM爲多個映像。api

WORKDIR:爲剩餘的任意 RUN、CMD、ENTRYPOINT、COPY 和 ADD Dockerfile 指令設置工做目錄。 若是不存在,則會建立該目錄。服務器

COPY:從源路徑複製新文件或目錄,並將它們添加到目標容器文件系統。app

ENV:用來在鏡像構建過程當中設置環境變量。curl

RUN:在當前映像之上的一個新層中執行任何命令,並提交結果。

ENTRYPOINT:支持以可執行文件的形式運行容器。每一個Dockerfile中只能有一個 ENTRYPOINT ,當指定多個時,只有最後一個起效。

詳細請參考官網Dockerfile reference文檔

注意ASPNETCORE_URLS的配置能夠直接在代碼裏面Program的Main方法裏指定,好比:

.UseUrls("http://localhost:5001")

也能夠如本文經過環境變量配置。可參看.Net Core 修改默認的啓動端口

4. 上傳文件到服務器

經過WinSCP相似的軟件,將該目錄下的所有內容複製到Ubuntu機器上。

5. 生成Docker Image

在 Dockerfile 文件同目錄下執行如下命令,建立Docker Image。千萬別省略了最後一個點號,它表示採用當前路徑的Dockerfile來生成Docker Image。

docker build -t getmachinewebapi:v0.1 .

在這條命令中:

-t參數用來指定 image 文件的名字,後面還能夠用冒號指定標籤。若是不指定,默認的標籤就是latest。

最後的那個點表示 Dockerfile 文件所在的路徑,上例是當前路徑,因此是一個點。

詳細請參考官網docker build文檔

6. 在Docker Container中運行 Web API應用

如今,咱們就可使用docker run來執行剛纔產生的Docker Image了。docker run會把Docker Image加載到Docker Container中,而後執行由Dockerfile指定的命令(也就是dotnet DockerWebAPI.dll命令)。docker run的命令以下

docker run -it -p 8080:5000 getmachinewebapi:v0.1

在這條命令中:

-it參數:表示須要提供一個模擬的shell環境,並要求有用戶交互功能,這樣在本機窗口輸入的命令,就會傳入容器。

-p 8080:5000參數:表示須要將Docker Container的5000端口映射到主機環境的8080端口,也就是客戶端能夠直接經過8080端口訪問咱們的應用程序。

getmachinewebapi:v0.1參數:image 文件的名字(若是有標籤,還須要提供標籤,默認是 latest 標籤)。

詳細請參考官網docker run文檔

7. 測試

在Linux主機裏面經過curl測試:

curl http://localhost:8080/api/values && echo

或者在另一臺機器訪問地址 例如http://192.168.174.135:8080/api/values

源代碼

參考

相關文章
相關標籤/搜索