容器golang,容器苗

本文目錄一覽:

golang web有必要容器化嗎

有必要。

對於運行我們應用程序的主機,不管是筆記本電腦還是web服務器,我們唯一需要做的就是運行一個docker容器平台。從以後,你就不需要擔心你使用的是MacOS,Ubuntu,Arch還是其他。你只需定義一次應用,即可隨時隨地運行。

docker容器與虛擬機有什麼區別?

我們單位最近在推docker,已經在開發測試環境使用(稍顯落後),下面我就談談自己的Docker的理解,以及Docker和虛擬機的區別。

虛擬機

先說說什麼是虛擬機:在一台物理機器上,利用虛擬化技術,虛擬出來多個操作系統,每個操作系統之間是隔離的。

說起來有些繞,那麼我們看看虛擬機的架構圖,就容易理解了。例如我們要在一台物理機器運行三個Java項目,彼此之間隔離。

從下往上看, 解釋起來其實很簡單:

最下面的一層就是物理機,可以是服務器,設置是一台個人電腦;

Docker

再說說什麼是Docker,找了一句官方的解釋:Docker是開源的應用容器引擎。是不是又一頭霧水?我們還是先看看Docker的架構圖。

依然從下往上看:

Docker和虛擬機的區別

我將持續分享Java開發、架構設計、程序員職業發展等方面的見解,希望能得到你的關注。

謝謝了!docker容器域虛擬機有什麼區別呢?

docker容器: Docker 容器是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發佈到任何流行的Linux機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口(類似 iPhone 的 app)。幾乎沒有性能開銷,可以很容易地在機器和數據中心中運行。最重要的是,他們不依賴於任何語言、框架包括系統。

虛擬機: 虛擬機(Virtual Machine)指通過軟件模擬的具有完整硬件系統功能的、運行在一個完全隔離環境中的完整計算機系統。虛擬系統通過生成現有操作系統的全新虛擬鏡像,它具有真實windows系統完全一樣的功能,進入虛擬系統後,所有操作都是在這個全新的獨立的虛擬系統裏面進行,可以獨立安裝運行軟件,保存數據,擁有自己的獨立桌面,不會對真正的系統產生任何影響 ,而且具有能夠在現有系統與虛擬鏡像之間靈活切換的一類操作系統。虛擬系統和傳統的虛擬機(Parallels Desktop ,Vmware,VirtualBox,Virtual pc)不同在於:虛擬系統不會降低電腦的性能,啟動虛擬系統不需要像啟動windows系統那樣耗費時間,運行程序更加方便快捷;虛擬系統只能模擬和現有操作系統相同的環境,而虛擬機則可以模擬出其他種類的操作系統;而且虛擬機需要模擬底層的硬件指令,所以在應用程序運行速度上比虛擬系統慢得多。 對比虛擬機與DockerDocker守護進程可以直接與主操作系統進行通信,為各個Docker容器分配資源;它還可以將容器與主操作系統隔離,並將各個容器互相隔離。虛擬機啟動需要數分鐘,而Docker容器可以在數毫秒內啟動。由於沒有臃腫的從操作系統,Docker可以節省大量的磁盤空間以及其他系統資源。說了這麼多Docker的優勢,大家也沒有必要完全否定虛擬機技術,因為兩者有不同的使用場景。虛擬機更擅長於徹底隔離整個運行環境。例如,雲服務提供商通常採用虛擬機技術隔離不同的用戶。而Docker通常用於隔離不同的應用,例如前端,後端以及數據庫。

docker解決的主要問題

有過後台開發經驗的同學,一定遇到過下面這些問題:

那麼,有了docker,這些問題都將不復存在。

什麼是docker

Docker是一個虛擬環境容器,可以將你的可執行文件、配置文件及一切其他你需要的文件一併打包到這個容器中,並發佈和應用到任意平台。比如,你在本地用Python開發了一個網站後台,開發測試完成後,就可以將Python3及其依賴包、Flask及其各種插件、Mysql、Nginx等打包到一個容器中,然後部署到任意你想部署到的環境。

