打通Docker鏡像發佈容器運行流程

Docker 是一個開源的應用容器引擎,基於 Go 語言 並聽從 Apache2.0 協議開源。Docker 可讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,而後發佈到任何流行的 Linux 機器上,也能夠實現虛擬化。
容器是徹底使用沙箱機制,相互之間不會有任何接口(相似 iPhone 的 app),更重要的是容器性能開銷極低。Docker 從 17.03 版本以後分爲 CE(Community Edition: 社區版) 和 EE(Enterprise Edition: 企業版),咱們用社區版就能夠了。linux

正如以上所說,Docker誕生的意義不只僅實現了相似虛擬機的隔離性,最主要的是它能夠把應用程序以及應用程序的運行環境整個打包在一塊兒。注意:是整個環境哦,不只僅是一些依賴庫。這個劃時代的進步,直接把docker鏡像和宿主分離開來,使得docker鏡像只要公佈出來,就能使任何人在任何地方任什麼時候間均可以隨意運行,換句話說,docker鏡像能夠被分發到任何運行docker的服務器上。算法

Docker 架構

在docker的架構中,主要有三個主要概念:docker

鏡像

Docker 鏡像能夠看做是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些爲運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。鏡像不包含任何動態數據,其內容在構建以後也不會被改變。windows

docker鏡像由多層組成,不一樣的鏡像都能使用相同的父鏡像做爲他們的基礎鏡像,這些相同的基礎鏡像在docker的角度來看就是徹底相同的層。在docker鏡像的傳輸過程當中,當某些相同的層已經存在的時候,就徹底不須要從新傳輸了,這大大提升了鏡像在網絡上的傳輸效率。設計模式

分層的設計不只使鏡像分發更高效,也有利於減小鏡像的存儲空間。每一層僅僅被存儲一次,就算基於相同基礎層的鏡像被建立兩個容器的時候,這兩個容器也是互相隔離的,雖然他們能讀到相同的文件,可是卻看不到對方文件的修改。一個容器被建立的時候,會建立一個新的可寫層,容器中的修改會反應到這個新的可寫層中。就算了容器修改了底層的文件,此文件的修改內容會copy到頂層,底層依然不會發生變化。服務器

容器

鏡像(Image)和容器(Container)的關係,就像是面向對象程序設計中的類和實例同樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器能夠被建立、啓動、中止、刪除、暫停等。docker的容器一般是一個linux容器,它是運行在宿主機上的一個進程,可是和其餘宿主進程是隔離的,而且所用的資源是受限的(只能訪問特定的資源,好比網絡接口,文件系統)網絡

鏡像倉庫

鏡像倉庫和它的字面意思一致,是不少鏡像的集合,它的做用就是把鏡像共享給每一個人,固然這裏順便提一下,鏡像倉庫也能夠有私人倉庫。當你的應用程序被打包以後,若是想在另一個機器上運行,你就能夠把你的應用鏡像上傳到鏡像倉庫,而後開放這個倉庫,這樣網絡上的任何機器都可以下載你的鏡像,而後運行。數據結構

一般,一個倉庫會包含同一個軟件不一樣版本的鏡像,而標籤就經常使用於對應該軟件的各個版本 。咱們能夠經過<倉庫名>:<標籤>的格式來指定具體是這個軟件哪一個版本的鏡像。若是不給出標籤,將以 latest 做爲默認標籤.。架構

倉庫又能夠分爲兩種形式:
public(公有倉庫)
private(私有倉庫)
Docker Registry 公有倉庫是開放給用戶使用、容許用戶管理鏡像的 Registry 服務。通常這類公開服務容許用戶免費上傳、下載公開的鏡像,並可能提供收費服務供用戶管理私有鏡像。併發

除了使用公開服務外,用戶還能夠在本地搭建私有 Docker Registry 。Docker 官方提供了 Docker Registry鏡像,能夠直接使用作爲私有 Registry 服務。當用戶建立了本身的鏡像以後就可使用 push 命令將它上傳到公有或者私有倉庫,這樣下次在另一臺機器上使用這個鏡像時候,只須要從倉庫上 pull 下來就能夠了。

構建分發運行鏡像

開發人員首先構建一個鏡像,而後把鏡像推到鏡像倉庫中。所以,任何能夠訪問鏡像倉庫的人均可以使用該鏡像。而後,他們能夠將鏡像拉取到任何運行着Docker的機器上並運行鏡像。Docker會基於鏡像建立一個獨立的容器,並運行二進制可執行文件指定其做爲鏡像的一部分。

image

docker的缺陷

就像全部的技術解決方案,docker也不是完美的。docker的缺陷在於運行的內核,因爲它直接運行在宿主機的內核之上,因此若是docker容器的運行內核版本和宿主機的內核不匹配就會出現問題。追根到底,仍是硬件架構設計上的差別,不只僅是docker容器,幾乎全部的軟件都會有內核架構不一樣而不能運行的問題。除此以外,因爲docker是基於linux的容器技術,因此在windows下運行並不使人滿意,雖然這些年docker在windows上也進步了不少。

docker鏡像發佈

docker鏡像的倉庫有不少,這裏以官方網站https://hub.docker.com/ 爲例,首先你要在官網建立一個帳號,而後能夠在Account Settings=》Security中設置一個AccessToken ,這裏爲了演示,沒有在官網顯示建立倉庫。由於我是自己是C#出身,這裏利用vs2019來作演示。

打開vs2019新建一個netcore的項目,我這裏建立一個控制檯程序,程序很簡單

static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            while (true)
            {
                Console.WriteLine("Hello World22222!");
                System.Threading.Thread.Sleep(1000);
            }
        }

而後在項目右鍵 添加=》docker支持,會根據當前項目自動生成dockerfile文件。就算沒有ide的支持,也能夠本身手擼一個dockerfile文件,而後利用docker的命令打包,固然語法和如下是同樣的

FROM mcr.microsoft.com/dotnet/core/runtime:3.0-buster-slim AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/core/sdk:3.0-buster AS build
WORKDIR /src
COPY ["netcoretest/netcoretest.csproj", "netcoretest/"]
RUN dotnet restore "netcoretest/netcoretest.csproj"
COPY . .
WORKDIR "/src/netcoretest"
RUN dotnet build "netcoretest.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "netcoretest.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "netcoretest.dll"]

而後項目右鍵 發佈=》容器註冊表=》docker hub 建立發佈選項,會彈出輸入docker hub帳號密碼彈窗,而後輸入帳號密碼,最後點擊發布按鈕,本地必需要安裝docker哦,我這裏爲了演示,在windows上安裝的docker for windows。和以上相似,就算沒有ide的支持,咱們同樣能夠利用docker命令把鏡像推送到指定倉庫。這裏只是演示流程,因此不要糾結。

image

若是環境沒有錯誤的話,發佈過程當中會彈出黑窗口
image

發佈完成,在docker hub中刷新頁面回發現新倉庫已經被建立好了
image

接下來就是在裝有docker的機器上,拉取進行並運行容器了,這裏以我本地windows 和測試服務器linux爲例,分別演示,可是其實在兩個操做系統中命令是如出一轍的

docker run chenhongyu/netcoretest

不管是在windows上仍是在linux上,容器成功被拉取運行
image

image

雖然只是一個小小的測試程序,確把業務程序以外的最大雲原生流程擼了一遍,但願對你們有幫助。你們能夠拉取如下鏡像是否能夠運行呢?

更多精彩文章

image

相關文章
相關標籤/搜索