1. 程式人生 > >Docker架構、鏡像和容器

Docker架構、鏡像和容器

分享圖片 分配 轉換 shadow Dokcer 網橋 blog HERE bbb

一、Docker概述

Docker是在Linux容器裏面運行的開源工具,是一種輕量級的虛擬機。其設計宗旨:Build,Ship and Run Any App,Anywhere,即通過對應組件的封裝、發布、部署、運行等生命周期的管理,達到組件級別的“一次封裝,到處運行”的目的。這裏的組件,既可以是一個應用,也可以是一套服務,甚至是一個完整的操作系統。
Docker的三大核心概念:鏡像、容器、倉庫,安裝Docker以及圍繞鏡像和容器的具體操作。

二、相比傳統虛擬機Dokcer的優勢

1、Docker容器很快,啟動和停止可以在秒級實現,比傳統虛擬機要快很多。
2、Docker核心解決的問題是利用容器來時實現類似VM的功能,從而以更加節省的硬件資源提供給用戶更多的計算資源,所以Docker容器除了運行其中的應用之外,基本不消耗額外的系統資源,從而在保證性能的同時,減小了系統開銷,使得在一臺主機上同時運行數千個Docker容器成為可能。

3、Docker操作方便,還可以通過Dockerfile配置文件支持靈活的自動化創建和部署。
技術分享圖片

三、Docker和傳統虛擬機的架構

Docke之所以擁有眾多優勢,跟操作系統虛擬化自身的特點是分不開的。傳統虛擬機需要擁有額外的虛擬機管理程序。
技術分享圖片

四、Docker核心概念及安裝

1、鏡像(Image)
Docker的鏡像是創建容器的基礎,類似虛擬機的快照,可以理解為是一個面向Docker容器引擎的只讀模板,比如:一個鏡像可以是一個完整的CentOS操作系統環境,成為一個CentOS鏡像;可以是一個安裝了MySQL的應用程序,稱之為一個MySQL鏡像等等。
Docker提供了簡單的機制來創建和更新現有的鏡像,用戶也可以從網上下載已經做好的應用鏡像來直接使用。

2、容器(container)
Docker的容器是從鏡像創建的運行實列,它可以被啟動、停止和刪除。所創建的每一個容器都是相互隔離、互補可見的,可以保證平臺的安全性。還可以把容器看作是一個簡易版的Linux環境,Docker利用容器來運行和隔離應用。
3、倉庫(Repository)
Docker倉庫是用來集中保存鏡像的地方,當創建了自己的鏡像之後,可以使用push命令將它上傳到公共倉庫(Pulic)或者私有倉庫(Private),這樣一來當下次要在另一臺機器上使用這個鏡像的時候,只需要從倉庫上pull下來就可以了。
倉庫註冊服務器(Registry)是存放倉庫的地方,其中包含了多個倉庫,每個倉庫幾種存放某一類鏡像,並且使用不同的標簽來區分它們。目前最大的公共倉庫是DockerHUb,其中存放了數量龐大的鏡像供用戶下載使用。

4、Docker的安裝
vi /etc/yum.repos.d/CentOS-Base.repo //配置yum源
在末行添加以下內容:
[docker-repo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg

yum install -y docker-engine    //安裝Docker引擎
systemctl enable docker     //開機自啟
systemctl start docker      //啟動docker

五、Docker鏡像操作

Docker運行容器前需要本地存在對應的鏡像,如果不存在本地鏡像Docker就會嘗試從默認鏡像倉庫https://hub.docker.com 下載,這是由Docker官方維護的一個公共倉庫,可以滿足用戶的絕大部分需求。用戶也可以通過配置來使用自定義的鏡像倉庫。
1、搜索鏡像(默認從Docker Hub查詢)
獲取鏡像的三種方式:
1)下載鏡像(默認從Docker Hub下載)
2)把容器轉換為鏡像
3)制作鏡像(通過dockerfile生成鏡像)
docker search httpd //查找所有httpd相關的鏡像
技術分享圖片
2、下載鏡像(默認從Docker Hub下載)
docker pull httpd //拉取apache鏡像
技術分享圖片
3、查看鏡像
docker images //查看本地鏡像列表
技術分享圖片
各個選項說明:
REPOSITORY:表示鏡像的倉庫源
TAG:表示鏡像的標簽
IMAGE ID:表示鏡像的ID
CREATED:表示鏡像創建時間
SIZE:表示鏡像大小

docker tag httpd apache:test //給鏡像添加新的標簽
技術分享圖片
4、刪除鏡像

docker rmi 倉庫名:標簽
docker rmi -f 鏡像ID  //永久刪除鏡像
docker rmi -f $(docker images | grep "none" | awk "{print \$3}")       //刪除沒有使用的鏡像

5、導出和導入鏡像

docker save -o 導出文件名 導出的鏡像
docker save -o httpd01 httpd        //導出鏡像

技術分享圖片
docker load <導出的文件
技術分享圖片
註意:導入之前要將原先的httpd鏡像刪除,否則不執行導入操作
6、上傳鏡像
docker push 鏡像名稱 //上傳鏡像到共有倉庫