如果不好理解,我們再拿集裝箱打個比方。

集裝箱解決了什麼問題呢?在一艘大船上,可以把貨物規整的擺放起來。並且各種各樣的貨物被集裝箱標準化了,集裝箱和集裝箱之間不會互相影響。那麼我就不需要專門運送水果的船和專門運送化學品的船了。只要這些貨物在集裝箱里封裝的好好的,那我就可以用一艘大船把他們都運走。

docker也是類似的理念。我們可以在一台機器上跑多個互相毫無關聯的docker容器,每一個容器就相當於一個集裝箱。

docker里的幾個基本概念 與傳統虛擬化的區別

這裡我們順便講一下傳統虛擬化。

我們看到,傳統虛擬化是站在硬件物理資源的基礎上,虛擬出多個OS,然後在OS的基礎上構建相對獨立的程序運行環境,而Dokcer則是在OS的基礎上進行虛擬,顯然Dokcer輕量得多,因此其資源佔用、性能消耗相比傳統虛擬化都有很大優勢。

在IT行業從業多年,也算從看着時代從物理服務器走向虛擬化雲計算時代,又準備進入Docker時代,作為下一代虛擬化技術,Docker正改變着整個行業開發、測試、部署應用的方式,至於虛擬化技術和docker技術到底有什麼不同,下面來分析一下。

01 什麼是虛擬化?

顧名思義,虛擬化技術是將物理資源以某種技術虛擬成資源池的形式,主要有一虛多和多虛一兩種形式,比如個人電腦安裝Vmware軟件,可以在這個軟件上安裝其他Win系統、MacOS、Linux系統等,實現一台電腦/筆記本承載多個系統的優點,目前蘋果筆記本用戶雙系統解決方案也以虛擬機為主,普通Windows用戶可能需求量不大,而技術人員基本是必備軟件了。

從企業層面來看,多虛一為主要形式,也就是將大量物理服務器集群虛擬化,形成一個資源池,在這個資源上創建各種不同的虛擬機,實現靈活部署。

02 什麼是Docker

其實docker和虛擬技術很像,但又有一些不同點,一方面是兩個技術的層級上,虛擬機一般是底層硬件Hardware支撐,上層是虛擬管理系統Hypervisor層,在上層開啟不同的VM業務,如果需要將這些業務進行隔離,需要每個VM啟動客戶機操作系統,非常消耗資源。

Docker完全不同,底層有硬件和Host OS系統支撐,比如Windows/MacOS/Linux,中間拋去了臃腫的系統,而是以Docker守護進程代替,上層建立不同的容器,不同的應用鏡像打包在不同的容器中,他們互相隔離。

03 虛擬化與docker的區別

docker設計小巧,部署遷移快速,運行高效,應用之間相互獨立,管理人員可以看到所有容器的內容,虛擬化技術比較臃腫,不論什麼應用都需要先創建新的系統,並且並非按照應用隔離,而是按照系統隔離,管理員無法看到系統內部信息。

舉個例子,Docker就是手機中的各種APP,只需要一個系統就可以下載自己所需的應用,但是虛擬化技術相當於你的蘋果手機安裝一個龐大軟件,這個軟件上安裝安卓系統、魅族系統等,每個系統上還要安裝各類應用,比較麻煩。

但兩者沒有絕對的好壞,主要還是看應用場景,根據不同的需求選擇不同的解決方案即可。

Docker與虛擬機介紹

虛擬機: 傳統的虛擬機需要模擬整台機器包括硬件,每台虛擬機都需要有自己的操作系統,虛擬機一旦被開啟,預分配給他的資源將全部被佔用,每一個虛擬機包括應用,必要的二進制和庫以及一個完整的用戶操作系統。

容器(Docker): 容器與的宿主機共享硬件資源及操作系統可以實現資源的動態分配。容器包含應用和其所有的依賴包,但是與其他容器共享內核。容器在宿主機操作系統中,在用戶空間以分離的進程運行。

