程序员修神之路--打通Docker镜像发布容器运行流程
菜菜哥,我看了一下docker相關的內容,但是還是有點迷糊
還有哪不明白呢?
如果我想用docker實現所謂的云原生,我的項目該怎么發布呢?
這還是要詳細介紹一下docker了
Docker 是一個開源的應用容器引擎,基于 Go 語言 并遵從 Apache2.0 協議開源。Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實現虛擬化。
容器是完全使用沙箱機制,相互之間不會有任何接口(類似 iPhone 的 app),更重要的是容器性能開銷極低。Docker 從 17.03 版本之后分為 CE(Community Edition: 社區版) 和 EE(Enterprise Edition: 企業版),我們用社區版就可以了。
正如以上所說,Docker誕生的意義不僅僅實現了類似虛擬機的隔離性,最主要的是它可以把應用程序以及應用程序的運行環境整個打包在一起。注意:是整個環境哦,不僅僅是一些依賴庫。這個劃時代的進步,直接把docker鏡像和宿主分離開來,使得docker鏡像只要公布出來,就能使任何人在任何地方任何時間都可以隨意運行,換句話說,docker鏡像可以被分發到任何運行docker的服務器上。
說重點,架構呢?
看你心急的和猴一樣....
Docker 架構
在docker的架構中,主要有三個主要概念:
鏡像
Docker 鏡像可以看作是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。鏡像不包含任何動態數據,其內容在構建之后也不會被改變。
docker鏡像由多層組成,不同的鏡像都能使用相同的父鏡像作為他們的基礎鏡像,這些相同的基礎鏡像在docker的角度來看就是完全相同的層。在docker鏡像的傳輸過程中,當某些相同的層已經存在的時候,就完全不需要重新傳輸了,這大大提高了鏡像在網絡上的傳輸效率。
分層的設計不僅使鏡像分發更高效,也有利于減少鏡像的存儲空間。每一層僅僅被存儲一次,就算基于相同基礎層的鏡像被創建兩個容器的時候,這兩個容器也是互相隔離的,雖然他們能讀到相同的文件,但是卻看不到對方文件的修改。一個容器被創建的時候,會創建一個新的可寫層,容器中的修改會反應到這個新的可寫層中。就算了容器修改了底層的文件,此文件的修改內容會copy到頂層,底層依然不會發生變化。
容器
鏡像(Image)和容器(Container)的關系,就像是面向對象程序設計中的類和實例一樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器可以被創建、啟動、停止、刪除、暫停等。docker的容器通常是一個linux容器,它是運行在宿主機上的一個進程,但是和其他宿主進程是隔離的,并且所用的資源是受限的(只能訪問特定的資源,比如網絡接口,文件系統)
鏡像倉庫
鏡像倉庫和它的字面意思一致,是很多鏡像的集合,它的作用就是把鏡像共享給每個人,當然這里順便提一下,鏡像倉庫也可以有私人倉庫。當你的應用程序被打包之后,如果想在另外一個機器上運行,你就可以把你的應用鏡像上傳到鏡像倉庫,然后開放這個倉庫,這樣網絡上的任何機器都能夠下載你的鏡像,然后運行。
通常,一個倉庫會包含同一個軟件不同版本的鏡像,而標簽就常用于對應該軟件的各個版本 。我們可以通過<倉庫名>:<標簽>的格式來指定具體是這個軟件哪個版本的鏡像。如果不給出標簽,將以 latest 作為默認標簽.。
倉庫又可以分為兩種形式:
public(公有倉庫)
private(私有倉庫)
Docker Registry 公有倉庫是開放給用戶使用、允許用戶管理鏡像的 Registry 服務。一般這類公開服務允許用戶免費上傳、下載公開的鏡像,并可能提供收費服務供用戶管理私有鏡像。
除了使用公開服務外,用戶還可以在本地搭建私有 Docker Registry 。Docker 官方提供了 Docker Registry鏡像,可以直接使用做為私有 Registry 服務。當用戶創建了自己的鏡像之后就可以使用 push 命令將它上傳到公有或者私有倉庫,這樣下次在另外一臺機器上使用這個鏡像時候,只需要從倉庫上 pull 下來就可以了。
構建分發運行鏡像
開發人員首先構建一個鏡像,然后把鏡像推到鏡像倉庫中。因此,任何可以訪問鏡像倉庫的人都可以使用該鏡像。然后,他們可以將鏡像拉取到任何運行著Docker的機器上并運行鏡像。Docker會基于鏡像創建一個獨立的容器,并運行二進制可執行文件指定其作為鏡像的一部分。
docker的缺陷
就像所有的技術解決方案,docker也不是完美的。docker的缺陷在于運行的內核,由于它直接運行在宿主機的內核之上,所以如果docker容器的運行內核版本和宿主機的內核不匹配就會出現問題。追根到底,還是硬件架構設計上的差異,不僅僅是docker容器,幾乎所有的軟件都會有內核架構不同而不能運行的問題。除此之外,由于docker是基于linux的容器技術,所以在windows下運行并不令人滿意,雖然這些年docker在windows上也進步了很多。
來一個具體發布流程的例子唄?
可以呀,那我就以netcore為例吧
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?baseWORKDIR?/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命令把鏡像推送到指定倉庫。這里只是演示流程,所以不要糾結。
如果環境沒有錯誤的話,發布過程中會彈出黑窗口
發布完成,在docker hub中刷新頁面會發現新倉庫已經被創建好了
接下來就是在裝有docker的機器上,拉取進行并運行容器了,這里以我本地windows 和測試服務器linux為例,分別演示,但是其實在兩個操作系統中命令是一模一樣的
docker?run?chenhongyu/netcoretest無論是在windows上還是在linux上,容器成功被拉取運行
雖然只是一個小小的測試程序,確把業務程序之外的最大云原生流程擼了一遍,希望對大家有幫助。大家可以拉取以下鏡像是否可以運行呢?
END
●程序員修神之路--容器技術為什么會這么流行(記得去抽獎)
●程序員修神之路--kubernetes是微服務發展的必然產物
●程序員修神之路--設計一套RPC框架并非易事
●程序員過關斬將--要想獲取我的用戶信息,就得按照規矩來
●程序員過關斬將--更加優雅的Token認證方式JWT
●程序員過關斬將--cookie和session的關系其實很簡單
●程序員修神之路--用NOSql給高并發系統加速
●程序員修神之路--高并發系統設計負載均衡架構
●程序員修神之路--做好分庫分表其實很難之一(繼續送書)
●程序員修神之路--做好分庫分表其實很難之二(送書繼續)
●程序員過關斬將--你為什么還在用存儲過程?
●程序員過關斬將--小小的分頁引發的加班血案
●程序員修神之路--問世間異步為何物?
●程序員修神之路--提高網站的吞吐量????
關注后回復:“大禮包”和“福利”,領取驚喜
長按識別二維碼關注
總結
以上是生活随笔為你收集整理的程序员修神之路--打通Docker镜像发布容器运行流程的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: .Net Core3.1下使用Swagg
 - 下一篇: 用.NET解索尼相机ARW格式照片