一、Docker的架構(gòu)和底層技術(shù)
1.Docker Platform(平臺(tái))
- Docker提供了一個(gè)開發(fā)、打包、運(yùn)行App(應(yīng)用application)的平臺(tái)
- 把a(bǔ)pp和底層infrastructure(基礎(chǔ)設(shè)備)隔離開來(lái)
2.Docker Engine
2.1 組成
- 后臺(tái)進(jìn)程(dockerd)
- 用于一些后臺(tái)的操作,如image、container、網(wǎng)絡(luò)及存儲(chǔ)的管理
- REST API Server
- 用于dockerd和docker之間通信的接口服務(wù)
- CLI接口(docker)運(yùn)行docker version命令是顯示的client 版本和server engine版本,client和server之間是一個(gè)cs架構(gòu)的
- 運(yùn)行docker version命令可以看到客戶端版本與服務(wù)端engine版本,查找docker進(jìn)程可以看到后臺(tái)是執(zhí)行的dockerd進(jìn)程
3.Docker Architecture(架構(gòu))
4.底層技術(shù)支持
Namespaces:做隔離pid?.NET、ipc、mnt、uts
Control groups:做資源限制
Union file systems:Container和image的分層
二、Docker Image(鏡像)
1.概述
- 文件和meta data的集合(root filesystem)
- 分層的,并且每一層都可以添加改變刪除文件,成為一個(gè)新的image
- 不同的image可以共享相同的layer(層)
- image本身是read-only(只讀)
- 查看本地存在的image
docker image ls
2.獲取image的第一種方式
Build from Dockerfile
Docker提供一個(gè)配置文件Dockerfile,就好比之前博主使用Vagrant工具時(shí)的Vagrantfile文件一樣,通過(guò)Dockerfile文件就可以去定義一個(gè)docker image鏡像,build這個(gè)dockerfile文件就可以構(gòu)建出一個(gè)image鏡像
- 在cdtaogang目錄下創(chuàng)建dockerfile文件,內(nèi)容如下
- 執(zhí)行docker build命令進(jìn)行構(gòu)建鏡像,-t 鏡像名稱,后面的.是表示當(dāng)前dockerfile路徑
docker build -t cdtaogang123/redis:latest .
- 提示如下超時(shí),docker安裝后默認(rèn)沒(méi)有daemon.json這個(gè)配置文件,需要進(jìn)行手動(dòng)創(chuàng)建,配置文件的默認(rèn)路徑:/etc/docker/daemon.json,在阿里云中復(fù)制加速器地址,進(jìn)行添加
{
"registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]
}
- 重啟生效
sudo systemctl daemon-reload
sudo systemctl restart docker
- 再次build構(gòu)建,顯示成功
- 在執(zhí)行build構(gòu)建時(shí),dockerfile文件中每一行代碼都表示一個(gè)步驟,一共有7行代碼,所以build時(shí),會(huì)顯示執(zhí)行這7個(gè)步驟
- 此時(shí)查看本地image鏡像就可以看到以上創(chuàng)建的鏡像了
3.獲取image的第二種方式
Pull from Registry
類似github 倉(cāng)庫(kù),可以git clone拉取倉(cāng)庫(kù)的文件,也可以將文件push到倉(cāng)庫(kù)中,那么docker pull則是在docker hub上去拉取你要的鏡像
- 在docker hub網(wǎng)站上查看image基礎(chǔ)鏡像
- 如點(diǎn)擊centos進(jìn)入后,選擇tags標(biāo)簽,可以看到很多版本的centos鏡像,對(duì)應(yīng)有拉取命令
- 博主拉取一個(gè)centos8鏡像,鏡像名后面不跟版本則表示拉取latest最新的
docker pull centos:centos8
- 除了官方提供的images鏡像外,還有第三方的鏡像(個(gè)人的或者公司的),比如搜索wordPress/ target=_blank class=infotextkey>WordPress第一個(gè)標(biāo)記Official的則表示官方提供的,如下這種用戶名/wordpress的image則表示是個(gè)人或者公司的
- 拉取這個(gè)人的wordpress images,由于文件比較多,博主這里就不繼續(xù)下載了
4.如何制作一個(gè)Base Image
- 說(shuō)明一點(diǎn),博主之前在執(zhí)行docker命令時(shí)是在root用戶下執(zhí)行的,如博主exit退出root用戶,使用cdtaogang用戶那么每次執(zhí)行命名docker命令都需要加上sudo就比較麻煩,不添加sudo則會(huì)提示權(quán)限不夠
- 將當(dāng)前cdtaogang用戶添加到docker用戶組中,然后重啟docker服務(wù),執(zhí)行docker image ls命令結(jié)果還是提示權(quán)限不夠
- 原因是,需要xshell重新遠(yuǎn)程連接centos即可
- 回到正軌,之前博主在centos虛擬機(jī)中安裝docker時(shí),拉取過(guò)hello-world基礎(chǔ)鏡像,在這個(gè)base image中其實(shí)存在一個(gè)可執(zhí)行文件,通過(guò)docker run 執(zhí)行這個(gè)hello-world基礎(chǔ)鏡像就會(huì)創(chuàng)建一個(gè)容器并運(yùn)行這個(gè)容器,打印出如下hello from docker這一段話
- 現(xiàn)在就模擬hello-world做一個(gè)基礎(chǔ)鏡像,就需要hello world程序,可以通過(guò)C語(yǔ)言編寫一個(gè)hello world 將這個(gè)hello world編譯成一個(gè)可執(zhí)行的二進(jìn)制文件
mkdir hello-world
cd hello-world
vi hello.c
- 編譯c語(yǔ)言腳本,需要安裝gcc
sudo yum install gcc
sudo yum install glibc-static
- 編譯hello.c文件輸出為hello可執(zhí)行文件,執(zhí)行hello文件,成功打印
- 通過(guò)dockerfile把這個(gè)可執(zhí)行文件打成docker image,在hello-world目錄創(chuàng)建dockerfile文件,因?yàn)槭俏覀冏约簞?chuàng)建基礎(chǔ)鏡像,所以FROM字段不以任何鏡像為基礎(chǔ),寫法為FROM scratch,之前創(chuàng)建的dockerfile文件中FROM字段指定以u(píng)buntu:14.04為基礎(chǔ)鏡像,具體配置如下
- 構(gòu)建dockerfile文件,生成tag為cdtaogang/hello-world的image
- 對(duì)比cdtaogang/hello-world鏡像與hello-world文件中的hello可執(zhí)行文件大小,差距很小,幾乎是基于hello可執(zhí)行文件的大小下創(chuàng)建的image
- 通過(guò)docker history <image id>,查看構(gòu)建的cdtaogang/hello-world鏡像的分層情況,第一層是執(zhí)行hello文件,第二層這是添加文件到指定路徑,因?yàn)镕ROM 沒(méi)有指定基礎(chǔ)鏡像所以該層不顯示
- 創(chuàng)建并執(zhí)行容器
三、Container(容器)
1.什么是Container
- 通過(guò)Image創(chuàng)建(copy)
- 在Image layer之上建立一個(gè)container layer(可讀寫)
- 類比面向?qū)ο螅侯悾╥mage)和實(shí)例(container)
- Image負(fù)責(zé)app的存儲(chǔ)和分發(fā),Container負(fù)責(zé)運(yùn)行app
2.運(yùn)行容器
- 執(zhí)行docker container ls命令可以查看當(dāng)前正在運(yùn)行的容器,目前是沒(méi)有容器正在運(yùn)行,因?yàn)閳?zhí)行docker run命令后,創(chuàng)建并運(yùn)行容器后,會(huì)退出,那么通過(guò)docker container ls -a命令列舉出來(lái)所有的容器包括運(yùn)行或者退出的,可以到看到cdtaogang/hello-world鏡像創(chuàng)建的容器是已退出狀態(tài)
- 創(chuàng)建并運(yùn)行centos:centos8鏡像的容器,同理也是在容器運(yùn)行后就自動(dòng)退出了
3.交互式運(yùn)行容器
- 在docker run 添加-it交互式運(yùn)行命令,可以看到命令運(yùn)行成功會(huì)進(jìn)入到一個(gè)系統(tǒng)里面
- 在另一個(gè)終端中,執(zhí)行docker container ls就能看到我們剛交互式運(yùn)行的容器沒(méi)有退出,可以發(fā)現(xiàn)上面進(jìn)入的系統(tǒng)其實(shí)就是容器的ID,所以交互式運(yùn)行容器就是指創(chuàng)建并進(jìn)入到容器中
- 在容器中,因?yàn)殓R像是centos的,所以可以執(zhí)行yum命令
- 那么退出容器,在執(zhí)行docker container ls命令查看正在運(yùn)行的容器則不會(huì)顯示該容器了,而執(zhí)行docker container ls -a 則會(huì)顯示剛剛退出的容器
4.Docker和Docker Image簡(jiǎn)寫命令及Container命令
- 首先在命令行輸入docker回車,查看docker所有命令,可見分為Management Commands(管理命令)和Commands(命令)
- 查看正在運(yùn)行的容器及所有的容器
docker container ls >> docker ps
docker container ls -a >> docker ps -a
- 比如刪除一個(gè)容器,使用docker container rm命令,可以輸入docker container命令回車,查看能執(zhí)行的命令
- 刪除容器簡(jiǎn)寫命令,因?yàn)閐ocker rm命令默認(rèn)是刪除容器所以可以直接用
docker container rm >> docker rm
- 執(zhí)行docker rm container id,這個(gè)id可以不寫全,但是需要保證你輸入的簡(jiǎn)寫id是唯一的
- 輸入docker image查看可以執(zhí)行的命令
- 查看所有的image鏡像
docker image ls >> docker images
- 刪除鏡像
docker image rm >> docker rmi
- 一次性刪除所有的容器,首先運(yùn)行5個(gè)容器,然后查看所有的容器(已退出)
- 首先通過(guò)docker ps -aq 列舉出所有的容器ID
docker ps -aq
- 然后直接rm命令刪除列舉出所有的容器ID來(lái)刪除所有容器,需要使用$將以上命令當(dāng)成一個(gè)結(jié)果進(jìn)行刪除
docker rm $(docker ps -aq)
- 如果所有的容器中存在正在運(yùn)行的容器以及已退出的容器,我只刪除已退出的容器,這種場(chǎng)景如何實(shí)現(xiàn)
- 實(shí)現(xiàn)以上的場(chǎng)景,首先需要獲取到所有容器中已退出的容器ID,通過(guò)-f 篩選出容器狀態(tài)status=exited已退出的容器,加上-q參數(shù)則表示列舉出容器ID,最后$包住結(jié)果,執(zhí)行docker rm刪除即可,成功實(shí)現(xiàn)只刪除已退出的容器
四、構(gòu)建自己的Docker Image
1.docker container commit(docker commit)
1.1 交互式運(yùn)行容器
- 交互式運(yùn)行centos容器,在容器中并沒(méi)有安裝vim命令,進(jìn)行安裝vim工具
- exit退出容器,查看所有容器,顯示交互式運(yùn)行的容器已退出
1.2 將容器commit成一個(gè)image
說(shuō)明:上一步在容器中安裝了vim并退出了容器,那么在已退出的容器中可以看到該容器,現(xiàn)在則需要將這個(gè)容器commit成一個(gè)鏡像,這個(gè)鏡像是基于centos8基礎(chǔ)鏡像的,但是跟centos8基礎(chǔ)基礎(chǔ)鏡像不一樣的是它安裝了vim
- 通過(guò)docker container commit命令實(shí)現(xiàn)將容器提交成image,命令可以簡(jiǎn)寫成docker commit
- 執(zhí)行如下命令,生成image鏡像,
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
docker commit stupefied_fermat cdtaogang/centos-vim:centos8
- 查看生成的image
- 對(duì)比基礎(chǔ)image和自己構(gòu)建的image分層情況,很明顯比基礎(chǔ)centos8鏡像多了一層,那就是安裝vim命令
以上創(chuàng)建image的方式不提倡使用,因?yàn)槿绻l(fā)布該image,用戶拿到該image是不知道該image是如何構(gòu)建的,并且這種方式構(gòu)建image很有可能把不安全的東西放到image里面發(fā)布出去,即該image肯定是不安全的
2.docker image build(docker build)
2.1 創(chuàng)建dockerfile
- 首先將上一步中commit容器生成的image刪除
- 在上一級(jí)目錄下創(chuàng)建一個(gè)目錄,進(jìn)入目錄創(chuàng)建并編輯dockerfile文件
- dockerfile內(nèi)容如下,指定基礎(chǔ)鏡像為centos:centos8版本,在基礎(chǔ)鏡像中運(yùn)行安裝vim命令
2.2 通過(guò)dockerfile構(gòu)建出image
- 執(zhí)行docker build命令以當(dāng)前路徑下的dockerfile構(gòu)建出
- 查看構(gòu)建的image
通過(guò)dockerfile構(gòu)建鏡像和commit容器生成的鏡像差不多,但建議使用dockerfile構(gòu)建image,這樣的話只需要分享dockerfile這個(gè)文件給別人就可以了,別人通過(guò)你分享的dockerfile文件就能構(gòu)建出跟你一樣的image