虛擬機和容器都是在硬件和操作系統以上的,虛擬機有Hypervisor層(「翻譯」客戶系統和宿主系統之間的指令),Hypervisor是整個虛擬機的核心所在。他為虛擬機提供了虛擬的運行平台,管理虛擬機的操作系統運行。每個虛擬機都有自己的系統和系統庫以及應用。

容器沒有Hypervisor層,它是內核級的虛擬化,並且每個容器與宿主機共享硬件資源及操作系統,因此Docker容器不存在Hypervisor層帶來性能的損耗,因此可以實現更高的性能和效率。但是虛擬機技術也有其優勢,能為應用提供一個更加隔離的環境,不會因為應用程序的漏洞給宿主機造成任何威脅。

虛擬機是對硬件資源的虛擬,容器技術則是對進程的虛擬,從而可提供更輕量級的虛擬化,實現進程和資源的隔離。從架構來看,Docker比虛擬化少了兩層,取消了hypervisor層和GuestOS層,使用 Docker Engine 進行調度和隔離,所有應用共用主機操作系統,因此在體量上,Docker較虛擬機更輕量級,在性能上優於虛擬化,接近物理機原生性能。

Docker的優勢

持續部署與測試

更高效的利用系統資源

交付物標準化

應用隔離

高性能

最近剛好看了一部分docker的東西

先上圖,vm與docker框架,直觀上來講 vm多了一層guest OS,同時Hypervisor會對硬件資源進行虛擬化,docker直接使用硬件資源 ,所以資源利用率相對docker低也是比較容易理解的

其次,openstack能夠以10台/min的速度創建虛擬機,在docker面前就弱爆了,因為docker是利用宿主機的系統內核,所以可以做到在幾秒鐘之內創建大量容器,它們的 啟動速度是在數量級上的差距 。

最後找了一個IBM測試案例,關於計算能力的,對於kvm為什麼會有這麼大的性能損失,一方面是因為虛擬機增加了一層虛擬硬件層,運行在虛擬機上的應用程序在進行數值計算時是運行在Hypervisor虛擬的CPU上的;另外一方面是由於計算程序本身的特性導致的差異。虛擬機虛擬的cpu架構不同於實際cpu架構,數值計算程序一般針對特定的cpu架構有一定的優化措施,虛擬化使這些措施作廢,甚至起到反效果。比如對於本次實驗的平台,實際的CPU架構是2塊物理CPU,每塊CPU擁有16個核,共32個核,採用的是NUMA架構;而虛擬機則將CPU虛擬化成一塊擁有32個核的CPU。這就導致了計算程序在進行計算時無法根據實際的CPU架構進行優化,大大減低了計算效率。

從計算機軟件層級來看,docker和虛擬機的區別在於虛擬的軟件層級不一樣。虛擬機基於同一個硬件,模擬出不同的操作系統;而docker基於同一個操作系統,模擬出不同的運行時環境。我們依次來看:

1. 先看看計算機的軟件層次,從下到上依次為:操作系統內核、文件系統(運行時環境)、上層APP。

2. 虛擬機運行在同一個硬件上,可以虛擬出不同的操作系統。比如vmware可以在一台pc上既模擬出一個windows系統,同時也可以模擬出一台linux系統。 藉助虛擬機,兩個不同的操作系統可以同時運行在同一個硬件之上。

3. 而docker則運行在同一個操作系統內核上,虛擬出不同的文件系統或者也可以叫做運行時環境。不同的運行時環境,其對應的文件系統也是不同的。比如java的運行時環境就要求文件系統里存在jdk,而golang的運行時環境則需要有go相關的底層庫。在docker上既可以虛擬出一個java的運行時環境,也可以虛擬出go的運行時環境。甚至, 基於docker,你既可以虛擬出一個java-1.6的運行時候環境,也可以虛擬出一個java-1.8的運行時環境,而這兩個運行時環境可以同時運行在同一個操作系統之上 。

