一、Docker是什么?
Docker 是一個開源的應(yīng)用容器引擎,基于 Go 語言 并遵從 Apache2.0 協(xié)議開源。
Docker 可以讓開發(fā)者打包他們的應(yīng)用以及依賴包到一個輕量級、可移植的容器中,然后發(fā)布到任何流行的 Linux 機(jī)器上,也可以實現(xiàn)虛擬化。
容器是完全使用沙箱機(jī)制,相互之間不會有任何接口(類似 iPhone 的 app),更重要的是容器性能開銷極低。
二、Docker能做什么?
Docker的思想來自于集裝箱,集裝箱解決了什么問題?在一艘大船上,可以把貨物規(guī)整的擺放起來。并且各種各樣的貨物被集裝箱標(biāo)準(zhǔn)化了,集裝箱和集裝箱之間不會互相影響。那么我就不需要專門運送水果的船和專門運送化學(xué)品的船了。只要這些貨物在集裝箱里封裝的好好的,那我就可以用一艘大船把他們都運走。
docker就是類似的理念。現(xiàn)在都流行云計算了,云計算就好比大貨輪。docker就是集裝箱。
1.不同的應(yīng)用程序可能會有不同的應(yīng)用環(huán)境,比如.net開發(fā)的網(wǎng)站和php開發(fā)的網(wǎng)站依賴的軟件就不一樣,如果把他們依賴的軟件都安裝在一個服務(wù)器上就要調(diào)試很久,而且很麻煩,還會造成一些沖突。比如IIS和Apache訪問端口沖突。這個時候你就要隔離.net開發(fā)的網(wǎng)站和php開發(fā)的網(wǎng)站。常規(guī)來講,我們可以在服務(wù)器上創(chuàng)建不同的虛擬機(jī)在不同的虛擬機(jī)上放置不同的應(yīng)用,但是虛擬機(jī)開銷比較高。docker可以實現(xiàn)虛擬機(jī)隔離應(yīng)用環(huán)境的功能,并且開銷比虛擬機(jī)小,小就意味著省錢了。
2.你開發(fā)軟件的時候用的是Ubuntu,但是運維管理的都是centos,運維在把你的軟件從開發(fā)環(huán)境轉(zhuǎn)移到生產(chǎn)環(huán)境的時候就會遇到一些Ubuntu轉(zhuǎn)centos的問題,比如:有個特殊版本的數(shù)據(jù)庫,只有Ubuntu支持,centos不支持,在轉(zhuǎn)移的過程當(dāng)中運維就得想辦法解決這樣的問題。這時候要是有docker你就可以把開發(fā)環(huán)境直接封裝轉(zhuǎn)移給運維,運維直接部署你給他的docker就可以了。而且部署速度快。
3.在服務(wù)器負(fù)載方面,如果你單獨開一個虛擬機(jī),那么虛擬機(jī)會占用空閑內(nèi)存的,docker部署的話,這些內(nèi)存就會利用起來。
總之docker就是集裝箱原理。
三、Docker典型應(yīng)用場景
3.1 簡化配置
這是Docker公司宣傳的Docker的主要使用場景。虛擬機(jī)的最大好處是能在你的硬件設(shè)施上運行各種配置不一樣的平臺(軟件、系統(tǒng)),Docker在降低額外開銷的情況下提供了同樣的功能。它能讓你將運行環(huán)境和配置放在代碼中然后部署,同一個Docker的配置可以在不同的環(huán)境中使用,這樣就降低了硬件要求和應(yīng)用環(huán)境之間耦合度。
3.2 代碼流水線(Code Pipeline)管理
前一個場景對于管理代碼的流水線起到了很大的幫助。代碼從開發(fā)者的機(jī)器到最終在生產(chǎn)環(huán)境上的部署,需要經(jīng)過很多的中間環(huán)境。而每一個中間環(huán)境都有自己微小的差別,Docker給應(yīng)用提供了一個從開發(fā)到上線均一致的環(huán)境,讓代碼的流水線變得簡單不少。
3.3 提高開發(fā)效率
這就帶來了一些額外的好處:Docker能提升開發(fā)者的開發(fā)效率。如果你想看一個詳細(xì)一點的例子,可以參考Aater在DevOpsDays Austin 2014 大會或者是DockerCon上的演講。
不同的開發(fā)環(huán)境中,我們都想把兩件事做好。一是我們想讓開發(fā)環(huán)境盡量貼近生產(chǎn)環(huán)境,二是我們想快速搭建開發(fā)環(huán)境。
理想狀態(tài)中,要達(dá)到第一個目標(biāo),我們需要將每一個服務(wù)都跑在獨立的虛擬機(jī)中以便監(jiān)控生產(chǎn)環(huán)境中服務(wù)的運行狀態(tài)。然而,我們卻不想每次都需要網(wǎng)絡(luò)連接,每次重新編譯的時候遠(yuǎn)程連接上去特別麻煩。這就是Docker做的特別好的地方,開發(fā)環(huán)境的機(jī)器通常內(nèi)存比較小,之前使用虛擬的時候,我們經(jīng)常需要為開發(fā)環(huán)境的機(jī)器加內(nèi)存,而現(xiàn)在Docker可以輕易的讓幾十個服務(wù)在Docker中跑起來。
3.4 隔離應(yīng)用
有很多種原因會讓你選擇在一個機(jī)器上運行不同的應(yīng)用,比如之前提到的提高開發(fā)效率的場景等。
我們經(jīng)常需要考慮兩點,一是因為要降低成本而進(jìn)行服務(wù)器整合,二是將一個整體式的應(yīng)用拆分成松耦合的單個服務(wù)(譯者注:微服務(wù)架構(gòu))。如果你想了解為什么松耦合的應(yīng)用這么重要,請參考Steve Yege的這篇論文,文中將Google和亞馬遜做了比較。
3.5 整合服務(wù)器
正如通過虛擬機(jī)來整合多個應(yīng)用,Docker隔離應(yīng)用的能力使得Docker可以整合多個服務(wù)器以降低成本。由于沒有多個操作系統(tǒng)的內(nèi)存占用,以及能在多個實例之間共享沒有使用的內(nèi)存,Docker可以比虛擬機(jī)提供更好的服務(wù)器整合解決方案。
3.6 調(diào)試能力
Docker提供了很多的工具,這些工具不一定只是針對容器,但是卻適用于容器。它們提供了很多的功能,包括可以為容器設(shè)置檢查點、設(shè)置版本和查看兩個容器之間的差別,這些特性可以幫助調(diào)試Bug。你可以在《Docker拯救世界》的文章中找到這一點的例證。
3.7 多租戶環(huán)境
另外一個Docker有意思的使用場景是在多租戶的應(yīng)用中,它可以避免關(guān)鍵應(yīng)用的重寫。我們一個特別的關(guān)于這個場景的例子是為IoT(譯者注:物聯(lián)網(wǎng))的應(yīng)用開發(fā)一個快速、易用的多租戶環(huán)境。這種多租戶的基本代碼非常復(fù)雜,很難處理,重新規(guī)劃這樣一個應(yīng)用不但消耗時間,也浪費金錢。
使用Docker,可以為每一個租戶的應(yīng)用層的多個實例創(chuàng)建隔離的環(huán)境,這不僅簡單而且成本低廉,當(dāng)然這一切得益于Docker環(huán)境的啟動速度和其高效的diff命令。
你可以在這里了解關(guān)于此場景的更多信息。
3.8 快速部署
在虛擬機(jī)之前,引入新的硬件資源需要消耗幾天的時間。虛擬化技術(shù)(Virtualization)將這個時間縮短到了分鐘級別。而Docker通過為進(jìn)程僅僅創(chuàng)建一個容器而無需啟動一個操作系統(tǒng),再次將這個過程縮短到了秒級。這正是Google和Facebook都看重的特性。
你可以在數(shù)據(jù)中心創(chuàng)建銷毀資源而無需擔(dān)心重新啟動帶來的開銷。通常數(shù)據(jù)中心的資源利用率只有30%,通過使用Docker并進(jìn)行有效的資源分配可以提高資源的利用率。
四、Docker操作
4.1 鏡像的操作
相當(dāng)于我們在Linux服務(wù)器上下載某個應(yīng)用
# 1. 拉取鏡像到本地
docker pull 鏡像名稱[:tag]
# 舉個例子 tomcat
docker pull daocloud.io/library/tomcat:8.5.15-jre8
# 2. 查看全部本地的鏡像
docker images
# 3. 刪除本地鏡像
docker rmi 鏡像的標(biāo)識
# 4. 鏡像的導(dǎo)入導(dǎo)出(不規(guī)范)
# 將本地的鏡像導(dǎo)出
docker save -o 導(dǎo)出的路徑 鏡像id
# 加載本地的鏡像文件
docker load -i 鏡像文件
# 修改鏡像名稱
docker tag 鏡像id 新鏡像名稱:版本
4.2 容器的操作
# 1. 運行容器
# 簡單操作
docker run 鏡像的標(biāo)識|鏡像名稱[tag]
# 常用的參數(shù)
docker run -d -p 宿主機(jī)端口:容器端口 --name 容器名稱 鏡像的標(biāo)識|鏡像名稱[tag]
# -d: 代表后臺運行容器
# -p: 宿主機(jī)端口:容器端口: 為了映射當(dāng)前Linux的端口和容器的端口
# --name 容器名稱: 指定容器的名稱
# 2. 查看正在運行的容器
docker ps [OPTIONS]
# OPTIONS說明:
# -a: 代表查看全部的容器,包括沒有運行
# -q: 只查看容器的標(biāo)識
# -f: 根據(jù)條件過濾顯示的內(nèi)容
# --format: 指定返回值的模板文件
# -l: 顯示最近創(chuàng)建的容器
# -n: 列出最近創(chuàng)建的n個容器
# --no-trunc: 不截斷輸出
# -s: 顯示總的文件大小
# 3. 查看容器的日志
docker logs -f 容器id
# -f: 可以滾動查看日志的最后幾行
# 4. 進(jìn)入到容器內(nèi)部
docker exec -it 容器id bash
# 5. 刪除容器(刪除容器前,需要先停止容器)
docker stop 容器id
# 停止指定的容器
docker stop $(docker ps -qa)
# 停止全部容器
docker rm 鏡像id
# 刪除指定容器
docker rm $(docker ps -qa)
# 刪除全部容器
#6. 啟動容器
docker start 容器id
轉(zhuǎn)載文章
Docker 教程
如何通俗解釋Docker是什么?
八個Docker的真實應(yīng)用場景
Docker技術(shù)這些應(yīng)用場景