Docker & ASP.NET Core (2):定製Docker鏡像

上一篇文章:把代碼鏈接到容器 html

Dockerfile

在Docker的世界裏,咱們能夠經過一個叫Dockerfile的文件來建立Docker鏡像,隨後能夠運行容器。node

Dockerfile就是一個文本文件,裏面寫着一些指令。經過Docker Client,並使用docker build這個命令,docker build命令會讀取該文件裏面的指令,生成一層文件系統,而後就生產出了一個docker的鏡像。python

Dockerfile的文件名就是Dockerfile,固然了也能夠叫別的名,可是一般就叫Dockerfile。git

Dockerfile裏面包含着各類指令,這些指令會建立一箇中間層鏡像,這個中間層鏡像能夠被緩存,這樣的話之後構建的時候速度就很快了。github

 

Dockerfile的主要指令:docker

  • FROM。一般狀況下,你要建立的鏡像是基於另一個鏡像的,這就須要使用FROM,固然也能夠徹底從頭建立。
  • MAINTAINER。該鏡像的維護人。
  • RUN。這裏能夠定義一些須要運行的命令。例如npm install,dotnet restore等等。
  • COPY。開發的時候,能夠把源碼放在Volumes裏。而在生產環境下,常常須要把源碼複製到容器裏面,使用COPY就能夠作到這點。
  • ENTRYPOINT。它能夠定義容器的入口,把容器配置成像exe同樣的運行文件。一般是一些例如dotnet 命令,node命令等等。
  • CMD。設置容器運行的默認命令和參數。當容器運行的時候,這個能夠在命令行被覆蓋。
  • WORKDIR。設定容器運行的工做目錄。
  • EXPOSE。暴露端口。
  • ENV。設定環境變量。
  • VOLUME。定義Volume,並控制如何在宿主中進行存儲。

 

下面是官網的一個Dockerfile的例子:shell

 

FROM python:27.-slim,說明該鏡像要基於python:2.7-slim這個鏡像構建。這將會是一層。npm

COPY . /app,是指在構建鏡像的時候,從當前目錄把源碼複製到/app目錄下。這又是一層。緩存

RUN xxx,是指在WORKDIR(/app)下執行pip install xxx這行命令。app

EXPOSE 80,是指把容器的80端口暴露給外界。

ENV,定義了環境變量。

CMD ["python", "app.py"],裏定義了容器運行的默認命令和參數。

 

建立一個ASP.NET Core Dockerfile

在Docker hub裏找到aspnetcore:

裏面第一個microsoft/aspnetcore 只有運行時,因此只能dotnet run,適用於生產環境。

第二個microsoft/aspnetcore-build裏有完整的dotnet sdk,能夠執行dotnet restore, dotnet build, dotnet run等等。

 

使用VSCode打開我上篇文章創建的ASP.NET Core項目(或者新建一個也能夠):

 

而後咱們這樣來建立Dockerfile,首先點擊Extensions,搜索docker:

能夠找到一個Docker擴展,是由微軟開發的。安裝它便可。

 

安裝完後,點擊Docker按個圖標:

就能夠看到本機上的Docker鏡像,容器,註冊信息等等。

 

而後按Ctrl+Shift+P,而後輸入docker:

能夠看到有不少可用的命令。

選擇Add Docker Files to Workspace,而後選擇ASP.NET Core:

 

而後選擇操做系統,這裏我選Linux:

 

而後填寫內部的端口,我這個項目是5001:

 

而後按回車,就會生成Dockerfile,同時還有一個.dockerignore文件:

(在編輯Dockerfile文件的時候還有智能提示的)。

看一下這個文件:

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base,就是把前面的鏡像起了一個別名,叫作base。

WORKDIR /app,工做目錄是 /app。

端口5001。

下面幾句相似,而後:

COPY ["VolumeSample.csproj", "./"],就是把VolumeSample.csproj複製到當前工做的目錄。

RUN dotnet restore "./VolumeSample.csproj",執行dotnet restore。

COPY . .,而後把全部的源碼也複製到當前的工做目錄。

WORKDIR "/src/.",切換工做目錄到/src。

RUN dotnet build "VolumeSample.csproj" -c Release -o /app,再執行dotnet build命令,並把結果放在/app目錄下。

 

後邊幾句也是相似:

COPY --from=publish /app .,是指從publish目錄複製,具體是從publish/app目錄複製,到當前的工做目錄。

ENTRYPOINT ["dotnet", "VolumeSample.dll"],就是運行該鏡像會執行的命令dotnet VolumeSample.dll。
 
(一個項目裏能夠有多個Dockerfile,例如區分開發和生產環境,可是文件名最好使用dockerfile後綴,由於這樣在VSCode裏有智能提示)。
 

建立鏡像

其實上面使用VSCode生成的Dockerfile並非我須要的,我須要的Dockerfile仍是按照官方文檔來吧:

https://github.com/aspnet/aspnet-docker/blob/master/README.aspnetcore-build.md

最後是這樣的:

也是多個Stage的。

 

而後執行這個命令來構建鏡像:

docker build -t solenovex/aspnetcore .

使用docker build,-t表示tag,而後是用戶名和要起的鏡像名,鏡像名後邊能夠跟着具體的tag,例如solenovex/aspnetcore:1.0,若是不加的話就是latest。最後一個.表示當前這個含有Dockerfile目錄是我要進行構建的內容。

 

執行的時候會遇到.net sdk版本不匹配的問題,也就是microsoft/aspnetcore-build這個鏡像的.net sdk版本有點低。

 

因此,我只好改成使用microsoft/dotnet:2.1-sdk這個鏡像了:

 

再次執行:docker build -t solenovex/aspnetcore .

這個構建的過程仍是挺快的,過程大概以下:

成功了。

 

而後從VSCode的docker擴展裏就能夠看到我剛剛建立的鏡像:

 

而後在Powershell裏面建立/運行一個容器:

 

執行docker ps -a:

能夠看到該容器運行後就立刻退出了,查看一下日誌看看緣由:

 

錯誤信息是:

其實這個錯誤信息感受並不明確。

 

具體怎麼解決這個錯誤,且聽下回分解。。

相關文章
相關標籤/搜索