很高興為您解答。

Docker悄無聲息的來到我們身邊,正在改變我們的開發、測試、部署應用的方式,那麼,到底Docker和虛擬機VM有什麼區別,我們通過一個圖,再配上簡明扼要的文字就很容易理解兩者之間的區別。

首先要明確:Docker是一個開源的應用容器引擎,而VM是一個完整的操作系統。

1、使用VM運行多個相互隔離的應用

解釋:

可以看到,APP #1、APP #2、APP #3如果要獨立運行,相互隔離,則需要安裝三個操作系統。如果一個虛擬操作系統按1G算,總共需要佔3G的存儲空間,更槽糕的是,光運行這三個操作系統就要耗費很大的內存和CPU。

2、使用Docker運行多個相互隔離的應用

DOCKER DAEMON:Docker守護進程,負責管理Docker容器。

Docker運行在主操作系統之上,APP #1、APP #2、APP #3在Docker中是完全隔離的、相經獨立的容器。跟VM相比,省去了龐大的操作系統,耗費硬件資源較少。

除了以上架構上的差異之外,VM和Docker在啟動時間上也有着很大的差距,VM啟動大概需要2分鐘的時間,而Docker啟動則只需2秒。

隨着互聯網的發展,Docker的應用會越來越廣,Build once,run anywhere,一次構建,到處運行。

docker是虛擬化軟件運行環境。

虛擬機是虛擬化硬件。

層次不同。

虛擬機更消耗資源。但帶來的是一個完整的可以不同於宿主機的操作系統。因為和宿主機操作系統不共享任何東西(包括硬件,內核,動態庫,環境變量等),它的隔離性更好。

docker更輕量級,共享使用宿主機的硬件和內核,資源佔用更少。它在宿主機內核基礎上虛擬化了一個不同於宿主機的軟件運行環境,比如動態庫,環境變量等。可以說,docker和宿主機之間除了內核共享,其它都可以不同。

Docker容器啟動、停止速度快rr Docker容器對資源需求較少rr Docker操作簡單rr Dockerfile自動構建和部署方便

Golang項目部署3,容器部署

容器部署即使用 docker 化部署 golang 應用程序,這是在雲服務時代最流行的部署方式,也是最推薦的部署方式。

跨平台交叉編譯是 golang 的特點之一,可以非常方便地編譯出我們需要的目標服務器平台的版本,而且是靜態編譯,非常容易地解決了運行依賴問題。

使用以下指令可以靜態編譯 Linux 平台 amd64 架構的可執行文件:

生成的 main 便是我們靜態編譯的,可部署於 Linux amd64 上的可執行文件。

我們需要將該可執行文件 main 編譯生成 docker 鏡像,以便於分發及部署。 Golang 的運行環境推薦使用 alpine 基礎系統鏡像,編譯出的容器鏡像約為 20MB 左右。

一個參考的 Dockerfile 文件如下:

其中,我們的基礎鏡像使用了 loads/alpine:3.8 ,中國國內的用戶推薦使用該基礎鏡像,基礎鏡像的 Dockerfile 地址: ,倉庫地址:

隨後使用 ” docker build -t main . ” 指令編譯生成名為 main 的 docker 鏡像。

需要注意的是,在某些項目的架構設計中, 靜態文件 和 配置文件 可能不會隨着鏡像進行編譯發佈,而是分開進行管理和發佈。

例如,使用 MVVM 模式的項目中(例如使用 vue 框架),往往是前後端非常獨立的,因此在鏡像中往往並不會包含 public 目錄。而使用了 配置管理中心 (例如使用 consul / etcd / zookeeper )的項目中,也往往並不需要 config 目錄。

因此對於以上示例的 Dockerfile 的使用,僅作參考,根據實際情況請進行必要的調整。

使用以下指令可直接運行剛才編譯成的鏡像:

容器的分發可以使用 docker 官方的平台: ,國內也可以考慮使用阿里云: 。

