Dockerfile及新型容器鏡像構(gòu)建技術(shù)詳解
一、容器鏡像分類(lèi)
1、操作系統(tǒng)類(lèi)
centos
ubuntu
自行制作
2、應(yīng)用類(lèi)
tomcat
nginx
mysql
redis
二、容器鏡像獲取方法
1、在dockerhub直接下載
docker pull centos:latest
2、把操作系統(tǒng)中文件系統(tǒng)打包為容器鏡像
3、把正在運(yùn)行的容器打包為容器鏡像,即docker commit
[root@mylinux1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ca081c0529d1 mysql:5.5 "docker-entrypoint.s…" 28 hours ago Up 2 minutes 0.0.0.0:8888->3306/tcp, :::8888->3306/tcp my_mysql [root@mylinux1 ~]# docker commit ca081c0529d1 mysql:v1.0
[root@mylinux1 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql v1.0 d404d78aa797 3 years ago 205MB
[root@mylinux1 ~]# docker run --name new_mysql -d mysql:v1.0 2fd23f7e01889fbdc74e02305c910a8d8d2ddb48f00241b83469c671d82e586f
[root@mylinux1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2fd23f7e0188 mysql:v1.0 "docker-entrypoint.s…" 4 seconds ago Up 3 seconds 3306/tcp new_mysql ca081c0529d1 mysql:5.5 "docker-entrypoint.s…" 28 hours ago Up 4 minutes 0.0.0.0:8888->3306/tcp, :::8888->3306/tcp my_mysql
4、通過(guò)dockerfile實(shí)現(xiàn)容器鏡像的自定義以及生成
三、dockerfile
1、dockerfile介紹
Dockerfile是一種能夠被Docker程序解釋的劇本。Dockerfile由一條一條的指令組成,并且有自己的書(shū)寫(xiě)格式和支持的命令。當(dāng)我們需要在容器鏡像中指定自己額外的需求時(shí),只需在Dockerfile上添加或修改指令,然后通過(guò)docker build生成我們自定義的容器鏡像(image)。
2、dockerfile指令
構(gòu)建類(lèi)指令
用于構(gòu)建image
其指定的操作不會(huì)在運(yùn)行image的容器上執(zhí)行(FROM、MAINTAINER、RUN、ENV、ADD、COPY)
設(shè)置類(lèi)指令
用于設(shè)置image屬性
其指定的操作將在運(yùn)行image的容器中執(zhí)行(CMD、ENTRYPOINT、USER、EXPORT、VOLUME、WORKDIR、ONBUILD)
FROM指令用于指定其構(gòu)建新鏡像所使用的基礎(chǔ)鏡像
FROM指令必須是Dockerfile文佳中的首條命令
FROM指令指定的基礎(chǔ)image可以是官方遠(yuǎn)程倉(cāng)庫(kù)中的,也可以位于本地倉(cāng)庫(kù)的
格式:FROM <image>:<tag>
例如:FROM centos:latest
RUN指令用于構(gòu)建鏡像中執(zhí)行命令,有以下兩種格式
注意:按優(yōu)化的角度來(lái)講:當(dāng)有多條要執(zhí)行的命令,不要使用多條RUN,盡量使用&&符號(hào)與\符號(hào)連接成一行。因?yàn)槎鄺lRUN命令會(huì)讓鏡像建立多層
(總之就是會(huì)變得臃腫了)。
CMD:不同于RUN,CMD用于指定在容器啟動(dòng)時(shí)所要執(zhí)行的命令,而RUN用于指定鏡像構(gòu)建時(shí)所要執(zhí)行的命令
每個(gè)Dockerfile只能有一條CMD命令。如果指定了多條命令,只有最后一條會(huì)被執(zhí)行。
如果用戶(hù)啟動(dòng)容器時(shí)候指定了運(yùn)行的命令,則會(huì)覆蓋掉CMD指定的命令。
EXPORT:用于指定容器在運(yùn)行時(shí)監(jiān)聽(tīng)的端口
ENV:用于指定一個(gè)環(huán)境變量
ADD:用于把宿主機(jī)上的文件拷貝到鏡像中
COPY:與ADD指令類(lèi)似,但是COPY的源文件只能時(shí)本地文件
ENTRYPOINT:與CMD非常類(lèi)似
VOLUME:用于把宿主機(jī)里的目錄與容器里的目錄映射
只指定掛載點(diǎn),docker宿主機(jī)映射的目錄為自動(dòng)生成的
3、dockerfile基本組成
基礎(chǔ)鏡像信息
維護(hù)者信息
鏡像操作指令
容器啟動(dòng)時(shí)執(zhí)行指令
4、dockerfile生成容器鏡像過(guò)程
5、dockerfile生成容器鏡像案例
dockerfile生成容器鏡像步驟
第一步:創(chuàng)建一個(gè)文件夾(目錄)
第二步:在文件夾(目錄)中創(chuàng)建Dockerfile(固定)文件并編寫(xiě),以及其他文件
第三步:使用docker build命令構(gòu)建鏡像
第四步:使用構(gòu)建的鏡像啟動(dòng)容器
6、使用Dockerfile生成Nginx容器鏡像
[root@mylinux1 dockerfile_nginx]# ls Dockerfile index.html
[root@mylinux1 dockerfile_nginx]# cat index.html nginx is running
[root@mylinux1 dockerfile_nginx]# vim Dockerfile
FROM centos:centos7 MAINTAINER "1181068365@qq.com" RUN yum -y install wget RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo RUN yum -y install nginx ADD index.html /usr/share/nginx/html/ RUN echo "daemon off;" >> /etc/nginx/nginx.conf EXPOSE 80 CMD /usr/sbin/nginx
生成鏡像
[root@mylinux1 dockerfile_nginx]# docker build -t centos7-nginx:v1.0 . [+] Building 69.6s (11/11) FINISHED => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 405B 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load metadata for docker.io/library/centos:centos7 25.6s => CACHED [1/6] FROM docker.io/library/centos:centos7@sha256:be65f488b7764ad3638f236b7b51 0.0s => [internal] load build context 0.0s => => transferring context: 114B 0.0s => [2/6] RUN yum -y install wget 15.9s => [3/6] RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.rep 1.5s => [4/6] RUN yum -y install nginx 24.3s => [5/6] ADD index.html /usr/share/nginx/html/ 0.1s => [6/6] RUN echo "daemon off;" >> /etc/nginx/nginx.conf 1.2s => exporting to image 0.8s => => exporting layers 0.8s => => writing image sha256:337b3bac42dda5f878cb671f3306f7753a0693bbddb74388663c943d51ca20 0.0s => => naming to docker.io/library/centos7-nginx:v1.0 0.0s
[root@mylinux1 dockerfile_nginx]# docker images | grep "centos7-nginx" centos7-nginx v1.0 337b3bac42dd 11 minutes ago 657MB
運(yùn)行容器
[root@mylinux1 dockerfile_nginx]# docker run -d centos7-nginx:v1.0 62b15bc281b433f213f019d7ae9f1ef0ceb2f2d6ee98972d58029f28c548b0ab
查看運(yùn)行的容器
[root@mylinux1 dockerfile_nginx]# docker inspect "62b" | address -bash: address: 未找到命令 [root@mylinux1 dockerfile_nginx]# docker inspect "62b" | grep "IPAddress" "SecondaryIPAddresses": null, "IPAddress": "172.17.0.5", "IPAddress": "172.17.0.5", [root@mylinux1 dockerfile_nginx]# curl http://172.17.0.5 nginx is running
[root@mylinux1 dockerfile_nginx]# docker inspect "62b" | address -bash: address: 未找到命令 [root@mylinux1 dockerfile_nginx]# docker inspect "62b" | grep "IPAddress" "SecondaryIPAddresses": null, "IPAddress": "172.17.0.5", "IPAddress": "172.17.0.5", [root@mylinux1 dockerfile_nginx]# curl http://172.17.0.5 nginx is running
7、Dockerfile生成容器鏡像優(yōu)化的方法
a、減少鏡像分層
Dockerfile中包含多種指令,如果涉及到部署最多使用的算是RUN命令了,使用RUN命令時(shí),不建議每次安裝都使用一條單獨(dú)的RUN命令,可
以把能夠合并安裝指令合并為一條,這樣就可以減少鏡像分層。
優(yōu)化內(nèi)容如下
b、清理無(wú)用數(shù)據(jù)
一次RUN形成新的一層,如果沒(méi)有在同一層刪除,無(wú)論文件是否最后刪除,都會(huì)帶到下一層,所以要在每一層清理對(duì)應(yīng)的殘留數(shù)據(jù),減小
鏡像大小。
把生成容器鏡像過(guò)程中部署的應(yīng)用軟件包做刪除處理
以上就是Dockerfile及新型容器鏡像構(gòu)建技術(shù)詳解的詳細(xì)內(nèi)容,更多關(guān)于Dockerfile及新型容器鏡像構(gòu)建的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Docker多個(gè)容器不能有相同端口號(hào)的處理方案
這篇文章主要介紹了Docker多個(gè)容器不能有相同端口號(hào)的處理方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03docker報(bào)錯(cuò)Container is not running問(wèn)題及解決
這篇文章主要介紹了docker報(bào)錯(cuò)Container is not running問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05Linux下Docker及portainer相關(guān)配置方法
本文以CentOS 7為例,安裝docker CE版本,docker有兩種版本,社區(qū)版本CE和企業(yè)版本EE,通過(guò)實(shí)例代碼給大家介紹了Linux下Docker及portainer相關(guān)配置方法,感興趣的朋友跟隨小編一起看看吧2019-06-06docker compose入門(mén)helloworld的詳細(xì)過(guò)程
docker-compose是基于docker的,所以我們需要先安裝docker才能使用docker-compose,接下來(lái)通過(guò)本文給大家介紹docker compose入門(mén)helloworld的過(guò)程,一起看看吧2021-09-09Docker暴露2375端口導(dǎo)致服務(wù)器被攻擊問(wèn)題及解決方法
這篇文章主要介紹了Docker暴露2375端口導(dǎo)致服務(wù)器被攻擊問(wèn)題及解決方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04如何給一個(gè)正在運(yùn)行的Docker容器動(dòng)態(tài)添加Volume
這篇文章主要介紹了如何給一個(gè)正在運(yùn)行的Docker容器動(dòng)態(tài)添加Volume,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03Docker部署Apollo的實(shí)現(xiàn)步驟
眾所周知分布式配置中心在目前也可以說(shuō)是企業(yè)中項(xiàng)目的標(biāo)配了,本文主要介紹了Docker 部署Apollo的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02.netcore 使用surging框架發(fā)布到docker
這篇文章主要介紹了netcore 使用surging框架發(fā)布到docker,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03Docker 部署開(kāi)源遠(yuǎn)程桌面工具RustDesk的使用
本文介紹了RustDesk開(kāi)源遠(yuǎn)程桌面工具的Docker部署使用方法,支持自建服務(wù)器,可實(shí)現(xiàn)安全私密的遠(yuǎn)程控制電腦,具有一定的參考價(jià)值,感興趣的可以了解一下2024-10-10Docker安裝Jenkins并部署Maven項(xiàng)目詳細(xì)教程
這篇文章主要給大家介紹了關(guān)于Docker安裝Jenkins并部署Maven項(xiàng)目的相關(guān)資料,持續(xù)集成、持續(xù)交付不僅可以提示開(kāi)發(fā)效率,還可以節(jié)省很多測(cè)試和運(yùn)維的成本,需要的朋友可以參考下2023-12-12