溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Docker架構(gòu)、鏡像和容器

發(fā)布時(shí)間:2020-05-13 13:56:17 來(lái)源:網(wǎng)絡(luò) 閱讀:2660 作者:居思涵 欄目:云計(jì)算

一、Docker概述

Docker是在Linux容器里面運(yùn)行的開源工具,是一種輕量級(jí)的虛擬機(jī)。其設(shè)計(jì)宗旨:Build,Ship and Run Any App,Anywhere,即通過(guò)對(duì)應(yīng)組件的封裝、發(fā)布、部署、運(yùn)行等生命周期的管理,達(dá)到組件級(jí)別的“一次封裝,到處運(yùn)行”的目的。這里的組件,既可以是一個(gè)應(yīng)用,也可以是一套服務(wù),甚至是一個(gè)完整的操作系統(tǒng)。
Docker的三大核心概念:鏡像、容器、倉(cāng)庫(kù),安裝Docker以及圍繞鏡像和容器的具體操作。

二、相比傳統(tǒng)虛擬機(jī)Dokcer的優(yōu)勢(shì)

1、Docker容器很快,啟動(dòng)和停止可以在秒級(jí)實(shí)現(xiàn),比傳統(tǒng)虛擬機(jī)要快很多。
2、Docker核心解決的問(wèn)題是利用容器來(lái)時(shí)實(shí)現(xiàn)類似VM的功能,從而以更加節(jié)省的硬件資源提供給用戶更多的計(jì)算資源,所以Docker容器除了運(yùn)行其中的應(yīng)用之外,基本不消耗額外的系統(tǒng)資源,從而在保證性能的同時(shí),減小了系統(tǒng)開銷,使得在一臺(tái)主機(jī)上同時(shí)運(yùn)行數(shù)千個(gè)Docker容器成為可能。
3、Docker操作方便,還可以通過(guò)Dockerfile配置文件支持靈活的自動(dòng)化創(chuàng)建和部署。
Docker架構(gòu)、鏡像和容器

三、Docker和傳統(tǒng)虛擬機(jī)的架構(gòu)

Docke之所以擁有眾多優(yōu)勢(shì),跟操作系統(tǒng)虛擬化自身的特點(diǎn)是分不開的。傳統(tǒng)虛擬機(jī)需要擁有額外的虛擬機(jī)管理程序。
Docker架構(gòu)、鏡像和容器

四、Docker核心概念及安裝

1、鏡像(Image)
Docker的鏡像是創(chuàng)建容器的基礎(chǔ),類似虛擬機(jī)的快照,可以理解為是一個(gè)面向Docker容器引擎的只讀模板,比如:一個(gè)鏡像可以是一個(gè)完整的CentOS操作系統(tǒng)環(huán)境,成為一個(gè)CentOS鏡像;可以是一個(gè)安裝了MySQL的應(yīng)用程序,稱之為一個(gè)MySQL鏡像等等。
Docker提供了簡(jiǎn)單的機(jī)制來(lái)創(chuàng)建和更新現(xiàn)有的鏡像,用戶也可以從網(wǎng)上下載已經(jīng)做好的應(yīng)用鏡像來(lái)直接使用。
2、容器(container)
Docker的容器是從鏡像創(chuàng)建的運(yùn)行實(shí)列,它可以被啟動(dòng)、停止和刪除。所創(chuàng)建的每一個(gè)容器都是相互隔離、互補(bǔ)可見(jiàn)的,可以保證平臺(tái)的安全性。還可以把容器看作是一個(gè)簡(jiǎn)易版的Linux環(huán)境,Docker利用容器來(lái)運(yùn)行和隔離應(yīng)用。
3、倉(cāng)庫(kù)(Repository)
Docker倉(cāng)庫(kù)是用來(lái)集中保存鏡像的地方,當(dāng)創(chuàng)建了自己的鏡像之后,可以使用push命令將它上傳到公共倉(cāng)庫(kù)(Pulic)或者私有倉(cāng)庫(kù)(Private),這樣一來(lái)當(dāng)下次要在另一臺(tái)機(jī)器上使用這個(gè)鏡像的時(shí)候,只需要從倉(cāng)庫(kù)上pull下來(lái)就可以了。
倉(cāng)庫(kù)注冊(cè)服務(wù)器(Registry)是存放倉(cāng)庫(kù)的地方,其中包含了多個(gè)倉(cāng)庫(kù),每個(gè)倉(cāng)庫(kù)幾種存放某一類鏡像,并且使用不同的標(biāo)簽來(lái)區(qū)分它們。目前最大的公共倉(cāng)庫(kù)是DockerHUb,其中存放了數(shù)量龐大的鏡像供用戶下載使用。