在企業級生產環境中, docker 容器往往需要結合 kubernetes 或者 docker swarm 容器編排工具一起使用。

容器編排涉及到的內容比較多,感興趣的同學可以參考以下資料:

golang反射框架Fx

Fx是一個golang版本的依賴注入框架,它使得golang通過可重用、可組合的模塊化來構建golang應用程序變得非常容易,可直接在項目中添加以下內容即可體驗Fx效果。

Fx是通過使用依賴注入的方式替換了全局通過手動方式來連接不同函數調用的複雜度,也不同於其他的依賴注入方式,Fx能夠像普通golang函數去使用,而不需要通過使用struct標籤或內嵌特定類型。這樣使得Fx能夠在很多go的包中很好的使用。

接下來會提供一些Fx的簡單demo,並說明其中的一些定義。

1、一般步驟

大致的使用步驟就如下。下面會給出一些完整的demo

2、簡單demo

將io.reader與具體實現類關聯起來

輸出:

3、使用struct參數

前面的使用方式一旦需要進行注入的類型過多,可以通過struct參數方式來解決

輸出

如果通過Provide提供構造函數是生成相同類型會有什麼問題?換句話也就是相同類型擁有多個值呢?

下面兩種方式就是來解決這樣的問題。

4、使用struct參數+Name標籤

在Fx未使用Name或Group標籤時不允許存在多個相同類型的構造函數,一旦存在會觸發panic。

輸出

上面通過Name標籤即可完成在Fx容器注入相同類型

5、使用struct參數+Group標籤

使用group標籤同樣也能完成上面的功能

輸出

基本上Fx簡單應用在上面的例子也做了簡單講解

1、Annotated(位於annotated.go文件) 主要用於採用annotated的方式,提供Provide注入類型

源碼中Name和Group兩個字段與前面提到的Name標籤和Group標籤是一樣的,只能選其一使用

2、App(位於app.go文件) 提供注入對象具體的容器、LiftCycle、容器的啟動及停止、類型變量及實現類注入和兩者映射等操作

至於Provide和Populate的源碼相對比較簡單易懂在這裡不在描述

具體源碼

3、Extract(位於extract.go文件)

主要用於在application啟動初始化過程通過依賴注入的方式將容器中的變量值來填充給定的struct,其中target必須是指向struct的指針,並且只能填充可導出的字段(golang只能通過反射修改可導出並且可尋址的字段),Extract將被Populate代替。 具體源碼

4、其他

諸如Populate是用來替換Extract的,而LiftCycle和inout.go涉及內容比較多後續會單獨提供專屬文件說明。

在Fx中提供的構造函數都是惰性調用,可以通過invocations在application啟動來完成一些必要的初始化工作:fx.Invoke(function); 通過也可以按需自定義實現LiftCycle的Hook對應的OnStart和OnStop用來完成手動啟動容器和關閉,來滿足一些自己實際的業務需求。

Fx框架源碼解析

主要包括app.go、lifecycle.go、annotated.go、populate.go、inout.go、shutdown.go、extract.go(可以忽略,了解populate.go)以及輔助的internal中的fxlog、fxreflect、lifecycle

golang編寫的項目,使用alpine製作鏡像遇到的一個問題解決

GraphicsMagick,一款高性能的圖片處理工具,由於項目需要,用到它,自然而然用到了關於gm的第三方庫 這個庫按照作者的提示,要安裝GraphicsMagick-devel依賴。

項目寫完了,接下來用alpine做為基礎鏡像,準備製作項目的鏡像。

golang項目,是在ubuntu下編寫的,編譯成二進制文件了,只要把二進制文件放進鏡像里即可,遇到的問題有2個

1 容器跑起來,一直報二進制文件no found

我認認真真的確認了文件,以及它的路徑,確實是存在的,怎麼會報文件找不到呢?!

原來是musl和glibc是兼容的問題,在Dockerfile里要加以下兩步

