docker的思想來自於貨櫃,貨櫃解決了什麼問題?在一艘大船上,可以把貨物規整的擺放起來。並且各種各樣的貨物被貨櫃標準化了,貨櫃和貨櫃之間不會互相影響。那麼我就不需要專門運送水果的船和專門運送化學品的船了。只要這些貨物在貨櫃裡封裝的好好的,那我就可以用一艘大船把他們都運走。
設想一下下面的場景:
1.不同的應用程式可能會有不同的應用環境,比如.net開發的**和php開發的**依賴的軟體就不一樣,如果把他們依賴的軟體都安裝在乙個伺服器上就要除錯很久,而且很麻煩,還會造成一些衝突。比如iis和apache訪問埠衝突。這個時候你就要隔離.net開發的**和php開發的**。常規來講,我們可以在伺服器上建立不同的虛擬機器在不同的虛擬機器上放置不同的應用,但是虛擬機器開銷比較高。docker可以實現虛擬機器隔離應用環境的功能,並且開銷比虛擬機器小,小就意味著省錢了。
2.你開發軟體的時候用的是ubuntu,但是運維管理的都是centos,運維在把你的軟體從開發環境轉移到生產環境的時候就會遇到一些ubuntu轉centos的問題,比如:有個特殊版本的資料庫,只有ubuntu支援,centos不支援,在轉移的過程當中運維就得想辦法解決這樣的問題。這時候要是有docker你就可以把開發環境直接封裝轉移給運維,運維直接部署你給他的docker就可以了。而且部署速度快。
3.在伺服器負載方面,如果你單獨開乙個虛擬機器,那麼虛擬機會占用空閒記憶體的,docker部署的話,這些記憶體就會利用起來。
總之docker就是貨櫃原理。
在公司中的乙個很大的用途就是可以保證線下的開發環境、測試環境和線上的生產環境一致。當年在 baidu 經常碰到這樣的事情,開發把東西做好了給測試去測,一般會給一坨**和乙個介紹上線步驟的上線單。結果**在測試機跑不起來,開發就跑來跑去看問題,一會兒啊這個配置檔案忘了提交了,一會兒啊這個上線命令寫錯了。找到了乙個 bug 提上去,開發一看,啊我怎麼又忘了把這個命令寫在上線單上了。類似的事情在上線的時候還會發生,變成啊你這個軟體的版本和我機器上的不一樣……在 amazon 的時候,由於乙個開發直接擔任上述三個職位,而且有一套自動化部署的機制所以問題會少一點,但是上線的時候大家還是膽戰心驚。
若果利用容器的話,那麼開發直接在容器裡開發,提測的時候把整個容器給測試,測好了把改動改在容器裡再上線就好了。通過容器,整個開發、測試和生產環境可以保持高度的一致。
此外容器也和vm一樣具有著一定的隔離性,各個容器之間的資料和記憶體空間相互隔離,可以保證一定的安全性。
那麼既然容器和 vm 這麼類似為啥不直接用 vm 還要整出個容器這麼個概念來呢?docker 容器相對於 vm 有以下幾個優點:
vm 的 hypervisor 需要實現對硬體的虛擬化,並且還要搭載自己的作業系統,自然在啟動速度和資源利用率以及效能上有比較大的開銷。而 docker 架構圖明顯要簡單的多:
docker 幾乎就沒有什麼虛擬化的東西,並且直接復用了 host 主機的 os,在 docker engine 層面實現了排程和隔離重量一下子就降低了好幾個檔次。 docker 的容器利用了 lxc,管理利用了 namespaces 來做許可權的控制和隔離, cgroups 來進行資源的配置,並且還通過 aufs 來進一步提高檔案系統的資源利用率。
其中的 aufs 是個很有意思的東西,是 unionfs 的一種。他的思想和 git 有些類似,可以把對檔案系統的改動當成一次 commit 一層層的疊加。這樣的話多個容器之間就可以共享他們的檔案系統層次,每個容器下面都是共享的檔案系統層次,上面再是各自對檔案系統改動的層次,這樣的話極大的節省了對儲存的需求,並且也能加速容器的啟動。
Docker基本知識
docker docker 是乙個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到乙個可移植的容器中,然後發布到任何流行的linux機器上,也可以實現虛擬化,容器是完全使用沙箱機制,相互之間不會有任何介面。簡言之,就是可以在linux上映象使用的這麼乙個容器。docker可以在什麼情況下使...
Docker基本知識
docker在ubuntu上的安裝 配置docker的apt源 1.對系統源進行更新 sudo apt get update2.安裝包,允許apt命令https訪問docker源 3.新增docker官方的gpg 4.將docker的源新增到 etc apt sources.list sudo ad...
springIOC容器的部分基本知識
spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上層應用提供準備就緒的執行環境。其中 bean 快取池為 hashmap 實現 依賴的描述資訊放在bea...