目錄html
本文建立一個簡單的 .net core webapi 項目,並經過 Docker 運行起來。涉及到 Dockerfile 編寫,生成鏡像,並運行鏡像到容器裏。git
建立基於 .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() }; }
在項目根目錄使用 dotnet publish 命令發佈應用程序,發佈後的資源被保存在目錄
\bin\Debug\netcoreapp2.0\publish 下面。docker
在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 修改默認的啓動端口
經過WinSCP相似的軟件,將該目錄下的所有內容複製到Ubuntu機器上。
在 Dockerfile 文件同目錄下執行如下命令,建立Docker Image。千萬別省略了最後一個點號,它表示採用當前路徑的Dockerfile來生成Docker Image。
docker build -t getmachinewebapi:v0.1 .
在這條命令中:
-t參數用來指定 image 文件的名字,後面還能夠用冒號指定標籤。若是不指定,默認的標籤就是latest。
最後的那個點表示 Dockerfile 文件所在的路徑,上例是當前路徑,因此是一個點。
詳細請參考官網docker build文檔
如今,咱們就可使用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文檔
在Linux主機裏面經過curl測試:
curl http://localhost:8080/api/values && echo
或者在另一臺機器訪問地址 例如http://192.168.174.135:8080/api/values