1. 程式人生 > >5分鐘弄懂Docker!

5分鐘弄懂Docker!

歡迎加入CSDN Docker技術交流群,群號:303806405 

感謝作者@oilbeater的授權轉載,以下為原文:

儘管之前久聞Docker的大名了,但是天資愚鈍,對其到底是個啥東西一直摸不清,最近花了一段時間整理了一下,算是整理出一點頭緒來。

官網的介紹是這樣的:

Docker is an open platform for developers and sysadmins to build, ship, and run distributed applications....

其實看完這句話還是不明白究竟是啥的,下面就慢慢解釋。不過長話短說的話,把他想象成一個用了一種新穎方式實現的超輕量虛擬機器,在大概效果上也是正確的。當然在實現的原理和應用上還是和VM有巨大差別的,並且專業的叫法是應用容器(Application Container)。

為啥要用容器?

那麼應用容器長什麼樣子呢,一個做好的應用容器長得就好像一個裝好了一組特定應用的虛擬機器一樣。比如我現在想用MySQL那我就找個裝好MySQL的容器,執行起來,那麼我就可以使用 MySQL了。

那麼我直接裝個 MySQL不就好了,何必還需要這個容器這麼詭異的概念?話是這麼說,可是你要真裝MySQL的話可能要再裝一堆依賴庫,根據你的作業系統平臺和版本進行設定,有時候還要從原始碼編譯報出一堆莫名其妙的錯誤,可不是這麼好裝。而且萬一你機器掛了,所有的東西都要重新來,可能還要把配置在重新弄一遍。但是有了容器,你就相當於有了一個可以執行起來的虛擬機器,只要你能執行容器,MySQL的配置就全省了。而且一旦你想換臺機器,直接把這個容器端起來,再放到另一個機器就好了。硬體,作業系統,執行環境什麼的都不需要考慮了。

在公司中的一個很大的用途就是可以保證線下的開發環境、測試環境和線上的生產環境一致。當年在 Baidu 經常碰到這樣的事情,開發把東西做好了給測試去測,一般會給一坨程式碼和一個介紹上線步驟的上線單。結果程式碼在測試機跑不起來,開發就跑來跑去看問題,一會兒啊這個配置檔案忘了提交了,一會兒啊這個上線命令寫錯了。找到了一個 bug 提上去,開發一看,啊我怎麼又忘了把這個命令寫在上線單上了。類似的事情在上線的時候還會發生,變成啊你這個軟體的版本和我機器上的不一樣……在 Amazon 的時候,由於一個開發直接擔任上述三個職位,而且有一套自動化部署的機制所以問題會少一點,但是上線的時候大家還是膽戰心驚。

若果利用容器的話,那麼開發直接在容器裡開發,提測的時候把整個容器給測試,測好了把改動改在容器裡再上線就好了。通過容器,整個開發、測試和生產環境可以保持高度的一致。

此外容器也和VM一樣具有著一定的隔離性,各個容器之間的資料和記憶體空間相互隔離,可以保證一定的安全性。

那為啥不用VM?

那麼既然容器和 VM 這麼類似為啥不直接用 VM 還要整出個容器這麼個概念來呢?Docker 容器相對於 VM 有以下幾個優點:

  • 啟動速度快,容器通常在一秒內可以啟動,而 VM 通常要更久
  • 資源利用率高,一臺普通 PC 可以跑上千個容器,你跑上千個 VM 試試
  • 效能開銷小, VM 通常需要額外的 CPU 和記憶體來完成 OS 的功能,這一部分佔據了額外的資源

為啥相似的功能在效能上會有如此巨大的差距呢,其實這和他們的設計的理念是相關的。 VM 的設計圖如下:

VM 的 Hypervisor 需要實現對硬體的虛擬化,並且還要搭載自己的作業系統,自然在啟動速度和資源利用率以及效能上有比較大的開銷。而 Docker 的設計圖是這樣的: 

 

Docker 幾乎就沒有什麼虛擬化的東西,並且直接複用了 Host 主機的 OS,在 Docker Engine 層面實現了排程和隔離重量一下子就降低了好幾個檔次。 Docker 的容器利用了  LXC,管理利用了 namespaces 來做許可權的控制和隔離,  cgroups 來進行資源的配置,並且還通過  aufs 來進一步提高檔案系統的資源利用率。