六、Docker容器的操作

容器時Docker的另一個核心概念。簡單說,容器時鏡像的一個運行實例,是獨立運行的一個或一組應用以及他們所需的運行環境,包括文件系統、系統類庫、shell環境等。鏡像是只讀模板,而容器會給這個只讀模板一個額外的可寫層。
1、容器的創建和啟動
docker create -it httpd /bin/bash //創容器,默認時沒有運行的
-i:讓容器的輸入保持打開
-t:讓Docker分配一個偽終端

docker ps  //查看正在運行的容器
docker ps -a    //查看所有容器

技術分享圖片

docker start 容器ID   //啟動容器
docker stop 容器ID    //停止容器

技術分享圖片
創建並啟動容器用docker run命令,等與先執行docker create命令,在執行docker start命令。
docker run來創建容器時過程如下:
1)首先檢查本地是否存在指定的鏡像,當鏡像不存在時,會從公共倉庫下載
2)再利用鏡像創建並啟動一個容器
3)接著分配一個文件系統給容器,在只讀的鏡像層外面掛載一層可讀寫層
4)從宿主主機配置的網橋結構中橋接一個虛擬接口到容器中
5)分配一個地址池中的IP地址給容器
6)執行用戶指定的應用程序
7)指定完畢後容器被終止運行

docker run 鏡像名 /bin/bash -c ls //創建並啟動容器指定一條shell命令
-c:指定的命令
技術分享圖片
docker ps -a //查看centos狀態,發現執行完shell命令之後停止了
技術分享圖片
docker run -d centos /bin/bash -c "while true;do echo hello;done" //創建並啟動容器,在後臺持續運行
技術分享圖片
-d:讓容器以守護形態在後臺運行,但是註意的是後臺必須要有正運行的程序,否則容器會停止。
2、容器的進入
docker exec -it 容器ID/名稱 /bin/bash //進入容器
技術分享圖片
exit或ctrl+d退出偽終端
3、容器導出和導入
docker export 容器ID/名稱 > 文件名 //容器的導出
技術分享圖片
cat 文件名 | docker import - 生成的鏡像名:標簽 //將容器文件導入成鏡像
技術分享圖片
4、容器的刪除

docker ps -a
docker rm 容器ID      //刪除容器,無法刪除正在運行的容器
docker rm -f d4e863a654aa   //強制刪除運行中的容器,不建議。
docker container prune      //刪除所有停止的容器
docker rm $(docker ps -qf status=exited)    //刪除指定狀態的容器

七、Docker的倉庫

docker login //登錄共有倉庫,通過註冊賬號登錄

八、Docker資源控制(優化)

1、限制CPU的使用速率
在Docker中可以通過--cpu-quota選項來限制CPU的使用使用率,CPU的百分比是以1000為單位的。
docker run --cpu-quota 20000 鏡像名 //CPU的使用率限定為20%
2、多任務按比例分享CPU
當由多個容器任務運行時,很難計算CPU的使用率,為了使容器合理使用CPU資源,可以通過--cpu-shares選項設置CPU按比例共享CPU資源,這種方式還可以實現CPU使用率的動態調整。
以下實現三個容器A、B、C,占用CPU資源的比列為1:1:2

docker run --cpu-shares 1024 鏡像名     //對應容器A
docker run --cpu-shares 1024 鏡像名  //對應容器B
docker run --cpu-shares 2048 鏡像名  //對應容器C

3、限制CPU內核使用
在Docker中可以使用--cpuset-cpus選項來使某些程序獨享CPU內核,以便提高其處理速度,對應的Cgroup配置文件為/sys/fs/cgroup/cpuset/docker/容器編號/cpuset.cpus。選項後直接跟參數0、1、2......表示第1個內核、第2個內核、第3個內核,與/proc/cpuinfo中的CPU編號(processer)相同。
如果服務器有16個核心,那麽CPU編號為0~15,使容器綁定第1~4個內核使用。
docker run --cpuset-cpus 0,1,2,3 鏡像名
4、對內存使用的限制
在Docker中可以通過docker run -m命令來限制容器的內存使用量,相應的Cgroup配置文件為/sys/fs/cgroup/memory/memory.limit_in_bytes。但是需要註意:一旦容器Cgroup使用的內存超過了限制的容量,Linux內核將會嘗試收回這些內存,如果仍舊沒法控制內存使用在限制範圍之內,進程就會殺死。
docker run -m 512m 鏡像名 //限制容器的內存為512M
5、對blkio的限制
如果時在一臺服務器上進行容器的混合部署,那麽會出現同時有幾個程序寫磁盤數據的情況,這時可以通過--device-write-iops選項來限制寫入的iops,相應的還有--device-read-bps選項可以限制讀取的iops。但是這種方法只能針對blkio限制的設備(device),而不是分區。相應Cgroup寫配置文件/sys/fs/cgroup/blkio/docker/容器ID/blkio.throttle.write_iops_device。
docker run --device-write-bps /dev/sda1:1mb 鏡像名 //限制/dev/sdb1的寫入iops為1MB

Docker架構、鏡像和容器