docker 4 section
鏡像和容器的關(guān)系:
鏡像是容器的基礎(chǔ),每次執(zhí)行 docker run 的時(shí)候都會(huì)指定哪個(gè)鏡像作為容器運(yùn)行的基礎(chǔ)。
我們可以使用的都是來自于 Docker Hub 的鏡像。直接使用這些鏡像是可以滿足一定的需求,而當(dāng)這些鏡像無法直接滿足需求時(shí),我們就需要定制這些鏡像。
鏡像是多層存儲(chǔ),每一層是在前一層的基礎(chǔ)上進(jìn)行的修改;而容器同樣也是多層存儲(chǔ),是在以鏡像為基礎(chǔ)層,在其基礎(chǔ)上加一層作為容器運(yùn)行時(shí)的存儲(chǔ)層。
定制一個(gè)WEB服務(wù)器為例,來理解鏡像時(shí)如何構(gòu)建完成的:
$ docker run --name webserver -d -p 80:80 nginx
這條命令會(huì)用 nginx 鏡像啟動(dòng)一個(gè)容器,命名為 webserver ,并且映射了 80 端口,這樣就可以用瀏覽器去訪問這個(gè) nginx 服務(wù)器。
現(xiàn)在,假設(shè)我們自定義頁面,我們可以使用docker exec 命令進(jìn)入容器,修改其內(nèi)容:
$ docker exec -it webserver bash root@3729b97e8226:/# echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html root@3729b97e8226:/# exit exit再次訪問:
修改了容器的文件,也就是改動(dòng)了容器的存儲(chǔ)層。可以通過 docker diff 命令看到具體的改動(dòng):
[root@work volumes]# docker diff webserver C /root A /root/.bash_history C /run A /run/nginx.pid D /run/secrets C /usr C /usr/share C /usr/share/nginx/html C /usr/share/nginx/html/index.html C /var C /var/cache C /var/cache/nginx D /var/cache/nginx/client_temp D /var/cache/nginx/fastcgi_temp D /var/cache/nginx/proxy_temp D /var/cache/nginx/scgi_temp D /var/cache/nginx/uwsgi_temp保存鏡像:
Docker 提供了一個(gè) docker commit 命令,可以將容器的存儲(chǔ)層保存下來成為鏡像。換句話說,就是在原有鏡像的基礎(chǔ)上,再疊加上容器的存儲(chǔ)層,并構(gòu)成新的鏡像。以后我們運(yùn)行這個(gè)新鏡像的時(shí)候,就會(huì)擁有原有容器最后的文件變化。
docker commit 的語法格式為:
docker commit [選項(xiàng)] <容器ID或容器名> [<倉庫名>[:<標(biāo)簽>]]
可以用 docker images 中看到這個(gè)新定制的鏡像:
[root@work ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx v2 a7a2e8ca8062 About a minute ago 109 MB docker.io/centos latest 9f38484d220f 34 hours ago 202 MB docker.io/nginx latest 881bd08c0b08 11 days ago 109 MB可以用 docker history 具體查看鏡像內(nèi)的歷史記錄,如果比較 nginx:latest 的歷史記錄,會(huì)發(fā)現(xiàn)新增了剛剛提交的這一層。
[root@work ~]# docker history nginx:v2 IMAGE CREATED CREATED BY SIZE COMMENT a7a2e8ca8062 2 minutes ago nginx -g daemon off; 97 B 881bd08c0b08 11 days ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daem... 0 B <missing> 11 days ago /bin/sh -c #(nop) STOPSIGNAL SIGTERM 0 B <missing> 11 days ago /bin/sh -c #(nop) EXPOSE 80 0 B <missing> 11 days ago /bin/sh -c ln -sf /dev/stdout /var/log/ngi... 22 B <missing> 11 days ago /bin/sh -c set -x && apt-get update && a... 54 MB <missing> 11 days ago /bin/sh -c #(nop) ENV NJS_VERSION=1.15.9.... 0 B <missing> 11 days ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.15.... 0 B <missing> 11 days ago /bin/sh -c #(nop) LABEL maintainer=NGINX ... 0 B <missing> 11 days ago /bin/sh -c #(nop) CMD ["bash"] 0 B <missing> 11 days ago /bin/sh -c #(nop) ADD file:5ea7dfe8c8bc87e... 55.3 MB新的鏡像定制好后,我們可以來運(yùn)行這個(gè)鏡像。
docker run --name web2 -d -p 81:80 nginx:v2
這里命名為新的服務(wù)為 web2 ,并且映射到 81 端口。
至此,第一次完成了定制鏡像,使用的是 docker commit 命令,手動(dòng)操作給舊的鏡像添加了新的一層,形成新的鏡像,對(duì)鏡像多層存儲(chǔ)應(yīng)該有了更直觀的感覺。
鏡像大小信息只是表示該鏡像的邏輯體積大小,實(shí)際上由于相同的鏡像層本地指揮存儲(chǔ)一份,物理上占用的存儲(chǔ)空間會(huì)小于各鏡像的邏輯體積之和。
慎用 docker commit:
使用 docker commit 命令雖然可以比較直觀的幫助理解鏡像分層存儲(chǔ)的概念,但是實(shí)際環(huán)境中并不會(huì)這樣使用。
首先,如果仔細(xì)觀察之前的 docker diff webserver 的結(jié)果,你會(huì)發(fā)現(xiàn)除了真正想要修改的 /usr/share/nginx/html/index.html 文件外,由于命令的執(zhí)行,還有很多文件被改動(dòng)或添加了。這還僅僅是最簡單的操作,如果是安裝軟件包、編譯構(gòu)建,那會(huì)有大量的無關(guān)內(nèi)容被添加進(jìn)來,如果不小心清理,將會(huì)導(dǎo)致鏡像極為臃腫。
此外,使用 docker commit 意味著所有對(duì)鏡像的操作都是黑箱操作,生成的鏡像也被稱為黑箱鏡像,換句話說,就是除了制作鏡像的人知道執(zhí)行過什么命令、怎么生成的鏡像,別人根本無從得知。而且,即使是這個(gè)制作鏡像的人,過一段時(shí)間后也無法記清具體在操作的。雖然 docker diff 或許可以告訴得到一些線索,但是遠(yuǎn)遠(yuǎn)不到可以確保生成一致鏡像的地步。這種黑箱鏡像的維護(hù)工作是非常痛苦的。
而且,回顧之前提及的鏡像所使用的分層存儲(chǔ)的概念,除當(dāng)前層外,之前的每一層都是不會(huì)發(fā)生改變的,換句話說,任何修改的結(jié)果僅僅是在當(dāng)前層進(jìn)行標(biāo)記、添加、修改,而不會(huì)改動(dòng)上一層。如果使用 docker commit 制作鏡像,以及后期修改的話,每一次修改都會(huì)讓鏡像更加臃腫一次,所刪除的上一層的東西并不會(huì)丟失,會(huì)一直如影隨形的跟著這個(gè)鏡像,即使根本無法訪問到。這會(huì)讓鏡像更加臃腫。
轉(zhuǎn)載于:https://blog.51cto.com/13581826/2364060
總結(jié)
以上是生活随笔為你收集整理的docker 4 section的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机开机显示器无显示桌面,电脑开机后显
- 下一篇: html去除分页符,Word如何取消分页