Docker & ASP.NET Core (1):把代碼鏈接到容器

和這種蛋糕同樣,Docker的容器和鏡像也是使用相似的分層文件系統構建而成的。web

這樣作的好處就是能夠節省硬盤空間,也利於複用等等。由於Docker基於鏡像建立容器的時候,其鏡像是共享的;並且鏡像裏面的層若是已存在,也無需再下載。mongodb

 

下面拉取一個mongodb的鏡像,拉取的過程當中能夠看到:docker

圖中紅框範圍內的就是mongo鏡像的不一樣分層,也就是鏡像中的分層文件系統。shell

 

然而這些鏡像層是隻讀的:數據庫

這樣的限制多少看起來有點嚴格,若是你想使用該鏡像讀寫數據庫怎麼辦?或者記錄Log到文件,或者在容器運行的時候替換一些源代碼該怎麼辦?瀏覽器

 

幸運的時候使用該鏡像的容器會有可用於讀寫的"薄薄"一層:bash

從圖中也能夠看出容器和鏡像的不一樣之處。app

 

你能夠在容器層進行寫入,可是若是容器被刪除了,那麼可讀寫的這一層也會被刪除。測試

這樣就不太友好了,而這時咱們可使用Volume(卷)網站

 

下面就是這個問題,如何把源碼裝進容器裏?

1.能夠在製作鏡像的時候把源碼直接寫入鏡像。(這個先不考慮)

2.把源碼裝進容器的可讀寫層。(這個是我要介紹的)

 

Volume是什麼?

  • Volume(卷)是容器中一個特別種類的目錄,一般叫作數據volume,顧名思義,裏面能夠放置各類類型的數據,例如代碼、日誌文件、數據文件等等。
  • Volume能夠在容器間被共享和複用。可讓多個容器對同一個volume進行讀寫,也可讓一個容器讀寫多個volume。
  • 對鏡像的更新並不會影響volume。
  • Volume是被持久化的,即便容器刪除了,它仍然還在。

 

能夠這樣去理解Volume,若是有一個容器,那麼咱們能夠在這個容器裏面定義一個Volume:

 

那麼想要寫到哪裏去呢?

可讓Docker本身搞定,或者你也能夠自定義。

讓Docker決定寫入的位置

先介紹第一種狀況,當你寫入到volume的時候,好比在Docker容器裏的代碼對/var/www作了一個寫入的操做,那該目錄其實就是你docker host裏面的一個裝載的文件夾(mounted folder)的別名。Docker host也就是容器的宿主,若是你使用的是Linux系統或Windows 2016及以上版本的系統,那麼該宿主就是操做系統。容器也就是運行在該系統上。

那麼在這個例子裏,咱們寫入的這個volume,它能夠不是容器的可讀寫層,它實際上能夠寫入docker host的裝載的文件夾,也就是操做系統的文件夾。即便你把容器刪除了,docker host裏的文件夾仍在健在。

 

一般咱們使用以下命令來運行容器:

docker run -p 8000:80 microsoft/dotnet-samples:aspnetapp

 

而咱們可使用-v參數來指定volume:

docker run -p 8000:80 -v /var/www microsoft/dotnet-samples:aspnetapp

這樣的話,/var/www只是容器Volume的別名,實際被寫入的區域在Docker Host裏,docker會自動的建立這個區域。

 

可使用docker inspect 容器名這個命令來查看相關的路徑。

執行該命令後的結果中會顯示以下部分Mounts:

其中Destination是volume在容器裏的地址(別名),而Source則是Volume在宿主中的地址。

以上這部分介紹的就是讓Docker來建立寫入的目錄。

 

自定義寫入的位置

下面講一下如何自定義這個目錄的地址。

這樣就對咱們開發寫代碼比較友好了,個人代碼存放於Windows/Mac系統中,而後咱們讓Volume讀寫咱們代碼所在的區域。

那麼應該使用哪一個Docker命令呢?

docker run -p 8000:80 -v ${PWD}:/var/www microsoft/dotnet-samples:aspnetapp

使用-v在容器裏建立一個volume,它在容器的地址是/var/www,可是當你對它進行讀寫操做時,它實際上找的是宿主的地址,在這裏也就是當前的工做目錄(curent working directory)。

 

若是你這時再執行docker inspect命令,其結果大概以下:

 

把ASP.NET Core的源碼鏈接到Volume

首先使用dotnet cli或者VS創建一個ASP.NET Core項目:

 

而後使用dotnet run測試一下網站是否能正常運行:

 

 

接下來看看這個ASP.NET Core網站如何與Volume聯繫在一塊兒。

 

首先下載aspnetcore-build鏡像:docker pull microsoft/dotnet:2.1-sdk

下載完鏡像以後,就須要建立容器和Volume了,不過在此以前先打開命令行,進入ASP.NET Core項目源碼的目錄:

 

而後執行下面的命令(Windows 10 Powershell):

docker run -it -p 8080:5001 -v ${PWD}:/app --workdir "/app" microsoft/dotnet /bin/bash

這句話裏-it參數表示進入交互模式

-p 8080:5001 表示把容器裏的5001端口映射給宿主的8080端口。

-v 表示建立volume

${PWD}是指宿主當前的目錄。

${PWD}:/app就是把容器裏的/app文件夾鏈接到了宿主系統裏的當前文件夾,而容器裏的/app目錄就是應用程序將要運行的位置。

 --workdir "/app"表示容器裏當前的工做目錄是/app。

而後使用microsoft/dotnet這個鏡像。

最後使用/bin/bash返回一個終端,以便讓我與容器裏進行交互。

 

執行命令後,Docker可能會有提示須要共享一個目錄,點擊確認便可。

而後我就會進入Container了:

 

進入容器以後,我就能夠執行dotnet restore, dotnet build等等命令了:

 

固然了,能夠執行dotnet run:

 

然而這時候,我訪問本機(宿主)的localhost:8080,確沒法顯式頁面。

首先爲了簡便,先把HTTPS重定向相關的內容去掉。

而後要讓應用監放任意地址的5001端口:

 

而後再次運行dotnet run。

隨後在宿主系統的瀏覽器打開http://localhost:8080便可打這個ASP.NET Core的web應用了:

相關文章
相關標籤/搜索