1.Docker概述
Docker是一個用于開發,發布和運行應用程序的開放平臺。Docker能快速的把你的應用程序從基礎設施分離出來。使用Docker,你可以像管理應用程序一樣管理基礎設施。通過利用Docker的方法來快速交付,測試和部署代碼,你可以顯著的減少編寫代碼和生產環境中運行代碼之間的延遲
- Docker平臺
Docker提供了在稱為容器的松散隔離環境中打包和運行應用程序的能力。隔離和安全性允許你給定的主機上同時運行多個容器。容器是輕量級的,因為他們不需要管理程序的額外負載,而是在主機內核中運行。這意味著與使用虛擬機相比,你可以在給定的硬件組合上運行更多的容器。你甚至可以在實際上是虛擬機的主機中運行Docker容器。
Docker提供工具和平臺管理你的容器的生命周期:
使用容器開發應用程序及其支持組件
容器成為分發和測試應用程序的單元
準備好之后,將應用程序部署到生產環境中,作為容器或編排的服務。無論您的生產環境是本地數據中心、云提供商還是兩者的混合,其工作原理都一樣的。
3.Docker Engine
Docker Engine是一個client-server應用程序,主要組件如下:
一個服務,一種長時間運行的程序,稱為守護進程(docker命令)
一個REST API,程序可以使用這些接口與守護進程進行對話,并指示他做什么
一個命令行接口(CLI)客戶端(docker命令)
CLI使用Docker REST API通過腳本或直接用CLI命令來控制Docker守護進程與之交互。許多其他的Docker應用程序使用底層API和CLI
該守護進程創建并管理Docker對象,如鏡像,容器,網絡,和卷
注:Docker實在開源Apache 2.0許可下獲得許可的
有關更多的細節,請參見線面Docker架構。
- 我們可以使用Docker做什么?
迅速一致的交付應用程序。
Docker簡化了開發生命周期,允許開發人員使用提供了帶有應用程序和服務的本地容器的標準化標準化環境中工作。容器對于持續集成和持續交付(CI/CD)工作非常有用。
考慮以下示例場景:
你的開發員在本地編寫代碼,并使用Docker容器與同事工作
他們使用Docker將應用程序推入測試環境,并執行自動化和手動測試
當開發人員發現bug時,它們可以在開發環境中修復他們,并將它們部署到測試環境中進行測試和驗證
測試完成后,修復客戶端只需將更新后的鏡像推入生產系統即可
響應式部署和擴張
Docker基于容器的平臺允許高度語可移植的工作負載。Docker容器可以在開發人員的本地電腦,數據中心的物理機或虛擬機、云提供商或混合環境中運行
Docker的可移植性和輕量級特性也使得動態管理變得容易,根據業務需求,在近乎實際的情況下擴展或分解應用或服務。
在相同的硬件上運行更多的工作負載
Docker使輕量級和迅速的。它為基于管理程序的虛擬機提供了一種可行的,經濟有效的代替方案。因此你可以使用更多的計算能力來實現業務目標。Docker非常適合用于高密度環境和需要使用較少資源完成更多的中小型部署。
-
Docker架構
Docker使用client-server架構。Docker客戶機與Docker守護進行進行對話,后者負責構建運行和分發Docker容器。Docker客戶機和守護進程可以再統一系統上運行,也可以將Docker客戶機連接到遠程Docker守護進程。Docker客戶機和守護進程通過Unix套接字或網絡接口使用REST API進行通信。
clipboard1.png
Docker Daemon(Docker守護進程)
Docker守護進程(dockerd)監聽Docker API請求并管理Docker對象,如圖像,容器,網絡和卷。守護進程還可以與其他守護進程通信以管理Docker服務
Docker client(Docker客戶端)
Docker客戶端(Docker)是許多Docker用戶與Docker交互的主要方式。當你使用docker run之類的命令式,客戶端將這些命令發送給dockerd。dockerd執行這些命令。docker命令使用docker API。Docker客戶機可以與多個守護進程通信。
Docker redistries (Docker倉庫)
Docker倉庫儲存Docker鏡像。Docker Hub是一個任何人都可以使用的公共倉庫,Docker被配置為默認在Docker Hub上查找圖像,甚至還可以運行自己的私有倉庫。如果你使用Docker數據中心(DDC),他包括Docker可信倉庫(DTR)
當你使用docker pull 或 docker run 命令,所需的鏡像將從配置的倉庫中提取。當你使用docker push 命令時,你的鏡像將被推送到配置的倉庫中。
Docker Object(Docker對象)
當你使用Docker時,你是在創建和使用圖像、容器、網絡、卷、插件和其他對象。本節簡要敘述其中一些對象
IMAGES(鏡像)
鏡像是一個只讀的模板,帶有創建Docker容器的指令。通常,一個鏡像是基于另一個鏡像的,需要進行一些額外的定制。例如,你可以基于ubuntu構建一個鏡像,安裝Apache Web服務器和你的應用程序,以及配置你應用程序運行的細節
你可以創建自己的鏡像,也可以只使用其他人創建并發布在倉庫中的圖像。構建一個你自己的鏡像,你需要創建一個Dockerfile,它具有簡單的語法,用于定義創建鏡像和運行鏡像所需的步驟。Dockerfile中的每個指令都在鏡像中創建一個層。當你更改Dockerfile并重新構建竟像是,只需重新構建那些已經更改的層。與其他虛擬化技術相比,這就是鏡像輕量級,小巧和快速的部分原因
CONTAINERS(容器)
容器是鏡像的可運行的實例。你可以使用Docker API or CLI 創建,啟動,停止,移動,或刪除容器。你可以將一個容器連接至一個或多個網絡,將存儲添加到其中,甚至可以基于當前的狀態創建新的鏡像。
默認情況下,容器與其他容器和主機是相對隔離的。你可以控制容器的網絡、存儲或其他底層子系統或其他容器或主機的隔離程度。
容器由其鏡像以及在創建或啟動它時提供的任何配置選項來定義。當一個容器被移除時,對其狀態的任何未存儲在持久存儲中的更改都將消失
示例docker運行命令:
下面的命令運行一個Ubuntu容器,以交互方式附加到本地命令行會話,并運行/bin/bash.
$ docker run -i -t ubuntu /bin/bash
當你運行這個命令時,會發生一下情況(假如你使用的是默認倉庫的配置):
- 如果你本地沒有Ubuntu鏡像,Docker會從你配置的倉庫中拉出它,就像你手動運行Docker拉Ubuntu一樣。
- Docker創建一個新容器,就像你手動運行了一個Docker容器創建命令一樣。
- Docker將一個讀寫文件系統分配給容器作為他的最后一層。這允許正在運行的容器在其本地文件系統中創建或修改文件或目錄。
- Docker創建一個網絡接口連接到默認網絡,如果你沒有指定任何網絡的選項。這包括為一個容器分配IP地址,默認情況下,容器可以使用宿主機的網絡連接到外部網絡。
- Docker啟動容器并執行/bin/bash。由于容器以交互方式運行并附加到終端(由于 -i 和 -t 標志),所以你可以在輸出機庫到中段時使用鍵盤提供輸入。
- 當你鍵入 exit 以終止 /bin/bash,容器將停止,但不會被刪除。你可以重新啟動它或刪除它。
SERVICES(服務)
服務允許你跨多個Docker守護進程擴展容器,這些守護進程與多個管理器和工作人員一起工作。集群中的每個成員都是一個Docker守護進程,這些守護進程都使用Docker API進行通信。服務需要你定義所需的狀態,例如在任何給定時間必須可用的服務副本的數量。默認情況下,服務跨所有工作節點進行負載均衡,對于使用者來說,Docker服務似乎是一個單獨的應用程序。Docker Engine在Docker 1.12及更高版本中支持集群模式
The underlying technology(底層技術)
Docker使用Go編寫的,他利用了Linux內核的幾個特性來交互其功能
Namespaces(名稱空間)
Docker使用一種稱為名稱空間的技術來提供稱為容器的隔離工作區。運行容器時,Docker為該容器創建一組名稱空間
這些名稱空間提供了一個隔離層。容器的每個方面都在一個單獨的名稱空間中運行,他的訪問權限僅限于該名稱空間。
DoDocker Engine在Linux上使用的命名空間如下:
pid 名稱空間:進程隔離(PID:Process ID)
net 名稱空間:管理網絡接口(net:Networking)
ipc 名稱空間:管理對 ipc 資源的訪問(ipc:進程間通信)
mnt 名稱空間:管理文件系統掛載點(mnt:mount)
uts 名稱空間: 隔離內核和版本標識符(UTS:Unix分時系統)
Control groups(控制組)
Linux上的Docker Engine還依賴于另一種稱為control groups(cgrous)的技術。一個cgroups限定一個程序為一組特定的資源。控制組允許Docker Engine將可用的硬件資源共享給容器,并可選的執行限制和約束。例如,你可以對一個特定容器限制內存。
Union file systems(Union文件系統)
Union文件系統,或UnionFS,是通過創建層來操作的文件系統,使他們非常輕量級和快速。Docker Engine使用UnionFS為容器提供構建塊。Docker Engine可以使用多個UnionFS變體,包括AUFS,btrfs、vfs和DeviceMapper。
Container format(容器格式)
Docker Engine將名稱空間,控制組,和UnionFS組合成稱為容器格式的包裝器。默認的容器格式是libcontainer。將來,Docker可能通過與 BSD Jails 或 Solaris Zones等技術集成來支持其他容器格式
總結: