在Docker生態系統中除了上一節所講解的基本概念,還有其餘專業術語,本文咱們將一筆帶過,同時會開始陸續進入到在.NET Core中使用Docker。linux
Docker Engine(Docker引擎):客戶端 - 服務器應用程序。 Docker公司將Docker Engine分爲兩個產品。 Docker Community Edition(CE)基於開源工具且免費,咱們學習時可使用這款產品。 Docker Enterprise附帶了其餘功能支持,好比管理和安全等等功能。docker
Docker Client(Docker客戶端):咱們與Docker進行交互的主要方式。 使用Docker命令行界面(CLI)時,在終端中鍵入以docker開頭的命令,Docker Client會使用Docker API將命令發送到Docker守護進程中。ubuntu
Docker Daemon(Docker守護進程):監聽Docker API請求的Docker服務器。 Docker守護進程主要管理鏡像,容器,網絡和卷。瀏覽器
Docker Volumes(Docker卷):存儲建立應用程序和運行應用程序持久化數據的最佳方式。安全
Docker Registry:存儲Docker鏡像的遠程註冊位置。 咱們將鏡像推送到註冊表並從註冊表中提取圖像,咱們能夠託管本身的註冊表或使用供應商商的註冊表。服務器
Docker Hub:Docker鏡像的最大註冊表。 它也是Dcoker默認的註冊表位置, 咱們能夠在Docker Hub上找到免費的鏡像並存儲咱們本身的圖像。網絡
Docker Networking:容許咱們將Docker容器鏈接在一塊兒。 鏈接的Docker容器能夠位於同一主機或多個主機上。app
Docker Compose:屬於一個工具,咱們能夠很是輕鬆地運行須要多個Docker容器的應用程序。 Docker Compose容許咱們將命令寫到docker-compose.yml文件中以供重用。 Docker Compose命令行界面(cli)使咱們能夠更輕鬆地與多容器應用程序進行交互。 Docker Compose免費安裝Docker。async
Docker Swarm:容器部署編排的產品。Docker官方教程進行容器編排和部署使用的Docker Swarm。 建議不要浪費時間在Docker Swarm上,推薦使用Kubernetes(k8s)。分佈式
Docker Services:分佈式應用程序的不一樣部分。 服務實際上只是「生產中的容器」。服務只運行一個鏡像,但它編碼了鏡像的運行方式 - 它應該使用哪些端口,容器應該運行多少個副本,以便服務具備所需的容量等等。 擴展服務會更改運行該軟件的容器實例的數量,從而爲流程中的服務分配更多計算資源。Docker服務容許咱們跨多個Docker守護進程擴展容器,並使Docker Swarms成爲可能。
Docker鏡像在構建時被建立,而Dokcer容器在運行時被建立。Dockerfile是Docker的核心,Dockerfile告訴Docker如何構建鏡像從而被用來製做容器,每一個Docker鏡像都包含一個名爲Dockerfile但沒有擴展名的文件。當調用docker build以建立映像時,假定Dockerfile位於當前工做目錄中,可使用文件標誌(-f)指定到其餘位置,容器是由一系列層所構建,並且每一個鏡像層只讀,除了位於其餘鏡像層之上的最終容器鏡像層。 Dockerfile告訴Docker要添加哪些層以及添加它們的順序,每一個鏡像層實際上只是一個包含自上一層以來的所更改的文件。 在linux中,幾乎全部東西都是文件。基礎鏡像提供初始層,基礎鏡像也稱爲父鏡像,將鏡像從遠程存儲庫提取到本地時,僅僅只下載本地計算機上還沒有存在的層, Docker經過重用現有層來節省空間和時間。
Dockerfile指令是一行開頭的大寫單詞,後緊跟其參數,Dockerfile中的每一行均可以包含一條指令。 構建圖像時,將從上到下處理指令,以下:
只有FROM,RUN,COPY和ADD指令才能在最終鏡像中建立鏡像層,其餘指令只是做爲配置或說明,好比添加元數據或告訴Docker在運行時執行某些操做,例如公開端口或運行命令。在本文中,咱們使用基於linux的Docker鏡像,固然咱們也可使用基於Windows的鏡像,建議使用linux。接下來咱們來過濾下Dockerfile中各個指令說明。
FROM - 指定基礎(父)鏡像。
LABEL - 提供元數據,包含維護者信息。
ENV - 設置持久化環境變量。
RUN - 運行命令並建立鏡像層,用於將包安裝到容器中。
COPY - 將文件和目錄複製到容器中。
ADD - 將文件和目錄複製到容器中。 能夠upack本地.tar文件。
CMD - 爲執行容器提供命令和參數,能夠覆蓋參數,只能有一個CMD。
WORKDIR - 設置後續說明的工做目錄。
ARG - 定義一個在構建時傳遞給Docker的變量。
ENTRYPOINT - 爲正在執行的容器提供命令和參數。
EXPOSE - 對外暴露端口。
VOLUME - 建立目錄用於訪問和存儲持久化數據。
接下來咱們以.NET Core中使用Docker並輸出Hello World結束本文。
咱們經過命令建立一個.NET Core控制檯程序,接下來爲了在頁面上輸出Hello World,咱們須要使用中間件,因此咱們添加AspNetCore包,以下:
而後咱們打開控制檯程序,添加中間件打印Hello World代碼:
public class Startup { public void Configure(IApplicationBuilder applicationBuilder, IHostingEnvironment hostingEnvironment) { applicationBuilder.Run(async context => { await context.Response.WriteAsync("Hello World"); }); } }
class Program { static void Main(string[] args) { WebHost.CreateDefaultBuilder() .UseStartup<Startup>() .UseKestrel() .UseUrls("http://0.0.0.0:5050") .Build() .Run(); } }
程序已就緒完畢,接下來咱們發佈該控制檯程序,以下:
接下來將執行上述步驟生成的bin目錄(實際上只需拷貝發佈後生成的publish目錄便可,爲了省事,我直接拷貝了整個bin目錄)拷貝到ubuntu中(因爲我對linux不熟悉,因此採用虛擬機加載桌面端ubuntu鏡像的方式,對於從未使用過linux的童鞋,推薦使用桌面端ubuntu,友好的GUI界面,方便咱們初學知道各個文件夾是作什麼的,一看便知,後續再使用服務端版的ubuntu就會駕輕就熟啦)。
接下來咱們進入HelloWorld文件目錄,建立Dockerfile文件從而來建立.NET Core鏡像。
而後咱們來編寫Dockerfile文件構建鏡像,以下:
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime COPY ./bin/Debug/netcoreapp2.2/linux-x64/publish/ ./ ENTRYPOINT ["dotnet", "HelloWorld.dll"]
父鏡像爲.NET Core 2.2版本和咱們建立的程序版本一致,而後將咱們的應用程序(即publish目錄)拷貝,最後指定程序運行的命令和參數。有了Dockerfile文件,那麼咱們就能夠開始構建鏡像了,終端繼續運行以下命令(注意:鏡像標籤名稱必須所有爲小寫,不然報錯):
docker build . -t hellowrold
鏡像已構建完畢,接下來則是建立並啓動容器運行程序,以下:
docker run -p 5050:5050 hellowrold
從上述咱們可看到容器已正常啓動,且運行環境爲生產環境,監聽端口爲5050。桌面版ubuntu默認爲咱們安裝了火狐瀏覽器,此時咱們打開瀏覽器將會輸出Hello World,以下:
本文咱們介紹Docker中的一些術語,而後最後寫了一個在.NET Core中使用Docker的入門例子,很是簡單。若直接使用服務端版本的ubuntu我是一臉懵逼,有了界面,我也大概知道了一些文件夾裏存放的是什麼,一目瞭然,雖然說這還只是冰山一角,天天積累一點,日積月累,厚積薄發嘛不是。