1. 程式人生 > >Docker & ASP.NET Core (1):把程式碼連線到容器

Docker & ASP.NET Core (1):把程式碼連線到容器

和這種蛋糕一樣,Docker的容器和映象也是使用類似的分層檔案系統構建而成的。

這樣做的好處就是可以節省硬碟空間,也利於複用等等。因為Docker基於映象建立容器的時候,其映象是共享的;而且映象裡面的層如果已存在,也無需再下載。

下面拉取一個mongodb的映象,拉取的過程中可以看到:

圖中紅框範圍內的就是mongo映象的不同分層,也就是映象中的分層檔案系統。

然而這些映象層是隻讀的:

這樣的限制多少看起來有點嚴格,如果你想使用該映象讀寫資料庫怎麼辦?或者記錄Log到檔案,或者在容器執行的時候替換一些原始碼該怎麼辦?

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

從圖中也可以看出容器和映象的不同之處。

你可以在容器層進行寫入,但是如果容器被刪除了,那麼可讀寫的這一層也會被刪除。

這樣就不太友好了,而這時我們可以使用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應用了:

相關推薦

Docker & ASP.NET Core (1)程式碼連線容器

和這種蛋糕一樣,Docker的容器和映象也是使用類似的分層檔案系統構建而成的。 這樣做的好處就是可以節省硬碟空間,也利於複用等等。因為Docker基於映象建立容器的時候,其映象是共享的;而且映象裡面的層如果已存在,也無需再下載。 下面拉取一個mongodb的映象,拉取的過程中可以看到: 圖中

Docker & ASP.NET Core (2)定製Docker映象

Dockerfile 在Docker的世界裡,我們可以通過一個叫Dockerfile的檔案來建立Docker映象,隨後可以執行容器。 Dockerfile就是一個文字檔案,裡面寫著一些指令。通過Docker Client,並使用docker build這個命令,docker build命令會讀取該檔案裡面

Docker & ASP.NET Core (3)釋出映象

上一篇文章最後有個問題,定製的映象無法正常執行: 這可能是由於無法找到要執行的dll引起的問題。 之前的Dockerfile的文件我是按照微軟的文件操作的。 現在的Dockerfile是: 然後我build映象: 然後在Powershell裡執行: 可以

Docker & ASP.NET Core (2)定製Docker映象

Dockerfile 在Docker的世界裡,我們可以通過一個叫Dockerfile的檔案來建立Docker映象,隨後可以執行容器。 Dockerfile就是一個文字檔案,裡面寫著一些指令。通過Docker Client,並使用docker build這個命令,docker build命令會讀取該檔案裡面

Docker & ASP.NET Core (3)釋出映象

第一篇:把程式碼連線到容器  第二篇:定製Docker映象   上一篇文章最後有個問題,定製的映象無法正常執行: 這可能是由於無法找到要執行的dll引起的問題。 之前的Dockerfile的文件我是按照微軟的文件操作的。 不過隨後我還是查看了Docker的文件:https:

Docker & ASP.NET Core (4)容器間的連線

第一篇:把程式碼連線到容器  第二篇:定製Docker映象 第三篇:釋出映象   Docker容器間的連線 Docker提供了兩種方式可以用來做容器間的連線/通訊: Legacy Linking:這種方式使用容器名進行連線,實際上它建立了一個橋接的網路,在這個網路裡,容器

ASP.NET Core 實戰將 .NET Core 2.0 專案升級到 .NET Core 2.1

 一、前言    最近一兩個星期,加班,然後回去後弄自己的部落格,把自己的電腦從 Windows 10 改到 Ubuntu 18.10 又弄回 Windows 10,原本計劃的學習 Vue 中生命週期的相關知識目前也沒有任何的進展,嗯,罪過罪過。看了眼時間,11月也快要結束了,準備補上一

Docker & ASP.NET Core (5)Docker Compose

服務啟動 volumes 輸出日誌 遇到 www 規模 輸出 我想 star 原文:Docker & ASP.NET Core (5):Docker Compose第一篇:把代碼連接到容器 第二篇:定制Docker鏡像 第三篇:發布鏡像 第四篇:容器間的連接

Docker & ASP.NET Core (4)容器間的連接

nbsp ati driver 橋接網絡 pos 客戶 不同 sta 監聽 原文:Docker & ASP.NET Core (4):容器間的連接第一篇:把代碼連接到容器 第二篇:定制Docker鏡像 第三篇:發布鏡像 Docker容器間的連接 Do

