原文鏈接:http://wyb0.com/posts/docker-basis/
0x00 關于Docker
Docker中的鏡像類似VM的快照,容器類似虛擬機,使用鏡像創(chuàng)建容器類似于使用快照創(chuàng)建虛擬機。
Docker中運行應用的是容器,容器的創(chuàng)建和銷毀在秒級就能完成。
Docker使用了AUFS,可以以遞進的方式創(chuàng)建"VM",一個"VM"疊在另一個"VM"上,就像使用git增量開發(fā)一樣。
軟件的運行環(huán)境(image)和軟件本身(container)分離,和數(shù)據(jù)也分離。
學習Docker需要了解4個概念:鏡像、容器、數(shù)據(jù)卷、鏈接
0x01 鏡像image
- Docker Images 只是一個只讀模板,用來運行Docker容器,可以在Docker hub(官方鏡像庫)下載。
- 鏡像擁有唯一ID(比如:72c989e2d109)以及一個供人閱讀的名字和標簽對(比如:ubuntu:latest)。
- 鏡像必須完全可移植,Docker不允許例外。
0x02 容器container
- 可以在一個鏡像的基礎上創(chuàng)建多個容器,每個容器相互獨立。
- 容器也擁有唯一ID以及一個供人閱讀的名字。
- 容器被啟動時會被分配一個隨機的私有IP,其他容器可以通過這個IP與它進行通信。
- Docker允許公開容器的特定端口。
- 一個容器一個進程,容器設計本意是用來運行一個應用的而非一臺機器。
- 容器應該是短暫和一次性的。
- Docker鏡像層對于容器來說,是只讀的,容器對于文件的寫操作絕對不會作用在鏡像中。
0x03 數(shù)據(jù)卷
- 數(shù)據(jù)卷表現(xiàn)為容器內(nèi)的空間,但實際保存在容器外,你可以在不影響數(shù)據(jù)的情況下銷毀、重建、修改、丟棄容器。
- Docker允許你定義應用和數(shù)據(jù)部分,并提供工具讓你可以將它們分開。
0x04 鏈接
- Docker允許你在創(chuàng)建一個新容器時引用其它現(xiàn)存容器,在你剛創(chuàng)建的容器里被引用的容器將獲得一個你指定的別名,我們就說這兩個容器被鏈接在了一起。
- 若DB容器已經(jīng)在運行,我們可以創(chuàng)建一個Web服務器容器,并在創(chuàng)建時引用這個DB容器,可以給它起個別名(比如dbapp),在新創(chuàng)建的Web服務器容器中,可以在任何時候使用主機名dbapp與DB容器進行通信。
0x05 鏡像與容器關系
- Docker鏡像是一個文件,屬于靜態(tài)的內(nèi)容;Docker容器屬于動態(tài)的內(nèi)容,可以把容器理解為一個或多個運行進程。
- Docker可以通過解析Docker鏡像的json文件,獲知應該在這個鏡像之上運行什么樣的進程,應該為進程配置怎么樣的環(huán)境變量。
- Docker守護進程手握Docker鏡像的json文件,它為容器配置相應的環(huán)境并真正運行Docker鏡像所指定的進程,從而完成Docker容器的真正創(chuàng)建。
- 當Docker容器運行起來之后,Docker鏡像json文件就失去作用了。此時Docker鏡像的絕大部分作用就是:為Docker容器提供一個文件系統(tǒng)的視角,供容器內(nèi)部的進程訪問文件資源。
0x06 Docker有三個組件和三個基本元素
-
三個組件
- Docker Daemon 運行于主機上,處理服務請求,是用于管理容器的后臺進程,上面有一些api接口。
- Docker Client 用于操作容器,它是Deamon的api接口(如docker start、docker rm等)的封裝。
- Docker Index 是中央registry,支持擁有公有與私有訪問權限的Docker容器鏡像的備份。
-
三個基本要素
- Docker Images 是一個只讀模板,用來運行Docker容器。
- Docker Containers 負責應用程序的運行,包括操作系統(tǒng)、用戶添加的文件以及元數(shù)據(jù)。
- DockerFile 是文件指令集,用來說明如何自動創(chuàng)建Docker鏡像。
0x07 Docker的運行原理
Docker使用以下操作系統(tǒng)的功能來提高容器技術效率
Namespaces:充當隔離的第一級。確保一個容器中運行一個進程而且不能看到或影響容器外的其它進程。
Control Groups:是LXC的重要組成部分,實現(xiàn)資源核算與限制,提供CPU、內(nèi)存、網(wǎng)絡相關指標等。
UnionFS:union文件系統(tǒng),容器的構建塊。它用于保存鏡像并使容器變得短暫(即輕量級及速度快的特性)。運行任何應用程序都需要兩個基本步驟,即構建一個鏡像和運行容器
上面兩步都是從Docker Client的命令(比如:docker run)開始的
在基礎層面上,Docker Client會告訴Docker Daemon需要創(chuàng)建的鏡像以及需要在容器內(nèi)運行的命令
0x08 Docker Registry
Docker Registry是Docker的鏡像存儲服務端,它是所有倉庫(包括私有和公有)以及工作流的中央Registry
Docker Registry有3個角色:index、registry、registry client
- index
負責并維護有關用戶賬戶、鏡像的體驗以及公共命名空間的信息。
index通過Web UI、元數(shù)據(jù)存儲、認證服務、符號化這幾個組件來維護這些信息。
- registry
它是鏡像和圖表的倉庫(比如Docker hub)
* Registry包含一個或多個Repository
* Repository包含一個或多個Image
* Image用GUID表示,有一個或多個Tag與之關聯(lián)
- registry client
客戶端
0x09 Docker下載鏡像的原理

- Client向Index請求,詢問從哪里下載CentOS
- Index回復Client說CentOS在Registry A可以得到,并且返回CentOS的Checksum,所有層的Token
- Client帶著Token向Registry A請求CentOS的所有層(Registry A負責存儲CentOS,以及它所依賴的層)
- Regsitry A向Index發(fā)起請求,驗證用戶Token的合法性
- Index回復Registry A這次請求是否合法
- Client從Registry A下載所有的層:Registry從后端存儲中獲取實際的文件數(shù)據(jù),返給Client
0x0A Docker安裝與卸載
#安裝
$ sudo apt-get update
$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# Verify that the key fingerprint is 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
$ sudo apt-key fingerprint 0EBFCD88
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ sudo apt-get update
$ sudo apt-get install docker-ce
$ sudo docker info #查看是否安裝成功
#卸載
$ sudo apt-get purge docker-ce
$ sudo rm -rf /var/lib/docker
#添加當前用戶到docker組
$ sudo gpasswd -a ${USER} docker
$ sudo service docker restart
$ newgrp - docker