介紹docker

       文/李國柱  git

       一直有人說docker是劃時代的技術,但看資料介紹,要不是操做方法,要不就是Web 2.0,DevOps,去中心化,雲裏霧裏,不知所云。而不使用的人會以爲「就是個輕量化的虛擬機」,這個技術的重要性就被輕飄飄地帶過去了。web

 

       本文試圖在必定程度上消除這個gap,介紹一下docker的功能,說明爲何docker是「劃時代的」。筆者對docker的理解還至關初級,但願更多有經驗的維護者不苟指正。docker

 

Linux服務器由一組用戶態應用程序和一個操做系統內核組成,像下面這樣:數據庫

 


       業務軟件面對一個複雜的應用環境。好比一個Web服務器,客戶端連上來了,運行一個服務,這個服務以什麼權限進行?這個就涉及這個文件系統環境中的一系列配置了,好比鑑權系統的配置,爲不一樣的服務器選擇對應的鑑權系統,這就涉及一組配置文件。而後這個服務用哪幾個IP地址?路由怎麼配置?這又是一組的配置文件。用哪一個數據庫?這又是一組配置。好吧,好比如今我裝好了一臺Ubuntu Linux系統,我配好了一個Web服務器,交給同事維護,這個同事維護一段時間後,被人DDOS攻擊了,他在tcpd裏面配置了一個IP過濾,我怎麼知道?一個Linux的文件系統裏面有幾十萬個文件啊,他在這裏面藏了這麼一個配置,你說我怎麼找?
ubuntu

       靠文檔化嗎?文檔和實現的一致性——你告訴我何時被解決過?文檔和實現一致是要錢和時間的啊,乖乖。誰能等你?bash

       因此,在大規模的雲數據機房,是不能這樣維護系統的。基本上,你在一臺機器上配置好了,你得把這個文件系統整個備份下來,何時把一個環境弄壞了,把它整個廢棄掉,從那裏從新配一個上線。因此你會看見,在數據機房中,即便一臺機器上只跑一個虛擬機,別人也要用虛擬機來跑,由於虛擬機能夠把整個文件系統備份,而後全部東西都用這個虛擬機完整地從新跑起來。服務器

       docker怎麼解決這個問題的呢?docker是一個管理程序,它在你的文件系統中放了不少個完整的子文件系統,讓你的業務軟件運行在你本身的「名稱空間」中,像這樣:

       好比我先配置好了一個ubuntu,我能夠把這個文件系統備份下來,稱爲ubuntu.tar,而後交給你,你只要運行:
1 docker load < ubuntu.tar
2 docker run -P -d --name myubuntu_server ubuntu:latest
(這裏先補充幾個docker的基本語義:
保存在docker中能夠被單獨運行的文件稱爲一個「image」,好比這裏的ubuntu:lastest,其中ubuntu稱爲「repository」,表示「一類」image,你能夠類比爲git裏的一個branch;lastest稱爲tag,表示repository的一個版本。
而這裏的ubuntu.tar是image的一個備份
把image運行起來,就生成一個container,container是image的運行形態,但和「進程是程序的運行態」不一樣的是,container在運行結束後仍然存在(由於你可能修改了image的文件系統中的內容),你能夠從新運行它,或者經過commit命令,把它保存爲另外一個image)
 
        就能夠把個人在這個ubuntu配置的業務軟件運行起來了,這個業務軟件徹底使用本身的文件系統,和別人都沒有關係,它對外使用固定的網絡,這些網絡的端口都映射到我本地指定的端口上,這樣我一臺機器上能夠隨意啓動兩個Web Server並映射到兩個不一樣的端口上,好比這樣:
1 docker run -p 80:8000 -d --name webserver1 ubuntu:latest
2 docker run -p 80:8001 -d --name webserver2 ubuntu:latest
       這兩個命令運行了兩個ubuntu(版本是latest,假設我在裏面配置了Web Server),一個映射到本地的8000端口上,另外一個映射到本地的8001端口上。
你看,這樣就把一個複雜的「系統配置」工做,變成一個「應用程序運行」的工做了。
 
       若是你想調整一下ubuntu:latest的配置,很簡單,你能夠這樣:
1 docker run -ti --name=myconfig_container ubuntu:latest /bin/bash
       這樣你就能夠「進入」這個系統進行配置了,配置完成後,把這個container保存爲一個image,就能夠被其餘人用了:
1 docker commit myconfig_container ubuntu:myconfig_version
       這個地方的強悍之處在於,docker用了一個稱爲aufs的技術,你在ubuntu:lastest中作配置,ubuntu的文件系統假設稱爲f1,而後你在myconfig_container中對f1進行修改,修改的內容並不會修改到f1中,而是修改在f1a文件中。aufs的做用是,它能夠把這些f1, f1a, f 2a, f3a……所有疊加起來,做爲一個文件系統來用。因此你的myconfig_container並不會覆蓋ubuntu:latest,而是針對ubuntu:latest的一個patch。
 
       若是讀者熟悉git,很容易就明白這意味着什麼了,這表示你是像開發軟件和進行版本管理同樣維護整批整批的服務器文件系統,而且能夠任意把它們部署到網絡中的任何一臺支持docker的服務器上。
 
       這個設計完全改變了咱們對一個「網絡服務」的見解,讓它從「一臺機器」退化回「一個程序」。它的影響是深遠的,首先是guest文件系統的設計變得簡化,只要能支持啓動一組服務器程序就能夠了。不須要複雜的init.d服務,不須要複雜的本地鑑權設計(固然,應用自己的鑑權仍是須要),不須要考慮硬件兼容性(由於對OS的抽象都是同樣的),這些變化是要踩到不少服務器OSV,IBV的尾巴的。
 
       另外一方面是Host OS的設計也會變得簡化,如今的CoreOS和RancherOS的出現就是例子,這二者都提供了一個最簡化(只能運行docker)的基礎操做系統。這個操做系統沒有複雜的包管理,沒有不少的軟件,它就幹一件事,讓你用docker運行其餘操做系統。
 
       你說,是否有這麼一天?:咱們買一臺服務器,它提供的再也不是UEFI接口,讓你安裝操做系統,而是直接給你一個RancherOS,而後要配置硬件,均可以直接用OS級別的功能完成,而後,你須要運行Redhat就運行Redhat,須要運行Suse就運行Suse?
 
       這一切,說到底,就是服務器已經太強大了,到了能夠作減法的時候了。
 
(更多華爲資訊請關注華爲開發者社區,華爲本身的對外開放門戶:http://developer.huawei.com/cn/ict/ ,不要問我叫啥,別人都叫我雷鋒)
相關文章
相關標籤/搜索