基礎(chǔ)知識(shí):Docker 1.0簡(jiǎn)介、工作原理與使用案例
如果你還在尋找一種更簡(jiǎn)單的方法將應(yīng)用和服務(wù)從開發(fā)環(huán)境遷移到生產(chǎn)環(huán)境,或者從一個(gè)服務(wù)器環(huán)境遷移到另一個(gè),那么,你應(yīng)該知道Docker。Docker是一種Linux容器解決方案,現(xiàn)在已經(jīng)廣為人知。上周剛剛發(fā)布了穩(wěn)定的用于生產(chǎn)環(huán)境的1.0版本。
Docker 1.0中主要的增強(qiáng)功能讓其能夠滿足生產(chǎn)環(huán)境需求。Docker現(xiàn)在可以直接連接到主機(jī)網(wǎng)絡(luò)接口,而不像早期版本需要使用內(nèi)部連接要求。連接后的Docker可以通過(guò)主機(jī)名稱找到同伴。另外,Docker能很好地支持SELinux,為每個(gè)容器提供更強(qiáng)大的監(jiān)控功能以及時(shí)間戳記的日志。另外Docker還支持多個(gè)終端的注冊(cè)表鏡像,從而提升了冗余和可靠性。
Paul Venezia是國(guó)外網(wǎng)站Infoworld的高級(jí)特約編輯,目前他在該網(wǎng)站上跟大家分享了Docker的工作原理、命令使用案例以及改進(jìn)的網(wǎng)絡(luò)功能。
Docker簡(jiǎn)介
Docker容器允許在主機(jī)服務(wù)器之間無(wú)縫移動(dòng)應(yīng)用和服務(wù)。比虛擬機(jī)更輕量。另外,Docker還包含了版本控制和鏡像管理工具,允許應(yīng)用和服務(wù)在物理服務(wù)器、虛擬服務(wù)器或云實(shí)例之間具備簡(jiǎn)單的擴(kuò)展性和彈性。底層主機(jī)所需要做的只是運(yùn)行***版本的Linux內(nèi)核(3.8版本以上),Linux內(nèi)核必須支持Docker所依賴的LXC(Linux容器)特征。
例如,你可以創(chuàng)建一個(gè)僅僅運(yùn)行memcached服務(wù)或Apache Web服務(wù)的Docker容器。該容器應(yīng)該在標(biāo)準(zhǔn)的Linux基礎(chǔ)如Ubuntu或CentOS上創(chuàng)建,和任何Linux系統(tǒng)一樣安裝和配置所需的服務(wù)。
因此,memcached實(shí)例可以被復(fù)制和運(yùn)行在虛擬服務(wù)器、物理服務(wù)器、亞馬遜云實(shí)例或其他可以運(yùn)行Docker的地方。你不必?fù)?dān)心主機(jī)之間的服務(wù)依賴關(guān)系,也不必關(guān)心應(yīng)用安裝、模擬硬件或任何傳統(tǒng)虛擬化問(wèn)題。你只需要啟動(dòng)正確建立的容器。
Docker工作原理
Docker在Linux系統(tǒng)鏡像上創(chuàng)建容器。就像其他半虛擬化工具如Virtuozzo等,所有的實(shí)例基本上運(yùn)行在主機(jī)系統(tǒng)的內(nèi)核之上,但鎖定在自己的運(yùn)行時(shí)間環(huán)境中,與主機(jī)環(huán)境是隔離的。
當(dāng)你啟動(dòng)或創(chuàng)建一個(gè)Docker容器時(shí),只有容器內(nèi)的激活進(jìn)程運(yùn)行時(shí)才能開始活動(dòng)。如果開啟一個(gè)daemonized進(jìn)程,容器會(huì)立刻結(jié)束運(yùn)行,因?yàn)樵撨M(jìn)程在前端不是激活狀態(tài)。如果你在前端開啟一個(gè)進(jìn)程,容器能正常運(yùn)行,直到該進(jìn)程結(jié)束。這和其他的半虛擬化工具不同,其他的半虛擬化工具基本上在相同的主機(jī)上建立“正常的”虛擬服務(wù)器實(shí)例。即使前臺(tái)進(jìn)程未激活,這些實(shí)例也能正常運(yùn)行。
Docker可以安裝在大多數(shù)Linux發(fā)行版以及Mac OS X和Windows系統(tǒng)上。但后兩者只能使用仿真虛擬機(jī)作為主機(jī)。
在大多數(shù)情況下,在主機(jī)上安裝Docker運(yùn)行時(shí)間是一個(gè)非常簡(jiǎn)單的過(guò)程,只需要多數(shù)Linux發(fā)行版上正常的安裝包管理命令。在Docker網(wǎng)站上,你會(huì)發(fā)現(xiàn)大多數(shù)Linux發(fā)行版和云服務(wù),以及Mac和Windows系統(tǒng)的非常完整的安裝說(shuō)明。
安裝Docker后,我們可以用一個(gè)簡(jiǎn)單的命令創(chuàng)建一個(gè)容器:
- $ sudo docker run -i -t ubuntu /bin/bash
該命令告訴Docker下載***的Ubuntu鏡像(如果主機(jī)上沒(méi)有安裝),并且在容器內(nèi)部運(yùn)行/bin/bash命令。該命令在新容器啟動(dòng)時(shí)執(zhí)行,我們會(huì)得到以下提供:
- root@2e002f3eb1b2:/#
這里我們可以做一切你想在全新Linux安裝過(guò)程中做的事情。我們可以運(yùn)行apt-get更新、安裝并配置新軟件、編寫腳本并像使用其他Linux服務(wù)器實(shí)例一樣使用容器。除了在從命令行退出時(shí)容器會(huì)停止運(yùn)行。如果開始一個(gè)Apache進(jìn)程并從容器提供Web網(wǎng)頁(yè),Web服務(wù)將會(huì)停止。因此,為單個(gè)服務(wù)創(chuàng)建容器通常是個(gè)好主意。你可以在單個(gè)容器中運(yùn)行多個(gè)服務(wù),但也許會(huì)更具挑戰(zhàn)性。
簡(jiǎn)單的Docker使用案例
Docker是一個(gè)命令行工具,它提供了中央“docker”執(zhí)行過(guò)程中所需的所有工具。這使得Docker的操作非常簡(jiǎn)單。一些例子可以檢查運(yùn)行中的容器的狀態(tài):
或檢查可用的鏡像及其版本的列表:
另一個(gè)例子是顯示一個(gè)鏡像的歷史:
上面的命令顯示了命令行界面操作的方便快捷。你只需要指定鏡像ID的前幾個(gè)字符就可以。你可以看到只需要“d95”就能顯示d95238078ab0鏡像的所有歷史。
你可能會(huì)注意到該鏡像非常小。這是因?yàn)镈ocker從父鏡像建立增量鏡像,只存儲(chǔ)每個(gè)容器的更改。因此,如果你有一個(gè)300MB的父鏡像,如果你在容器中安裝了50MB的額外應(yīng)用或服務(wù),你的容器和生成鏡像可能只有50MB。
你可以用Dockerfiles自動(dòng)化Docker容器的創(chuàng)建過(guò)程。Dockerfiles是含有單個(gè)容器性能規(guī)范的文件。例如,你可以創(chuàng)建一個(gè)Dockerfiles來(lái)建立一個(gè)Ubuntu容器,在新容器內(nèi)運(yùn)行一些命令、安裝軟件或執(zhí)行其他任務(wù),然后啟動(dòng)容器。
容器網(wǎng)絡(luò)
Docker早期版本中的網(wǎng)絡(luò)基于主機(jī)橋接,但是Docker 1.0包含了一種新形式的網(wǎng)絡(luò),允許容器直接連接到主機(jī)以太網(wǎng)接口。默認(rèn)情況下,一個(gè)容器有一個(gè)回路以及一個(gè)連接到默認(rèn)內(nèi)部橋接的接口,但是如果需要的話也可以配制成直接訪問(wèn)。通常,直接訪問(wèn)比橋接的速度更快。
然而,橋接方法在許多情況下是非常有用的。橋接是通過(guò)主機(jī)自動(dòng)創(chuàng)建一個(gè)內(nèi)部網(wǎng)絡(luò)適配器并為其分配一個(gè)主機(jī)本身尚未使用的子網(wǎng)。然后,當(dāng)新的容器連接到這座橋,它們的地址進(jìn)行自動(dòng)分配。容器啟動(dòng)時(shí)你可以將其連接到主機(jī)接口或端口,因此運(yùn)行Apache的容器可能啟動(dòng)并連接到主機(jī)上的TCP端口8080(或隨機(jī)端口)。通過(guò)使用腳本和管理控制,你可以在任何地方啟動(dòng)Docker,連接端口并將其傳達(dá)到需要使用該服務(wù)的應(yīng)用或服務(wù)堆棧的其他部分。
Docker的現(xiàn)實(shí)世界
Docker 1.0的發(fā)布會(huì)吸引更多的眼球。Docker對(duì)經(jīng)驗(yàn)豐富的Linux管理員來(lái)說(shuō)應(yīng)該有相對(duì)較短的學(xué)習(xí)曲線。
Docker是切實(shí)可行的、基本的后端基礎(chǔ)設(shè)施組件,為L(zhǎng)inux管理員和架構(gòu)師提供大量的工具和功能。有可能不具備指向和點(diǎn)擊的界面,但這并不一定是壞事。Docker仍有許多地方要改進(jìn)(如鏡像版本控制和私有注冊(cè)中心),并且很多地方可以更簡(jiǎn)化(如網(wǎng)絡(luò))。但Docker 1.0版本足以滿足你的需求了。