標籤:

docker的幾點疑問?

以我的理解,docker的運行是在主機的內核的基礎上的,container相當於沙箱進行資源的隔離與許可權的控制。那麼如果container的運行需要的內核特性host的內核不能滿足,那是否container中的依賴此特性的應用程序就無法運行。

還有一個疑惑就是鏡像下載的時候分很多層,dependent,fs層,這些層是什麼關係,是否與host與container有依賴關係?這個鏡像與傳統的vm型的鏡像有什麼區別,製作後的鏡像挺小的?

最後一個疑問就是,docker相當於一個paas。以前用過的Eucalyptus這種傳統的雲平台,要求每個vm實例對cpu內存是硬體隔離獨佔的,docker是否是隔離的訪問資源(對lxc不太了解)。傳統雲平台管理是很多主機上的很多vm,docker能否管理多台主機上多個container,有沒有編程介面?


謝邀,

---------------------------------

1. 每個container中運行的進程,是的的確確運行在host上的(用ps 可以查看的到), 這樣的話,無論你的鏡像是基於ubuntu, centos, 還是debian的,都是運行在主機內核上的(container中沒有自己的內核)。也就是說如果主機內核不滿足需求,container中的依賴此特性的應用程序就無法運行

---------------------------------

2.Image的分層,可以想像成photoshop中不同的layer。每一層中包含特定的文件,當container運行時,這些疊加在一起的層就構成了container的運行環境(包括相應的文件,運行庫等,不包括內核)。Image通過依賴的關係,來確定整個鏡像內到底包含那些文件。之後的版本的docker,會推出squash的功能,把不同的層壓縮成為一個,和Photoshop中合併層的感覺差不多。

Docker中的鏡像就是一堆文件的集合,並不是像VM那樣的是一個操作系統。鏡像可以簡單到只有一個程序文件。如果你寫一個helloworld 靜態編譯後放到一個空的Image中(可以用FROM scratch作為基礎鏡像),那麼整個image的大小,就是你編譯後的二進位文件的大小。 如果你不是靜態編譯的話,就要把相應的鏈接庫放到鏡像中相應的位置,才能使得程序正確運行,否則會提示找不到文件。官方提供的ubuntu等基礎鏡像,就是把依賴的文件放到正確的地方,從而使得絕大部分程序可以正常運行。和VM的鏡像是完全不同的概念

---------------------------------

3. docker能夠限制container使用的主機資源。lxc container是docker最早版本的運行環境,現在他們默認採用libcontainer,今後估計會逐步減少lxc container的支持。如果要限制cpu和memory,在docker run 中直接使用-c -m參數即可。個人認為,這只是限制了container的資源,並不能夠保證container能夠確實分到足夠的資源。當然,如果你的所有程序都是運行在container中,並且都限制好資源的話,那麼應該還是可以滿足你的需求的。

每台host中,可以同時運行上百個container,互不干擾。每個container只是一個host中的進程,很輕量化。VM就不能做到同時運行這麼多。

編程介面,docker提供了Remote API和python library(docker-py), 同時還有github上還有很多第三方的庫,支持不同的語言


1. 以我的理解,docker的運行是在主機的內核的基礎上的,container相當於沙箱進行資源的隔離與許可權的控制。那麼如果container的運行需要的內核特性host的內核不能滿足,那是否container中的依賴此特性的應用程序就無法運行。

------------------------------------------

首先要從根本上理解什麼是Docker容器,Docker所使用的技術都不是新技術,主要就是把以前需要複雜操作的命令結合了起來。而從形態上來看,容器就是 一個進程,只不過是受限制的進程,CGroup限制進程的資源使用,Namespace將資源限定在一個空間,相互間不能訪問,分層文件系統就是容器的具體文件。因此,容器如果不加處理,是肯定可以操作內核的,而且是各容器間共用內核,所以這個也是某些人質疑 Docker安全性的原因。容器是肯定,也必須能夠訪問內核的,而方式就是我們所說的系統調用。任何linux進程操作,基本都會發起系統調用,只是你的調用會受到許可權的控制。默認情況,容器是以非privilege方式運行的,因此很多設備和操作是不允許的。在1.10之後,Docker已經增強了安全性,seccomp可以限定什麼系統調用不能調用,user namespce可以做用戶許可權映射。目前我們的平台http://ghostcloud.cn已經率先支持1.10,同時只要接入到系統的主機,都會同步獲得自動版本更新。

