容器及鏡像
容器
常見的容器狀態(tài)
- running
- stopped
- paused
- created
- deleted
注意: 查看docker狀態(tài)使用的命令:
- docker ps: 查看running狀態(tài)的容器
- docker ps -a: 查看所有狀態(tài)的容器
- docker ps -qa: 查看所有容器ID
- docker stop $(docker ps -qa) : 停止所有容器
- docker rm $(docker ps -qa) : 刪除所有容器
docker run 命令的使用
常見的選項(xiàng)介紹:
--name
: 指定容器名稱
-i
: 交互式運(yùn)行和-t
一起使用,可以合成-it
使用
-t
: 允許tty
-e
: 設(shè)置容器啟動(dòng)的環(huán)境變量,例如mysql的容器啟動(dòng)需要指定-e MYSQL_ROOT_PASSWORD='12345'
等
-d
: detach,后臺(tái)運(yùn)行
--network
: 指定網(wǎng)絡(luò)
--restart
: always,
-p
: 端口映射
-v
: 指定存儲(chǔ)卷
--rm
: 運(yùn)行之后刪除,需要與-it
配合使用扳还,但是與-d
互斥
-m
: 限制最大使用內(nèi)存
--oom-kill-disable
:禁止oom
--cpus
: 限定使用的CPU容量
[root@centos7-node1 ~]# docker run --name redis -d redis:4-alpine
docker exec的使用
常見的選項(xiàng)介紹:
-d
: 后臺(tái)運(yùn)行
-e
: 指定環(huán)境變量
-it
: 交互模式
-u
: 指定用戶
-w
: 指定工作路徑
[root@centos7-node1 ~]# docker container exec redis netstat -tanlp #對(duì)容器執(zhí)行命令
[root@centos7-node1 ~]# docker exec -it redis /bin/sh
/data # redis-cli #客戶端連接redis
127.0.0.1:6379> set hello my_name_is_wanghui
OK
127.0.0.1:6379> get hello
"my_name_is_wanghui"
容器的啟停
[root@centos7-node1 ~]# docker stop redis # 未指定存儲(chǔ)卷的情況下,停止容器之后數(shù)據(jù)會(huì)丟失
[root@centos7-node1 ~]# docker start redis
其他實(shí)踐
[root@centos7-node1 ~]# docker image pull nginx:1.18-alpine
[root@centos7-node1 ~]# docker run --name web -it --rm nginx:1.18-alpine /bin/sh #推出交互模式就自動(dòng)退出并刪除容器
[root@centos7-node1 ~]# docker run --name web -d nginx:1.18-alpine
[root@centos7-node1 ~]# docker container exec web ifconfig #獲取創(chuàng)建機(jī)器的ip
[root@centos7-node1 ~]# elinks -dump 172.17.0.3 #訪問頁(yè)面
[root@centos7-node1 ~]# docker logs web -f #查看Nginx 滾動(dòng)日志
[root@centos7-node1 ~]# docker stats web #查看web這個(gè)容器運(yùn)行時(shí)資源占用情況
[root@centos7-node1 ~]# docker top web #查看web這個(gè)容器的進(jìn)程狀態(tài)
[root@centos7-node1 ~]# docker run --name c2 -it centos:7
[root@f879de456c8d /]#
[root@f879de456c8d /]# [root@centos7-node1 ~]# `ctrl+p,ctrl+q進(jìn)入后臺(tái)運(yùn)行`
[root@centos7-node1 ~]# docker ps #c2是運(yùn)行狀態(tài)的
[root@centos7-node1 ~]# docker attach c2 #進(jìn)入容器
鏡像
簡(jiǎn)介
docker鏡像含有啟動(dòng)容器時(shí)所需要的文件系統(tǒng)及其內(nèi)容,因此购岗,其用于創(chuàng)建并啟動(dòng)容器
- 采用
分層
構(gòu)建機(jī)制,最底層為bootfs,其次為rootfs- bootfs: 用于系統(tǒng)引導(dǎo)的文件系統(tǒng)门粪,包括bootloader和kernel喊积,容器啟動(dòng)完成后會(huì)被卸載,以此節(jié)約內(nèi)存資源
- rootfs: 位于bootfs之上玄妈,表現(xiàn)為docker容器的根文件系統(tǒng)
- 傳統(tǒng)模式中乾吻,在系統(tǒng)啟動(dòng)時(shí)髓梅,內(nèi)核掛載rootfs時(shí)會(huì)首先掛在為只讀
模式,完整性比肩完成之后重新掛載為讀寫模式
- docker中溶弟,rootfs由內(nèi)核掛載為只讀
模式女淑,而后通過聯(lián)合掛載
技術(shù),額外在掛載一個(gè)可寫層
docker鏡像的構(gòu)建方式
- 位于下層的鏡像稱為父鏡像辜御,最底層的是基礎(chǔ)鏡像
-
最上層為“可讀寫”層鸭你,其下的均為“只讀”層
鏡像存放的graph driver類型(文件系統(tǒng))
特點(diǎn): 分層疊加,寫時(shí)復(fù)制(COW)
此文件系統(tǒng)是建構(gòu)在底層操作系統(tǒng)文件系統(tǒng)之上用于存放鏡像的文件系統(tǒng),建議底層支持操作系統(tǒng)務(wù)必使用xfs文件系統(tǒng)
分類如下:
- Aufs: 高級(jí)多層統(tǒng)一文件系統(tǒng)
- Overlay2
- DeviceMapper(DM)
Aufs
- 用于為L(zhǎng)inux文件系統(tǒng)實(shí)現(xiàn)
聯(lián)合掛載
- aufs之前是unionFS的重新實(shí)現(xiàn)擒权,2006年由Junjiro Okjima開發(fā)
- docker最初使用aufs作為容器文件系統(tǒng)層袱巨,目前仍然作為存儲(chǔ)后端之一來支持
- aufs的競(jìng)品是overlayfs,后者在3.18內(nèi)核之后開始碳抄,被合并到linux內(nèi)核
- docker的分層鏡像愉老,除了aufs,還支持btfs剖效,devicemapper和vfs等
- ubuntu下嫉入,docker默認(rèn)的文件系統(tǒng)是aufs,而在cnetos7上璧尸,用的是devicemapper
Docker Registry
-
啟動(dòng)容器時(shí)咒林,docker daemon會(huì)試圖從本地獲取相關(guān)鏡像,本地鏡像不存在時(shí)爷光,其將從Registry中下載該鏡像并保存到本地
docker registry的分類
Registry用于保存docker鏡像垫竞,包括景象的層次結(jié)構(gòu)和元數(shù)據(jù)
用戶可以自建Registry,也可以使用官方的dockerhub
- 分類如下:
- Sponsor Restory:第三方的registry蛀序,供客戶和docker社區(qū)使用
- Mirror Registry:第三方的registry欢瞪,只供客戶使用
- Vendor Registry: 由發(fā)布Docker鏡像的供應(yīng)商提供的Registry
- Private Registry:通過舍友防火墻和額外安全層的私有實(shí)體提供的Registry
Docker Registry的組成
-
Repostory
- 由特定的docker鏡像的所有迭代版本組成的鏡像倉(cāng)庫(kù)
- 一個(gè)registry可以存在多個(gè)Repostory
- Registory可以分為
頂層倉(cāng)庫(kù)
和用戶倉(cāng)庫(kù)
- 用戶倉(cāng)庫(kù)名稱更是為
用戶名/倉(cāng)庫(kù)名
- Registory可以分為
- 每個(gè)倉(cāng)庫(kù)可以包含多個(gè)
Tag
,每個(gè)Tag只對(duì)應(yīng)一個(gè)鏡像
Index: 維護(hù)用戶賬戶徐裸,鏡像的校驗(yàn)以及公共命名空間信息遣鼓,相當(dāng)于為Registry提供了一個(gè)擁護(hù)認(rèn)證和檢索的接口
鏡像的制作 與推送
docker registry中的鏡像由開發(fā)或者運(yùn)維人員制作,而后推送到“公共”或者“私有”Repostry上保存重贺,供其他人使用
例如: 部署到生產(chǎn)環(huán)境
DockerHub的使用
- 注冊(cè)DockerHub賬戶
- 創(chuàng)建
myimg
倉(cāng)庫(kù) - 上傳鏡像到dockerHub的myimg倉(cāng)庫(kù)
[root@centos7-node1]# docker pull busybox:latest
[root@centos7-node1 ~]# docker run --name b1 -it -d busybox /bin/sh
/ # mkdir /data/web/html -p
/ # echo "<h1>this is a test page @busyboxServer</h1>" > /data/web/html/index.html
[root@centos7-node1 ~]# docker container commit b1 wanghui122725501/myimg:v0.1 #另起終端打包鏡像
[root@centos7-node1 ~]# docker images #查看鏡像
REPOSITORY TAG IMAGE ID CREATED SIZE
wanghui122725501/myimg v0.1 baf6ad6a846f About a minute ago 1.22MB
[root@centos7-node1 ~]# docker run --name mybbox1 -it wanghui122725501/myimg:v0.1 #運(yùn)行容器
/ # ls /data/web/html/ #此文件已被寫入文件系統(tǒng)
[root@centos7-node1 ~]# docker login #登陸dockerhub
[root@centos7-node1 ~]# docker push wanghui122725501/myimg:v0.1 #推送鏡像
[root@centos7-node1 ~]# docker container commit -p -a "wanghui@yeecall.com" -c "CMD ['/bin/httpd -f -h /data/web/html']" b1 wanghui122725501/myimg:v0.2 #前臺(tái)運(yùn)行httpd
[root@centos7-node1 ~]# docker tag wanghui122725501/myimg:v0.2 wanghui122725501/myimg:latest
[root@centos7-node1 ~]# docker push wanghui122725501/myimg:v0.2 #鏡像推送
-----另起終端譬正,進(jìn)入b1容器
[root@centos7-node1 ~]# docker exec -it b1 sh
/ # /bin/httpd -f -h /data/web/html/ #執(zhí)行httpd
[root@centos7-node1 ~]# curl 172.17.0.5 #另起終端執(zhí)行
<h1>this is a test page @busyboxServer</h1>
[root@centos7-node1 ~]# docker commit -p -a "wanghui@yeecall.com" -c 'CMD ["/bin/sh","-c","/bin/httpd -f -h /data/web/html"]' b1 wanghui122725501/myimg:v0.4
[root@centos7-node1 ~]# docker run --name mytinyweb2 -d wanghui122725501/myimg:v0.4