其中的 aufs 是個很有意思的東西,是  UnionFS 的一種。他的思想和 git 有些類似,可以把對檔案系統的改動當成一次 commit 一層層的疊加。這樣的話多個容器之間就可以共享他們的檔案系統層次,每個容器下面都是共享的檔案系統層次,上面再是各自對檔案系統改動的層次,這樣的話極大的節省了對儲存的需求,並且也能加速容器的啟動。

下一步

有了前面的這些介紹,應該對 Docker 到底是啥有些瞭解了吧, Docker 是 用 Go 語言編寫的,原始碼託管在 github 而且居然只有 1W 行就完成了這些功能。如果想嘗試一下的話可以看 官方介紹了,應該上手會容易一些了。博主也是新手,如有錯誤歡迎拍磚指正。

如您需要了解更多Docker相關的資訊或是技術文件可訪問Docker技術社群;如您有更多的疑問請在Dcoker技術論壇提出,稍後會有專家進行答疑。

相關推薦

5分鐘Docker

歡迎加入CSDN Docker技術交流群,群號:303806405  感謝作者@oilbeater的授權轉載,以下為原文: 儘管之前久聞Docker的大名了,但是天資愚鈍,對其到底是個啥東西一直摸不清,最近花了一段時間整理了一下,算是整理出一點頭緒來。 官網的介紹是

5分鐘Docker

硬件 hat 相互 amazon -h kernel eight pen https 盡管之前久聞Docker的大名了,但是天資愚鈍,對其到底是個啥東西一直摸不清,最近花了一段時間整理了一下,算是整理出一點頭緒來。 官網的介紹是這樣的: Docker is an open

5分鐘:語音識別技術原理

文/張俊博知乎連結:https://www.zhihu.com/question/2039841

【 全幹貨 】5 分鐘帶你看 Docker

service stop 技術分享 address article 快速 停止 容量 rom 歡迎大家前往騰訊雲社區,獲取更多騰訊海量技術實踐幹貨哦~ 作者丨唐文廣:騰訊工程師,負責無線研發部地圖測試。 導語:Docker,近兩年才流行起來的超輕量級虛擬機,它可以讓你輕松

【 全乾貨 】5 分鐘帶你看 Docker

Docker是啥? 開啟翻譯君輸入Docker 結果顯示碼頭工人,沒錯!碼頭工人搬運的是集裝箱,那麼今天要講的Docker其操作的也是集裝箱,這個集裝箱就靜態而言就是一個應用映象檔案,就動態而言,就是一個容器。蒙了吧?好吧,上圖解釋。 Docker從狹義上來講就是一個程序,

學容器必須 bridge 網絡 - 每天5分鐘玩轉 Docker 容器技術(32)

docker 教程 容器 上一節我們討論了 none 和 host 類型的容器網絡,本節學習應用最廣泛也是默認的 bridge 網絡。Docker 安裝時會創建一個 命名為 docker0 的 linux bridge。如果不指定--network,創建的容器默認都會掛到 docker0 上。當前

一文搞各種 Docker 網絡 - 每天5分鐘玩轉 Docker 容器技術(72)

docker 教程 容器 前面各小節我們先後學習了 Docker Overaly,Macvaln,Flannel,Weave 和 Calico 跨主機網絡方案。目前這個領域是百家爭鳴,而且還有新的方案不斷湧現。本節將從不同維度比較各種網絡方案,大家在選擇的時候可以參考。CloudMan 的建議是:

Deployment YAML - 每天5分鐘玩轉 Docker 容器技術(125)

副本 href spa 部署 執行 scale .cn neu https 既然要用 YAML 配置文件部署應用,現在就很有必要了解一下 Deployment 的配置格式,其他 Controller(比如 DaemonSet)非常類似。還是以 nginx-deploymen

調試 Dockerfile - 每天5分鐘玩轉 Docker 容器技術(15)

top add font tom middle 程序 ria family 是個 包括 Dockerfile 在內的任何腳本和程序都會出錯。有錯並不可怕,但必須有辦法排查,所以本節討論如何 debug Dockerfile。 先回顧一下通過 Dockerfile 構建鏡像

Dockerfile 常用指令 - 每天5分鐘玩轉 Docker 容器技術(16)