2. 還有一個疑惑就是鏡像下載的時候分很多層,dependent,fs層,這些層是什麼關係,是否與host與container有依賴關係?

------------------------------------------

鏡像是一個只讀的文件系統,在本地會共用,主要是通過簽名來實現的,類似於存儲裡面的De-dup技術。每運行一個容器,會在鏡像上加一個可寫層,但這一層並不會改變鏡像本身,這也就是為什麼,有時候你如果用同一個鏡像,啟動多個容器,裡面的內容是不會變的。如果你要將可寫層持久化,就要通過 commit命令來把這個可寫層寫到磁碟上,即生成新的鏡像。

這個鏡像與傳統的vm型的鏡像有什麼區別,製作後的鏡像挺小的?

------------------------------------------

從原理上,沒多大區別,VM的快照也是分層的。但是由於Docker鏡像沒有操作系統,通常比較小。目前我們常用的ubuntu, debian, centos基礎鏡像,一般都在100-200M之間。你如果要製作較小的鏡像可以選用scratch, alpine等作為初始鏡像。

最後一個疑問就是,docker相當於一個paas。以前用過的Eucalyptus這種傳統的雲平台,要求每個vm實例對cpu內存是硬體隔離獨佔的,docker是否是隔離的訪問資源(對lxc不太了解)。傳統雲平台管理是很多主機上的很多vm,docker能否管理多台主機上多個container,有沒有編程介面?

------------------------------------------

Docker並不是一個PaaS,至少Docker engine不是。LXC也只是內核功能的封裝,關鍵還是第一個問題裡面提的幾項內核技術。我們通常所說的docker一般指docker-engine,不具備多主機掛你,不過他們收購的tutum,也即docker cloud可以管理。國內的話,http://ghostcloud.cn是以tutum為原型,是一個PaaS/CaaS管理平台。Docker自身也帶了Docker Swarm,但是目前仍然存在一些問題,還是一個非常年輕的開源項目。跟所有開源項目一樣,開源就是 一個坑,就看是你來填,還是專業公司來填,還有就是什麼時候填滿。


當然可以管理多台主機上的多個Container,Docker的一個非常重要的應用場景就是大規模分散式集群。推薦您可以看一下DaoCloud(http://daocloud.io)的官方博客,貌似他們還做企業級的解決方案。同時,歡迎您加入Docker用戶技術交流群:301226128。


看到這個問題,我放幾個鏈接就差不多了

深入淺出Docker(一):Docker核心技術預覽

深入淺出Docker(二):Docker命令行探秘

深入淺出Docker(三):Docker開源之路

深入淺出Docker(四):Docker的集成測試部署之道

Docker —— 用於統一開發和部署的輕量級 Linux 容器


樓主可以參考 Docker Tutorial 裡面有諸多docker的優秀譯文


深入淺出Docker(五):基於Fig搭建開發環境


URL:http://www.docman.org/

DocMan 一款國產的Docker雲開源平台

Github: lauixData/DocMan

特色

  • 圖表統計
  • 響應式
  • 資產管理
  • 集群管理

功能

  • 主機管理
  • 應用管理
  • 鏡像倉庫
  • 監控報警
  • 操作日記
  • 雲端意見反饋

架構

python2.7 + Flask + Mysql

E-mail: lauixData@gmail.com


推薦閱讀:

什麼是docker鏡像?
docker怎麼修改拉取源從指定的國內倉庫拉取鏡像?
如何基於Docker進行開發?
DaoCloud和雲雀到底誰家的技術比較強一些?VMware和微軟系的比較?
將JVM運行於DOCKER上,有什麼意義嗎?或者,什麼場景下,需要把JVM運行於DOCKER上?

TAG:Docker |