什么是Docker?
docker的英文本意是碼頭工人,也就是搬運工,這種搬運工搬運的是集裝箱(Container),集裝箱里面裝的可不是商品貨物,而是任意類型的App,Docker把App(叫Payload)裝在Container內,通過Linux Container技術的包裝將App變成一種標準化的、可移植的、自管理的組件,這種組件可以在你的latop上開發、調試、運行,最終非常方便和一致地運行在production環境下。
Docker的核心底層技術是LXC(Linux Container),Docker在其上面加了薄薄的一層,添加了許多有用的功能。這篇stackoverflow上的問題和答案很好地詮釋了Docker和LXC的區別,能夠讓你更好的了解什么是Docker, 簡單翻譯下就是以下幾點:
Docker提供了一種可移植的配置標準化機制,允許你一致性地在不同的機器上運行同一個Container;而LXC本身可能因為不同機器的不同配置而無法方便地移植運行;
Docker以App為中心,為應用的部署做了很多優化,而LXC的幫助腳本主要是聚焦于如何機器啟動地更快和耗更少的內存;
Docker為App提供了一種自動化構建機制(Dockerfile),包括打包,基礎設施依賴管理和安裝等等;
Docker提供了一種類似git的Container版本化的機制,允許你對你創建過的容器進行版本管理,依靠這種機制,你還可以下載別人創建的Container,甚至像git那樣進行合并;
Docker Container是可重用的,依賴于版本化機制,你很容易重用別人的Container(叫Image),作為基礎版本進行擴展;
Docker Container是可共享的,有點類似github一樣,Docker有自己的INDEX,你可以創建自己的Docker用戶并上傳和下載Docker Image;
Docker提供了很多的工具鏈,形成了一個生態系統;這些工具的目標是自動化、個性化和集成化,包括對PAAS平臺的支持等;
那么Docker有什么用呢?對于運維來說,Docker提供了一種可移植的標準化部署過程,使得規?;⒆詣踊?、異構化的部署成為可能甚至是輕松簡單的事情;而對于開發者來說,Docker提供了一種開發環境的管理方法,包括映像、構建、共享等功能。
Docker vs. VM
從下圖可以看出,VM是一個運行在宿主機之上的完整的操作系統,VM運行自身操作系統會占用較多的CPU、內存、硬盤資源。Docker不同于VM,只包含應用程序以及依賴庫,基于libcontainer運行在宿主機上,并處于一個隔離的環境中,這使得Docker更加輕量高效,啟動容器只需幾秒鐘之內完成。由于Docker輕量、資源占用少,使得Docker可以輕易的應用到構建標準化的應用中。但Docker目前還不夠完善,比如隔離效果不如VM,共享宿主機操作系統的一些基礎庫等;網絡配置功能相對簡單,主要以橋接方式為主;查看日志也不夠方便靈活。
另外,IBM發表了一篇關于虛擬機和Linux container性能對比的論文,論文中實際測試了虛擬機和Linux container在CPU、內存、存儲IO以及網絡的負載情況,結果顯示Docker容器本身幾乎沒有什么開銷,但是使用AUFS會一定的性能損耗,不如使用Docker Volume,Docker的NAT在較高網絡數據傳輸中會引入較大的工作負載,帶來額外的開銷。不過container的性能與native相差不多,各方面的性能都一般等于或者優于虛擬機。Container和虛擬機在IO密集的應用中都需要調整優化以更好的支持IO操作,兩者在IO密集型的應用中都應該謹慎使用。
Docker組件
Docker是CS架構,主要由下面三部分組成:
Docker daemon: 運行在宿主機上,Docker守護進程,用戶通過Docker client(Docker命令)與Docker daemon交互
Docker client: Docker 命令行工具,是用戶使用Docker的主要方式,Docker client與Docker daemon通信并將結果返回給用戶,Docker client也可以通過socket或者RESTful api訪問遠程的Docker daemon
Docker hub/registry: 共享和管理Docker鏡像,用戶可以上傳或者下載上面的鏡像,官方地址為https://registry.hub.docker.com/,也可以搭建自己私有的Docker registry。
了解了Docker的組成,再來了解一下Docker的兩個主要概念:
Docker image:鏡像是只讀的,鏡像中包含有需要運行的文件。鏡像用來創建container,一個鏡像可以運行多個container;鏡像可以通過Dockerfile創建,也可以從Docker hub/registry上下載。
Docker container:容器是Docker的運行組件,啟動一個鏡像就是一個容器,容器是一個隔離環境,多個容器之間不會相互影響,保證容器中的程序運行在一個相對安全的環境中。
Docker網絡
Docker的網絡功能相對簡單,沒有過多復雜的配置,Docker默認使用birdge橋接方式與容器通信,啟動Docker后,宿主機上會產生docker0這樣一個虛擬網絡接口, docker0不是一個普通的網絡接口, 它是一個虛擬的以太網橋,可以為綁定到docker0上面的網絡接口自動轉發數據包,這樣可以使容器與宿主機之間相互通信。每次Docker創建一個容器,會產生一對虛擬接口,在宿主機上執行ifconfig,會發現多了一個類似veth****這樣的網絡接口,它會綁定到docker0上,由于所有容器都綁定到docker0上,容器之間也就可以通信。
在宿主機上執行ifconfig,會看到docker0這個網絡接口, 啟動一個container,再次執行ifconfig, 會有一個類似veth****的interface,每個container的缺省路由是宿主機上docker0的ip,在container中執行netstat -r可以看到如下圖所示內容:
容器中的默認網關跟docker0的地址是一樣的:
當容器退出之后,veth*虛擬接口也會被銷毀。
除bridge方式,Docker還支持host、container、none三種網絡通信方式,使用其它通信方式,只要在Docker啟動時,指定--net參數即可,比如:
新聞熱點
疑難解答