4、Docker的安裝
vi /etc/yum.repos.d/CentOS-Base.repo //配置yum源
在末行添加以下內(nèi)容:
[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     //開機(jī)自啟
systemctl start docker      //啟動(dòng)docker

五、Docker鏡像操作

Docker運(yùn)行容器前需要本地存在對(duì)應(yīng)的鏡像,如果不存在本地鏡像Docker就會(huì)嘗試從默認(rèn)鏡像倉(cāng)庫(kù)https://hub.docker.com 下載,這是由Docker官方維護(hù)的一個(gè)公共倉(cāng)庫(kù),可以滿足用戶的絕大部分需求。用戶也可以通過(guò)配置來(lái)使用自定義的鏡像倉(cāng)庫(kù)。
1、搜索鏡像(默認(rèn)從Docker Hub查詢)
獲取鏡像的三種方式:
1)下載鏡像(默認(rèn)從Docker Hub下載)
2)把容器轉(zhuǎn)換為鏡像
3)制作鏡像(通過(guò)dockerfile生成鏡像)
docker search httpd //查找所有httpd相關(guān)的鏡像
Docker架構(gòu)、鏡像和容器
2、下載鏡像(默認(rèn)從Docker Hub下載)
docker pull httpd //拉取apache鏡像
Docker架構(gòu)、鏡像和容器
3、查看鏡像
docker images //查看本地鏡像列表
Docker架構(gòu)、鏡像和容器
各個(gè)選項(xiàng)說(shuō)明:
REPOSITORY:表示鏡像的倉(cāng)庫(kù)源
TAG:表示鏡像的標(biāo)簽
IMAGE ID:表示鏡像的ID
CREATED:表示鏡像創(chuàng)建時(shí)間
SIZE:表示鏡像大小

docker tag httpd apache:test //給鏡像添加新的標(biāo)簽
Docker架構(gòu)、鏡像和容器
4、刪除鏡像

docker rmi 倉(cāng)庫(kù)名:標(biāo)簽
docker rmi -f 鏡像ID  //永久刪除鏡像
docker rmi -f $(docker images | grep "none" | awk "{print \$3}")       //刪除沒(méi)有使用的鏡像

5、導(dǎo)出和導(dǎo)入鏡像

docker save -o 導(dǎo)出文件名 導(dǎo)出的鏡像
docker save -o httpd01 httpd        //導(dǎo)出鏡像

Docker架構(gòu)、鏡像和容器
docker load <導(dǎo)出的文件
Docker架構(gòu)、鏡像和容器
注意:導(dǎo)入之前要將原先的httpd鏡像刪除,否則不執(zhí)行導(dǎo)入操作
6、上傳鏡像
docker push 鏡像名稱 //上傳鏡像到共有倉(cāng)庫(kù)

六、Docker容器的操作

容器時(shí)Docker的另一個(gè)核心概念。簡(jiǎn)單說(shuō),容器時(shí)鏡像的一個(gè)運(yùn)行實(shí)例,是獨(dú)立運(yùn)行的一個(gè)或一組應(yīng)用以及他們所需的運(yùn)行環(huán)境,包括文件系統(tǒng)、系統(tǒng)類庫(kù)、shell環(huán)境等。鏡像是只讀模板,而容器會(huì)給這個(gè)只讀模板一個(gè)額外的可寫層。
1、容器的創(chuàng)建和啟動(dòng)
docker create -it httpd /bin/bash //創(chuàng)容器,默認(rèn)時(shí)沒(méi)有運(yùn)行的
-i:讓容器的輸入保持打開
-t:讓Docker分配一個(gè)偽終端