2 Error loading shared library libGraphicsMagickWand-Q16.so.2: No such file or directory

明明按要求安裝GraphicsMagick-devel依賴,為啥還報這種錯

於是想到了,是不是也要ln做一下軟鏈接呢?於是學着上面的樣子在Dockerfile里補上

再跑,問題依舊,莫非是軟連接的地址寫錯了!回到開發的電腦上用ldd命令查看一下

果然,編譯後的二進制文件依賴路徑是/lib,而不是/lib64

於是,修改Dockerfile里的寫法

問題解決,開心:)

參考資料:

使用 Docker 快速部署 Golang 應用

文章使用到的軟件:

目標

構建Dockerfile

打包Docker鏡像

部署Go程序

我是通過 Portainer 來運行的,可視化的容器鏡像的圖形管理工具

方式二:

原創文章,作者:LTRV,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/148811.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
LTRV的頭像LTRV
上一篇 2024-11-03 15:18
下一篇 2024-11-04 17:48

相關推薦

  • 使用Golang調用Python

    在現代軟件開發中,多種編程語言的協作是相當普遍的。其中一種使用場景是Golang調用Python,這使得在使用Python庫的同時,可以利用Golang的高性能和強大並發能力。這篇…

    編程 2025-04-29
  • 解決docker-compose 容器時間和服務器時間不同步問題

    docker-compose是一種工具,能夠讓您使用YAML文件來定義和運行多個容器。然而,有時候容器的時間與服務器時間不同步,導致一些不必要的錯誤和麻煩。以下是解決方法的詳細介紹…

    編程 2025-04-29
  • 使用Golang創建黑色背景圖片的方法

    本文將從多個方面介紹使用Golang創建黑色背景圖片的方法。 一、安裝必要的代碼庫和工具 在開始創建黑色背景圖片之前,我們需要先安裝必要的代碼庫和工具: go get -u git…

    編程 2025-04-29
  • Python數據容器切片

    本文將從多個方面詳細闡述Python數據容器切片的應用、技巧和方法。 一、切片的基本操作 Python的數據容器包括字符串、列表、元組、字典等,而切片是對這些容器進行子序列提取的常…

    編程 2025-04-27
  • Docker批量刪除容器詳解

    一、前言 Docker是一個開源的應用容器引擎,提供了一種輕量級容器化技術,方便快捷的進行應用打包、發佈、運行。作為廣泛應用的技術之一,Docker是開發、測試、運維的得力助手。但…

    編程 2025-04-25
  • Java Tomcat:Web應用程序的完美容器

    一、淺談Tomcat Tomcat,全稱為Apache Tomcat,是一個免費的、開源的Java Servlet容器,而Java Servlet是一種服務器端的Java擴展程序,…

    編程 2025-04-25
  • 深入理解Docker容器和鏡像的關係

    一、Docker容器和鏡像的基本概念 Docker是一種虛擬化容器技術,它可以劃分出多個隔離環境,讓不同的應用程序在同一台機器上運行,而不會相互影響。Docker主要包含兩個基本概…

    編程 2025-04-24
  • 通過iptables保護docker容器

    一、背景介紹 Docker已經成為現代開發環境中不可或缺的一部分。它使開發人員可以輕鬆地構建、分享和運行軟件應用程序。然而,Docker應用程序的安全性風險也不容忽視。 在許多情況…

    編程 2025-04-24
  • Golang中使用strings.Split函數進行字符串分割的方法

    一、Split函數的基本用法 字符串是編程中常見的數據類型,它們可以在程序中被處理、存儲和傳輸。在Go語言中,字符串也是一個基本的數據類型,而strings包提供了一些操作字符串的…

    編程 2025-04-23
  • 深入下探golang http server

    Go語言已經成為了軟件開發領域的熱門語言,它的高性能、應用廣泛、安全性好,使得它成為了眾多開發者心目中的首選編程語言。在眾多應用場景中,golang http server的應用非…

    編程 2025-04-23

發表回復

登錄後才能評論