依次 官方文檔 構建 bottom str -s 暴露 工作 12px 是時候系統學習 Dockerfile 了。下面列出了 Dockerfile 中最常用的指令,完整列表和說明可參看官方文檔。 FROM指定 base 鏡像。 MAINTAINER設置鏡像的作

RUN vs CMD vs ENTRYPOINT - 每天5分鐘玩轉 Docker 容器技術(17)

docker 教程 容器 RUN、CMD 和 ENTRYPOINT 這三個 Dockerfile 指令看上去很類似很容易混淆。本節將通過實踐詳細討論它們的區別。簡單的說RUN 執行命令並創建新的鏡像層RUN 經常用於安裝軟件包。CMD 設置容器啟動後默認執行的命令及其參數但 CMD 能夠被 doc

使用公共 Registry - 每天5分鐘玩轉 Docker 容器技術(19)

docker 教程 容器 保存和分發鏡像的最直接方法就是使用 Docker Hub。Docker Hub 是 Docker 公司維護的公共 Registry。用戶可以將自己的鏡像保存到 Docker Hub 免費的 repository 中。如果不希望別人訪問自己的鏡像,也可以購買私有 repos

Docker 鏡像小結 - 每天5分鐘玩轉 Docker 容器技術(21)

列表 例如 normal one sys tro docker comm color 本節我們對 Docker 鏡像做個小結。 這一部分我們首先討論了鏡像的分層結構,然後學習了如何構建鏡像,最後實踐使用 Docker Hub 和本地 registry。 下面是鏡像的常用操作

如何運行容器?- 每天5分鐘玩轉 Docker 容器技術(22)

docker 教程 容器 上一章我們學習了如何構建 Docker 鏡像,並通過鏡像運行容器。本章將深入討論容器:學習容器的各種操作,容器各種狀態之間如何轉換,以及實現容器的底層技術。運行容器docker run 是啟動容器的方法。在討論 Dockerfile 時我們已經學習到,可用三種方式指定容器

兩種進入容器的方法 - 每天5分鐘玩轉 Docker 容器技術(23)

工作 技術 啟動進程 gin attach ant while col -c 我們經常需要進到容器裏去做一些工作,比如查看日誌、調試、啟動其他進程等。有兩種方法進入容器:attach 和 exec。 docker attach 通過 docker attach 可以 a

運行容器的最佳實踐 - 每天5分鐘玩轉 Docker 容器技術(24)

oat add vertical poi can size 執行命令 後臺 運行 按用途容器大致可分為兩類:服務類容器和工具類的容器。 1. 服務類容器以 daemon 的形式運行,對外提供服務。比如 web server,數據庫等。通過 -d 以後臺方式啟動這類容器是非常

容器常用操作 - 每天5分鐘玩轉 Docker 容器技術(25)

技術 order position 自動 code lec 資源 add 服務 前面討論了如何運行容器,本節學習容器的其他常用操作。 stop/start/restart 容器 通過 docker stop 可以停止運行的容器。 容器在 docker host 中實際上是

限制容器對內存的使用 - 每天5分鐘玩轉 Docker 容器技術(27)

upload 機制 性能 http tle war pac 啟動 物理內存 一個 docker host 上會運行若幹容器,每個容器都需要 CPU、內存和 IO 資源。對於 KVM,VMware 等虛擬化技術,用戶可以控制分配多少 CPU、內存資源給每個虛擬機。對於容器,D

限制容器對CPU的使用 - 每天5分鐘玩轉 Docker 容器技術(28)

docker 教程 容器 上節學習了如何限制容器對內存的使用,本節我們來看CPU。默認設置下,所有容器可以平等地使用 host CPU 資源並且沒有限制。Docker 可以通過 -c 或 --cpu-shares 設置容器使用 CPU 的權重。如果不指定,默認值為 1024。與內存限額不同,通過

限制容器的 Block IO - 每天5分鐘玩轉 Docker 容器技術(29)

docker 教程 容器 前面學習了如何限制容器對內存和CPU的使用,本節我們來看 Block IO。Block IO 是另一種可以限制容器使用的資源。Block IO 指的是磁盤的讀寫,docker 可通過設置權重、限制 bps 和 iops 的方式控制容器讀寫磁盤的帶寬,下面分別討論。註:目前