asp.net core建立web api 並且連線sqlite 使用程式碼直接建立資料庫 code first

環境visual studio 2017免費版,.net core 2.2 1.建立asp.net core web api 專案 .net core 選擇當前最新版本,專案選擇API型別,不進行身份驗證,點選確定。 此時一個web api專案就建立好了。 直接執行,先看

ASP.NET Core 實戰使用 ASP.NET Core Web API 和 Vue.js,搭建前後端分離框架

前言         這幾年前端的發展速度就像坐上了火箭,各種的框架一個接一個的出現,需要學習的東西越來越多,分工也越來越細,作為一個 .NET Web 程式猿,多瞭解瞭解行業的發展,讓自己擴展出新的技能樹,對自己的職業發展還是

ASP.NET Core 實戰Linux 小白的 .NET Core 部署之路

 一、前言    最近一段時間自己主要的學習計劃還是按照畢業後設定的計劃,自己一步步的搭建一個前後端分離的 ASP.NET Core 專案,目前也還在繼續學習 Vue 中,雖然中間斷了很長時間,好歹還是堅持下來了,嗯,看了看時間,原本決定的半年完成肯定是完不成了。這兩週重新拾起來學習 Vue,文章也在慢慢的

ASP.NET Core 實戰構建帶有版本控制的 API 接口

uil 早已 請求參數 想要 cin 可選 true ora documents 一、前言   在上一篇的文章中,主要是搭建了我們的開發環境,同時創建了我們的項目模板框架。在整個前後端分離的項目中,後端的 API 接口至關重要,它是前端與後端之間進行溝通的媒介,如何構

ASP.NET Core 實戰構建帶有版本控制的 API 介面

 一、前言    在上一篇的文章中,主要是搭建了我們的開發環境,同時建立了我們的專案模板框架。在整個前後端分離的專案中,後端的 API 介面至關重要,它是前端與後端之間進行溝通的媒介,如何構建一個 “好用” 的 API 介面,是需要我們後端人員好好思考的。  在系統迭代的整個過程中,不可

ASP.NET Core 1.0中的管道-中介軟體模式

ASP.NET Core 1.0借鑑了Katana專案的管道設計(Pipeline)。日誌記錄、使用者認證、MVC等模組都以中介軟體(Middleware)的方式註冊在管道中。顯而易見這樣的設計非常鬆耦合並且非常靈活,你可以自己定義任意功能的Middleware註冊

ASP.NET Core 開發中介軟體

ASP.NET Core開發,開發並使用中介軟體(Middleware)。中介軟體是被組裝成一個應用程式管道來處理請求和響應的軟體元件。每個元件選擇是否傳遞給管道中的下一個元件的請求,並能之前和下一組分在管道中呼叫之後執行特定操作。 具體如圖: 開發中間件(Mid

ASP.NET Core 實戰使用 NLog 將日誌資訊記錄到 MongoDB

 一、前言   在專案開發中,日誌系統是系統的一個重要組成模組,通過在程式中記錄執行日誌、錯誤日誌,可以讓我們對於系統的執行情況做到很好的掌控。同時,收集日誌不僅僅可以用於診斷排查錯誤,由於日誌同樣也是大量的資料,通過對這些資料進行集中分析,可以產生極大的價值。  在微服務的系統架構中,由於一個系

ASP.NET Core 實戰使用 NLog 將日誌信息記錄到 MongoDB

uil cfg init com shutdown 右鍵 重新 系統 文件的   在項目開發中,日誌系統是系統的一個重要組成模塊,通過在程序中記錄運行日誌、錯誤日誌,可以讓我們對於系統的運行情況做到很好的掌控。同時,收集日誌不僅僅可以用於診斷排查錯誤,由於日誌同樣也是大量的

VS2017 建立的 ASP.NET Core 1.1 Web 專案 釋出的IIS7提示“HTTP Error 502.5

VS2017 建立的ASP.NET Core 1.1 的專案,本地釋出配置成功,但是在伺服器 IIS 配置提示“HTTP Error 502.5 - Process Failure” 截圖: 測試: 1、VS2015 建立一個NET Core 1.0 的專案執行成功; 2、

ASP.NET CORE 1.0 初次接觸

vs2015 update3 升級後,可以建立asp.net core 1.0 的web應用了, 預設模版,釋出到指定資料夾 伺服器上需要安裝 DotNetCore.1.0.0-WindowsHostinghttps://www.microsoft.com/net/download   server host