官方文檔描述:「Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure so you can deliver software quickly. With Docker, you can manage your infrastructure in the same ways you manage your applications. By taking advantage of Docker’s methodologies for shipping, testing, and deploying code quickly, you can significantly reduce the delay between writing code and running it in production.」前端
一句話歸納容器:容器就是將軟件打包成標準化單元,以用於開發、交付和部署。docker
容器鏡像是輕量的、可執行的獨立軟件包 ,包含軟件運行所需的全部內容:代碼、運行時環境、系統工具、系統庫和設置。數據庫
容器化軟件適用於基於Linux和Windows的應用,在任何環境中都可以始終如一地運行。後端
容器賦予了軟件獨立性,使其免受外在環境差別(例如,開發和預演環境的差別)的影響,從而有助於減小團隊間在相同基礎設施上運行不一樣軟件時的衝突。centos
再來看看容器較爲通俗的解釋:
若是須要通俗的描述容器的話,我以爲容器就是一個存放東西的地方,就像書包能夠裝各類文具、衣櫃能夠放各類衣服、鞋架能夠放各類鞋子同樣。咱們如今所說的容器存放的東西可能更偏向於應用好比網站、程序甚至是系統環境。bash
Docker的鏡像提供了除內核外完整的運行時環境,確保了應用運行環境一致性,從而不會再出現「這段代碼在我機器上沒問題啊」這類問題;——一致的運行環境服務器
能夠作到秒級、甚至毫秒級的啓動時間。大大的節約了開發、測試、部署的時間。——更快速的啓動時間網絡
避免公用的服務器,資源會容易受到其餘用戶的影響。——隔離性架構
善於處理集中爆發的服務器使用壓力;——彈性伸縮,快速擴展app
能夠很輕易的將在一個平臺上運行的應用,遷移到另外一個平臺上,而不用擔憂運行環境的變化致使應用沒法正常運行的狀況。——遷移方便
使用Docker能夠經過定製應用鏡像來實現持續集成、持續交付、部署。——持續交付和部署
簡單來講: 容器和虛擬機具備類似的資源隔離和分配優點,但功能有所不一樣,由於容器虛擬化的是操做系統,而不是硬件,所以容器更容易移植,效率也更高。
傳統虛擬機技術是虛擬出一套硬件後,在其上運行一個完整操做系統,在該系統上再運行所需應用進程;而容器內的應用進程直接運行於宿主的內核,容器內沒有本身的內核,並且也沒有進行硬件虛擬。所以容器要比傳統虛擬機更爲輕便。
二者對比圖:
容器與虛擬機 (VM) 總結
容器是一個應用層抽象,用於將代碼和依賴資源打包在一塊兒。 多個容器能夠在同一臺機器上運行,共享操做系統內核,但各自做爲獨立的進程在用戶空間中運行 。與虛擬機相比, 容器佔用的空間較少(容器鏡像大小一般只有幾十兆),瞬間就能完成啓動 。
虛擬機(VM)是一個物理硬件層抽象,用於將一臺服務器變成多臺服務器。 管理程序容許多個VM在一臺機器上運行。每一個VM都包含一整套操做系統、一個或多個應用、必要的二進制文件和庫資源,所以佔用大量空間。並且VM啓動也十分緩慢 。
經過Docker官網,咱們知道了這麼多Docker的優點,可是你們也沒有必要徹底否認虛擬機技術,由於二者有不一樣的使用場景。虛擬機更擅長於完全隔離整個運行環境。例如,雲服務提供商一般採用虛擬機技術隔離不一樣的用戶。而Docker一般用於隔離不一樣的應用 ,例如前端,後端以及數據庫。就我目前項目而言,對於二者無所謂誰會取代誰,而是二者能夠和諧共存。
容器與虛擬機(VM)二者共存:
Docker 中包括三個基本的概念:
Image(鏡像)
鏡像是 Docker 運行容器的前提,倉庫是存放鏡像的場所,可見鏡像更是 Docker 的核心。
那麼鏡像究竟是什麼呢?Docker 鏡像能夠看做是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些爲運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。
鏡像不包含任何動態數據,其內容在構建以後也不會被改變。鏡像(Image)就是一堆只讀層(read-only layer)的統一視角,也許這個定義有些難以理解,下面的這張圖可以幫助讀者理解鏡像的定義:
從左邊咱們看到了多個只讀層,它們重疊在一塊兒。除了最下面一層,其餘層都會有一個指針指向下一層。這些層是 Docker 內部的實現細節,而且可以在主機的文件系統上訪問到。
統一文件系統(Union File System)技術可以將不一樣的層整合成一個文件系統,爲這些層提供了一個統一的視角。這樣就隱藏了多層的存在,在用戶的角度看來,只存在一個文件系統。咱們能夠在圖片的右邊看到這個視角的形式。
鏡像有多種生成方法:
從無到有開始建立鏡像
下載並使用別人建立好的現成的鏡像
在現有鏡像上建立新的鏡像
咱們能夠將鏡像的內容和建立步驟描述在一個文本文件中,這個文件被稱做 Dockerfile ,經過執行 docker build命令能夠構建出 Docker 鏡像。
Container(容器)
容器(Container)的定義和鏡像(Image)幾乎如出一轍,也是一堆層的統一視角,惟一區別在於容器的最上面那一層是可讀可寫的。
因爲容器的定義並無說起是否要運行容器,因此實際上,容器 = 鏡像 + 讀寫層。
Repository(倉庫)
Docker 倉庫是集中存放鏡像文件的場所。鏡像構建完成後,能夠很容易的在當前宿主上運行。
可是, 若是須要在其餘服務器上使用這個鏡像,咱們就須要一個集中的存儲、分發鏡像的服務,Docker Registry(倉庫註冊服務器)就是這樣的服務。
有時候會把倉庫(Repository)和倉庫註冊服務器(Registry)混爲一談,並不嚴格區分。
Docker 倉庫的概念跟 Git 相似,註冊服務器能夠理解爲 GitHub 這樣的託管服務。
實際上,一個 Docker Registry 中能夠包含多個倉庫(Repository),每一個倉庫能夠包含多個標籤(Tag),每一個標籤對應着一個鏡像。
因此說,鏡像倉庫是 Docker 用來集中存放鏡像文件的地方,相似於咱們以前經常使用的代碼倉庫。
一般,一個倉庫會包含同一個軟件不一樣版本的鏡像,而標籤就經常使用於對應該軟件的各個版本 。
咱們能夠經過<倉庫名>:<標籤>的格式來指定具體是這個軟件哪一個版本的鏡像。若是不給出標籤,將以 Latest 做爲默認標籤。
倉庫又能夠分爲兩種形式:
Docker Registry 公有倉庫是開放給用戶使用、容許用戶管理鏡像的 Registry 服務。
通常這類公開服務容許用戶免費上傳、下載公開的鏡像,並可能提供收費服務供用戶管理私有鏡像。
除了使用公開服務外,用戶還能夠在本地搭建私有 Docker Registry。Docker 官方提供了 Docker Registry 鏡像,能夠直接使用作爲私有 Registry 服務。
當用戶建立了本身的鏡像以後就可使用 Push 命令將它上傳到公有或者私有倉庫,這樣下次在另一臺機器上使用這個鏡像時候,只須要從倉庫上 Pull 下來就能夠了。
以上咱們主要把 Docker 的一些常見概念如 Image,Container,Repository 作了詳細的闡述,也從傳統虛擬化方式的角度闡述了 Docker 的優點。
咱們從下圖能夠直觀地看到 Docker 的架構:
Docker 使用 C/S 結構,即客戶端/服務器體系結構。Docker 客戶端與 Docker 服務器進行交互,Docker服務端負責構建、運行和分發 Docker 鏡像。
Docker 客戶端和服務端能夠運行在一臺機器上,也能夠經過 RESTful 、 Stock 或網絡接口與遠程 Docker 服務端進行通訊。
這張圖展現了 Docker 客戶端、服務端和 Docker 倉庫(即 Docker Hub 和 Docker Cloud ),默認狀況下 Docker 會在 Docker 中央倉庫尋找鏡像文件。
這種利用倉庫管理鏡像的設計理念相似於 Git ,固然這個倉庫是能夠經過修改配置來指定的,甚至咱們能夠建立咱們本身的私有倉庫。
咱們能夠經過 docker -h 去查看命令的詳細的幫助文檔。在這裏會講一些平常咱們可能會用的比較多的一些命令。
例如,咱們須要拉取一個 Docker 鏡像,咱們能夠用以下命令:
docker pull image_name
image_name 爲鏡像的名稱,而若是咱們想從 Docker Hub 上去下載某個鏡像,咱們可使用如下命令:
docker pull centos:latest
cento:lastest 是鏡像的名稱,Docker Daemon 發現本地沒有咱們須要的鏡像,會自動去 Docker Hub 上去下載鏡像,下載完成後,該鏡像被默認保存到 /var/lib/docker 目錄下。
接着咱們若是想查看主機下存在多少鏡像,咱們能夠用以下命令:
docker images
咱們要想知道當前有哪些容器在運行,咱們能夠用以下命令:
docker ps -a
-a 是查看當前全部的容器,包括未運行的。咱們該如何去對一個容器進行啓動,重啓和中止呢?
咱們能夠用以下命令:
docker start container_name/container_id docker restart container_name/container_id docker stop container_name/container_id
這個時候咱們若是想進入到這個容器中,咱們可使用 attach 命令:
docker attach container_name/container_id
那若是咱們想運行這個容器中的鏡像的話,而且調用鏡像裏面的 bash ,咱們可使用以下命令:
docker run -t -i container_name/container_id /bin/bash
那若是這個時候,咱們想刪除指定鏡像的話,因爲 Image 被某個 Container 引用(拿來運行),若是不將這個引用的 Container 銷燬(刪除),那 Image 確定是不能被刪除。
咱們首先得先去中止這個容器:
docker ps
docker stop container_name/container_id
而後咱們用以下命令去刪除這個容器:
docker rm container_name/container_id
而後這個時候咱們再去刪除這個鏡像:
docker rmi image_name
經常使用的 Docker 相關的命令就講到這裏爲止了,咱們在後續的文章中還會反覆地提到這些命令。
參考文獻:
https://docs.docker.com/engine/docker-overview/
https://mp.weixin.qq.com/s/9--UJYVJXVr92RCX36R6Vg
--- END ---