儘管之前久聞docker的大名了,但是天資愚鈍,對其到底是個啥東西一直摸不清,最近花了一段時間整理了一下,算是整理出一點頭緒來。
官網的介紹是這樣的:
那麼應用容器長什麼樣子呢,乙個做好的應用容器長得就好像乙個裝好了一組特定應用的虛擬機器一樣。比如我現在想用mysql那我就找個裝好mysql的容器,執行起來,那麼我就可以使用 mysql了。
那麼我直接裝個 mysql不就好了,何必還需要這個容器這麼詭異的概念?話是這麼說,可是你要真裝mysql的話可能要再裝一堆依賴庫,根據你的作業系統平台和版本進行設定,有時候還要從源**編譯報出一堆莫名其妙的錯誤,可不是這麼好裝。而且萬一你機器掛了,所有的東西都要重新來,可能還要把配置在重新弄一遍。但是有了容器,你就相當於有了乙個可以執行起來的虛擬機器,只要你能執行容器,mysql的配置就全省了。而且一旦你想換台機器,直接把這個容器端起來,再放到另乙個機器就好了。硬體,作業系統,執行環境什麼的都不需要考慮了。
在公司中的乙個很大的用途就是可以保證線下的開發環境、測試環境和線上的生產環境一致。當年在 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 是 用 go 語言編寫的,源**託管在 github 而且居然只有 1w 行就完成了這些功能。如果想嘗試一下的話可以看
官方介紹了,應該上手會容易一些了。博主也是新手,如有錯誤歡迎拍磚指正。
5分鐘了解docker
一 概念 開源的應用容器引擎,打包開發者的應用及依賴包在乙個可移植的容器中,相當於沙箱。docker允許開發人員在單個作業系統上隔離和執行多個應用程式,而不是為伺服器上的每個應用程式專用乙個虛擬機器。這是通過將應用程式隔離在單獨的容器中來實現的,這些應用程式雖然被容器分隔開,但是卻可以共享作業系統和...
5分鐘快速部署Docker實戰
1.安裝docker.2.安裝tomcat.3.安裝nginx.名詞解釋 掛載 相當於本地的目錄做個快捷方式到虛擬機器的目錄裡 文章結尾提供以下內容的模板文件.一 安裝docker 1.按提示安裝,下一步下一步.輸入 docker run hello world 有訊息表示安裝成功.1.docker...
15分鐘弄懂 const 和 define
1.什麼是const const是c c 中的乙個關鍵字 修飾符 const一般用來定義乙個常量,既然叫做常量,即以後再也不能修改其值.const定義常量 2.什麼是 define?而define,巨集定義,則是一條預編譯指令,編譯器在編譯階段會將所有使用到巨集的地方簡單地進行替換.如下圖所示 巨集...