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