docker ps  //查看正在運(yùn)行的容器
docker ps -a    //查看所有容器

Docker架構(gòu)、鏡像和容器

docker start 容器ID   //啟動(dòng)容器
docker stop 容器ID    //停止容器

Docker架構(gòu)、鏡像和容器
創(chuàng)建并啟動(dòng)容器用docker run命令,等與先執(zhí)行docker create命令,在執(zhí)行docker start命令。
docker run來(lái)創(chuàng)建容器時(shí)過(guò)程如下:
1)首先檢查本地是否存在指定的鏡像,當(dāng)鏡像不存在時(shí),會(huì)從公共倉(cāng)庫(kù)下載
2)再利用鏡像創(chuàng)建并啟動(dòng)一個(gè)容器
3)接著分配一個(gè)文件系統(tǒng)給容器,在只讀的鏡像層外面掛載一層可讀寫層
4)從宿主主機(jī)配置的網(wǎng)橋結(jié)構(gòu)中橋接一個(gè)虛擬接口到容器中
5)分配一個(gè)地址池中的IP地址給容器
6)執(zhí)行用戶指定的應(yīng)用程序
7)指定完畢后容器被終止運(yùn)行

docker run 鏡像名 /bin/bash -c ls //創(chuàng)建并啟動(dòng)容器指定一條shell命令
-c:指定的命令
Docker架構(gòu)、鏡像和容器
docker ps -a //查看centos狀態(tài),發(fā)現(xiàn)執(zhí)行完shell命令之后停止了
Docker架構(gòu)、鏡像和容器
docker run -d centos /bin/bash -c "while true;do echo hello;done" //創(chuàng)建并啟動(dòng)容器,在后臺(tái)持續(xù)運(yùn)行
Docker架構(gòu)、鏡像和容器
-d:讓容器以守護(hù)形態(tài)在后臺(tái)運(yùn)行,但是注意的是后臺(tái)必須要有正運(yùn)行的程序,否則容器會(huì)停止。
2、容器的進(jìn)入
docker exec -it 容器ID/名稱 /bin/bash //進(jìn)入容器
Docker架構(gòu)、鏡像和容器
exit或ctrl+d退出偽終端
3、容器導(dǎo)出和導(dǎo)入
docker export 容器ID/名稱 > 文件名 //容器的導(dǎo)出
Docker架構(gòu)、鏡像和容器
cat 文件名 | docker import - 生成的鏡像名:標(biāo)簽 //將容器文件導(dǎo)入成鏡像
Docker架構(gòu)、鏡像和容器
4、容器的刪除

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

七、Docker的倉(cāng)庫(kù)

docker login //登錄共有倉(cāng)庫(kù),通過(guò)注冊(cè)賬號(hào)登錄

八、Docker資源控制(優(yōu)化)

1、限制CPU的使用速率
在Docker中可以通過(guò)--cpu-quota選項(xiàng)來(lái)限制CPU的使用使用率,CPU的百分比是以1000為單位的。
docker run --cpu-quota 20000 鏡像名 //CPU的使用率限定為20%
2、多任務(wù)按比例分享CPU
當(dāng)由多個(gè)容器任務(wù)運(yùn)行時(shí),很難計(jì)算CPU的使用率,為了使容器合理使用CPU資源,可以通過(guò)--cpu-shares選項(xiàng)設(shè)置CPU按比例共享CPU資源,這種方式還可以實(shí)現(xiàn)CPU使用率的動(dòng)態(tài)調(diào)整。
以下實(shí)現(xiàn)三個(gè)容器A、B、C,占用CPU資源的比列為1:1:2

docker run --cpu-shares 1024 鏡像名     //對(duì)應(yīng)容器A
docker run --cpu-shares 1024 鏡像名  //對(duì)應(yīng)容器B
docker run --cpu-shares 2048 鏡像名  //對(duì)應(yīng)容器C

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

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI