700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > docker学习笔记(三)镜像

docker学习笔记(三)镜像

时间:2022-06-30 10:24:06

相关推荐

docker学习笔记(三)镜像

参考:汤小洋老师的教学视频

docker学习笔记(一)【docker 介绍、卸载、安装、配置加速】

docker学习笔记(二)docker常用命令

docker学习笔记(四)使用docker搭建环境

docker学习笔记(五)如何创建自己的阿里云镜像仓库(这是版的阿里云教程)

1、镜像的分层结构

什么是镜像?

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境的软件。也就是说镜像包含了运行软件需要的环境和软件本身。比如:tomcat这个软件的运行,他需要的环境是jdk,而jdk需要的环境是系统。

镜像是分层的,是基于联合文件系统的。什么是联合文件系统

分层的好处

比如:tomcat镜像,它本身也是分层的,它里面有很多镜像层,比如jdk镜像层,centos镜像层,这些也被称为基础镜像。

分层可以共享资源,便于复用。当拉取一个镜像时,本地有这个镜像需要的基础镜像,那么它就会直接使用本地的基础镜像,而不会再去拉取一个一样的基础镜像。

镜像是只可读的,当镜像run后形成的容器才是可读写的

2、创建镜像

有时从Docker镜像仓库中下载的镜像不能满足我们的要求,此时可以基于这个镜像(基础镜像)封装一个自己的镜像。

我们创建镜像的方式有两种:

更新镜像:使用docker commit命令 将修改过的容器提交一个新的镜像构建镜像:使用docker build命令,需要创建Dockerfile文件

2.1、更新镜像 docker commit

先使用基础镜像创建一个容器,然后对镜像镜像修改,最后将容器commit为一个新的镜像运行一个镜像,以tomcat为例。

[root@iz2zedg4ylq9iqtwm11wecz ~]# docker run --name mytomcat -d -p:9800:8080 \> -v /tmp/tomcat:/usr/local/tomcat/webapps:rw c43a65faae572147f5a186b6b92a9adcd5171633740d9020d850ec656c7e9d70663025d44e4a

进入镜像

[root@iz2zedg4ylq9iqtwm11wecz ~]# docker exec -it 2147f5a186b6 /bin/bashroot@2147f5a186b6:/usr/local/tomcat#

更改tomcat容器/usr/local/tomcat/webapps/ROOT里面的index.jsp

root@2147f5a186b6:/usr/local/tomcat/webapps/ROOT# echo hello word tomcat > index.jsp root@2147f5a186b6:/usr/local/tomcat/webapps/ROOT# cat index.jsp hello word tomcat

commit容器 使它变成新的镜像

语法: docker commit -m=“描述信息” -a=“作者” 容器id容器名 命名空间/新镜像名:tag

命名空间就是公司的名字,就像Java的包名一样,一般写公司地址

[root@iz2zedg4ylq9iqtwm11wecz webapps]# docker commit -m="修改了tomcat的主页" -a="李华" 2147f5a186b6 wuyujitang.top/mytomcat:1.0.1sha256:6339f733ef6757a69a45f633dcf47272b61a4e9a78ff4cc2665a4838e5f199c6[root@iz2zedg4ylq9iqtwm11wecz webapps]# docker imagesREPOSITORYTAG IMAGE ID CREATED SIZEwuyujitang.top/mytomcat 1.0.16339f733ef67 7 seconds ago 667 MBdocker.io/tomcatlatest c43a65faae57 13 days ago 667 MBdocker.io/mysql 5.7 2c9028880e58 2 weeks ago 447 MBdocker.io/centoslatest 300e315adb2f 5 months ago 209 MB[root@iz2zedg4ylq9iqtwm11wecz webapps]#

使用自己commit的镜像

先删除之前的镜像

[root@iz2zedg4ylq9iqtwm11wecz webapps]# docker rm -f 2147f5a186b6 2147f5a186b6[root@iz2zedg4ylq9iqtwm11wecz webapps]# docker ps -aCONTAINER ID IMAGECOMMAND CREATED STATUS PORTSNAMES

[root@iz2zedg4ylq9iqtwm11wecz webapps]# docker run -d -p:9800:8080 -v /tmp/tomcat:/usr/local/tomcat/webapps:rw --name mytomcat1.0.0 6339f733ef671080e80f41aaeb7d1e2ca618a3ecfc1fc9b07c02c844fe03f2a136213e461023[root@iz2zedg4ylq9iqtwm11wecz webapps]# docker ps -aCONTAINER ID IMAGECOMMAND CREATED STATUS PORTSNAMES1080e80f41aa 6339f733ef67 "catalina.sh run" 8 seconds ago Up 8 seconds 0.0.0.0:9800->8080/tcp mytomcat1.0.0[root@iz2zedg4ylq9iqtwm11wecz webapps]# docker exec -it 1080e80f41aa /bin/bashroot@1080e80f41aa:/usr/local/tomcat# lsBUILDING.txtLICENSE README.mdRUNNING.txt conf logs tempwebapps.distCONTRIBUTING.md NOTICE RELEASE-NOTES binlib native-jni-lib webapps workroot@1080e80f41aa:/usr/local/tomcat# cd webappsroot@1080e80f41aa:/usr/local/tomcat/webapps# lsROOTroot@1080e80f41aa:/usr/local/tomcat/webapps# cd ROOT/root@1080e80f41aa:/usr/local/tomcat/webapps/ROOT# cat index.jsp hello word tomcat

2.2、创建镜像 docker build 需要先编写Dockerflie

2.2.1、创建一个Dockerfile (这里不详细展开,后面再详细介绍)

注意1、编写Dockerfile的时候不需要指定扩展名

2、Dockerfile文件不一定要命名为Dockerfile,如果命名为其他后面在build的时候需要指定文件的路径和名字

[root@iz2zedg4ylq9iqtwm11wecz tmp]# vim Dockerflie

vim的基础使用(vim 和vi是两个linux的文本编辑器,相当于win的文本编辑器。vim是vi彩色版的可以这么理解) :

1、按i进入写模式

2、按Esc退出写模式

3、退出写模式后输入:可以是光标定位到底部,以便输入命令

4、输入:wq 保存并退出

注意:复制、粘贴与win不同需要退出写模式才能进行复制、粘贴

5、复制

yy 复制游标所在的那一行(常用)

6、粘贴

p 为将已复制的数据在光标下一行贴上,P 则为贴在游标上一行!

vi/vim的基本使用

#创建的这个镜像是基于什么基础镜像的FROM tomcat# 作者MAINTAINER 123123@#执行命令RUN touch /usr/local/tomcat/webapps/aaa.txtRUN echo "hello word DockerFile! " > /usr/local/tomcat/webapps/index.jspRUN cat /usr/local/tomcat/webapps/index.jsp

2.2.2、使用Dockerfile 构建镜像

我们先查看docker build的帮助文档

docker build -f Dockerfile所在的目录/Dockerfile文件的名字 -t wuyujitng.top/mytomcat:v1Dockerfile .

注意docker build 最后面有一个点 '.'

[root@iz2zedg4ylq9iqtwm11wecz tmp]# docker build -f Dockerflie -t wuyujitng.top/mytomcat:v1Dockerfile .Sending build context to Docker daemon 249.3 kBStep 1/4 : FROM mytomcatTrying to pull repository docker.io/library/mytomcat ... repository docker.io/mytomcat not found: does not exist or no pull access[root@iz2zedg4ylq9iqtwm11wecz tmp]# vim Dockerflie [root@iz2zedg4ylq9iqtwm11wecz tmp]# docker build -f Dockerflie -t wuyujitng.top/mytomcat:v1Dockerfile .Sending build context to Docker daemon 249.3 kBStep 1/5 : FROM tomcat---> c43a65faae57Step 2/5 : MAINTAINER 123123@---> Using cache---> 2cf59b12c530Step 3/5 : RUN touch /usr/local/tomcat/webapps/aaa.txt---> Running in 3707b8b84edf---> 72b57a06347fRemoving intermediate container 3707b8b84edfStep 4/5 : RUN echo "hello word DockerFile! " > /usr/local/tomcat/webapps/index.jsp---> Running in 63e6c9c62537---> 021a54a53a7bRemoving intermediate container 63e6c9c62537Step 5/5 : RUN cat /usr/local/tomcat/webapps/index.jsp---> Running in 6162f49d9ea1hello word DockerFile! ---> f0c82b2626a9Removing intermediate container 6162f49d9ea1Successfully built f0c82b2626a9

验证创建镜像成功

[root@iz2zedg4ylq9iqtwm11wecz ~]# docker imagesREPOSITORYTAG IMAGE ID CREATED SIZEwuyujitng.top/mytomcat v1Dockerfile f0c82b2626a9 3 hours ago 667 MBwuyujitang.top/mytomcat 1.0.16339f733ef67 4 hours ago 667 MBdocker.io/tomcatlatest c43a65faae57 13 days ago 667 MBdocker.io/mysql 5.7 2c9028880e58 2 weeks ago 447 MBdocker.io/centoslatest 300e315adb2f 5 months ago 209 MB[root@iz2zedg4ylq9iqtwm11wecz ~]# docker run -d -p 9800:8080 --name mytomcat f0c82b2626a9493103395bf7d04f2fec3834c947b736eb40675ff507c61f90b08b6378511175[root@iz2zedg4ylq9iqtwm11wecz ~]# docker ps -aCONTAINER ID IMAGECOMMAND CREATED STATUS PORTSNAMES493103395bf7 f0c82b2626a9 "catalina.sh run" 26 seconds agoUp 25 seconds 0.0.0.0:9800->8080/tcp mytomcat[root@iz2zedg4ylq9iqtwm11wecz ~]# docker exec -it 493103395bf7 /bin/bashroot@493103395bf7:/usr/local/tomcat# lsBUILDING.txtLICENSE README.mdRUNNING.txt conf logs tempwebapps.distCONTRIBUTING.md NOTICE RELEASE-NOTES binlib native-jni-lib webapps workroot@493103395bf7:/usr/local/tomcat# cd webappsroot@493103395bf7:/usr/local/tomcat/webapps# lsaaa.txt index.jsproot@493103395bf7:/usr/local/tomcat/webapps# cat index.jsp hello word DockerFile! root@493103395bf7:/usr/local/tomcat/webapps# cat aaa.txt root@493103395bf7:/usr/local/tomcat/webapps#

3、Dockerfile

3.1、查看tomcat官方Dockerfile

3.2、Dockerfile简介

Dockerfile是用来构建Docker镜像的文件,是由一系列命令和参数构成的脚本Dockerfile从FROM命令开始,紧接着各种命令、参数,最终会生成一个新的镜像

3.3、Dockerfile用法

3. 3.1、语法规则

指令必须大写,且后面必须跟着参数第一条指令必须是FROM,指定Base Ilmage基础镜像指令按从上往下的顺序,依次执行每条指定都会创建一个新的镜像层并提交’#‘ 表示注释

3.3.2、常用指令

3. 4、案例

编写Dockerfile文件,这个Dockerfile的文件名为DockerFile2

[root@iz2zedg4ylq9iqtwm11wecz tmp]# lsDockerflie php-cgi-70.sockhsperfdata_root systemd-private-1834ff36204f4f2d946848661d4da1da-ntpd.service-CTDxLRhsperfdata_www tmp.INpwCFw96Tindex.jsp tmp.wc6ZL9XBpomysql.sock tomcatmysqlx.sock[root@iz2zedg4ylq9iqtwm11wecz tmp]# vi DockerFile2

DockerFile2的内容

#构建的镜像的基础镜像是FROM centos#作者MAINTAINER 123123@#配置环境变量ENV MYPATH /user/local/centos#创建这个目录 $MYPATH 指的就是上面的目录,相当于一个变量RUN mkdir -p $MYPATH#WORKDIR指定工作目录WORKDIR $MYPATH# RUN是在构建镜像的时候执行的,这个时候镜像还没有构建完成,它于CMD命令不同RUN yum -y install vimRUN yum -y install wegt#创建挂载点,也就是挂载目录#但是这里的挂载点是,没有办法直接指定挂载的宿主主机的目录的.因为当别人使用这个Dockerfile创建镜像的时候,你指定的宿主>主机不一定有这个目录。#因此,宿主主机的挂载目录是自动生成的,这里的挂载点["/data1","/data2"])是容器的挂载目录。VOLUME ["/data1","/data2"]#CMD 命令只能有一条,下面这个命令的意思是在运行镜像的时候会,执行/bin/bash个命令也就是 将/bin/bash 拼接在 docker run -it 镜像id 后面 ,变成docker run -it 镜像id /bin/bashCMD ["/bin/bash"]

构建镜像

docker build -f 指定Dockerfile文件 -t 指定镜像的命名空间/名字:版本

[root@iz2zedg4ylq9iqtwm11wecz tmp]# docker build -f DockerFile2 -t wuyujitang.top/mycentos:v1 .Sending build context to Docker daemon 250.9 kBStep 1/9 : FROM centos---> 300e315adb2fStep 2/9 : MAINTAINER 123123@---> Using cache---> 3058640b61fbStep 3/9 : ENV MYPATH /user/local/centos---> Using cache---> 8f43e6e02412Step 4/9 : RUN mkdir -p $MYPATH---> Using cache---> 2748846c43ebStep 5/9 : WORKDIR $MYPATH---> Using cache---> 5f56bbf39b9dStep 6/9 : RUN yum -y install vim---> Using cache---> ea5511dd2dc5Step 7/9 : RUN yum -y install wget---> Running in 729eecfc3d00Last metadata expiration check: 0:04:01 ago on Fri May 28 02:30:39 .Dependencies resolved.================================================================================Package Arch Version RepositorySize================================================================================Installing:wget x86_641.19.5-10.el8 appstream734 kInstalling dependencies:libpsl x86_640.20.2-6.el8 baseos 61 kpublicsuffix-list-dafsanoarch0723-1.el8baseos 56 kTransaction Summary================================================================================Install 3 PackagesTotal download size: 851 kInstalled size: 2.9 MDownloading Packages:(1/3): wget-1.19.5-10.el8.x86_64.rpm 7.9 MB/s | 734 kB00:00 (2/3): libpsl-0.20.2-6.el8.x86_64.rpm 475 kB/s | 61 kB00:00 (3/3): publicsuffix-list-dafsa-0723-1.el8.n 375 kB/s | 56 kB00:00 --------------------------------------------------------------------------------Total 723 kB/s | 851 kB00:01Running transaction checkTransaction check succeeded.Running transaction testTransaction test succeeded.Running transactionPreparing :1/1 Installing : publicsuffix-list-dafsa-0723-1.el8.noarch1/3 Installing : libpsl-0.20.2-6.el8.x86_64 2/3 Installing : wget-1.19.5-10.el8.x86_643/3 Running scriptlet: wget-1.19.5-10.el8.x86_643/3 Verifying : wget-1.19.5-10.el8.x86_641/3 Verifying : libpsl-0.20.2-6.el8.x86_64 2/3 Verifying : publicsuffix-list-dafsa-0723-1.el8.noarch3/3 Installed:libpsl-0.20.2-6.el8.x86_64 publicsuffix-list-dafsa-0723-1.el8.noarch wget-1.19.5-10.el8.x86_64 Complete!---> 1973867141c9Removing intermediate container 729eecfc3d00Step 8/9 : VOLUME /data1 /data2---> Running in 70152fec876c---> 73546869682aRemoving intermediate container 70152fec876cStep 9/9 : CMD /bin/bash---> Running in 829a7639908f---> d7af8ea722aaRemoving intermediate container 829a7639908fSuccessfully built d7af8ea722aa[root@iz2zedg4ylq9iqtwm11wecz tmp]#

运行构建好的镜像

[root@iz2zedg4ylq9iqtwm11wecz tmp]# docker run -it d7af8ea722aa[root@c737558825b8 centos]# ls #这里run后会进入在Dockerfile指定的工作目录 /user/local/centos[root@c737558825b8 centos]# cd /[root@c737558825b8 /]# lsbin data2 etc lib lost+found mnt proc run srv tmp usrdata1 dev home lib64 media opt root sbin sys user var[root@c737558825b8 /]#

使用docker history 镜像id 可以查看镜像构建的过程

[root@iz2zedg4ylq9iqtwm11wecz tmp]# docker history d7af8ea722aaIMAGECREATED CREATED BY SIZECOMMENTd7af8ea722aa 13 minutes ago/bin/sh -c #(nop) CMD ["/bin/bash"] 0 B 73546869682a 13 minutes ago/bin/sh -c #(nop) VOLUME [/data1 /data2] 0 B# 挂载点1973867141c9 13 minutes ago/bin/sh -c yum -y install wget 14.6 MB # RUN ea5511dd2dc5 17 minutes ago/bin/sh -c yum -y install vim 58 MB # RUN5f56bbf39b9d 17 minutes ago/bin/sh -c #(nop) WORKDIR /user/local/centos 0 B# 指定工作目录 2748846c43eb 17 minutes ago/bin/sh -c mkdir -p $MYPATH 0 B# 创建目录 8f43e6e02412 17 minutes ago/bin/sh -c #(nop) ENV MYPATH=/user/local/... 0 B# 环境变量 3058640b61fb 17 minutes ago/bin/sh -c #(nop) MAINTAINER 123123@0 B# 指定作者 300e315adb2f 5 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B#CMD <missing> 5 months ago /bin/sh -c #(nop) LABEL org.label-schema.... 0 B <missing> 5 months ago /bin/sh -c #(nop) ADD file:bd7a2aed6ede423... 209 MB # 这个就是FROM的基础镜像

使用docker inspect 容器id 查看容器的挂载点

"Mounts": [{"Type": "volume","Name": "c1796779949c8664303e13f936518e6a6247433b7ae95f18618e4acb18e0524f","Source": "/var/lib/docker/volumes/c1796779949c8664303e13f936518e6a6247433b7ae95f18618e4acb18e0524f/_data","Destination": "/data1","Driver": "local","Mode": "","RW": true,"Propagation": ""},{"Type": "volume","Name": "63e7872e808e3d507ada1c9feefda42252e2473f81299304b51a080c6a08c427","Source": "/var/lib/docker/volumes/63e7872e808e3d507ada1c9feefda42252e2473f81299304b51a080c6a08c427/_data","Destination": "/data2","Driver": "local","Mode": "","RW": true,"Propagation": ""}],

验证挂载点

[root@iz2zedg4ylq9iqtwm11wecz tmp]# cd /var/lib/docker/volumes/c1796779949c8664303e13f936518e6a6247433b7ae95f18618e4acb18e0524f/_data[root@iz2zedg4ylq9iqtwm11wecz _data]# ls[root@iz2zedg4ylq9iqtwm11wecz _data]# tuoch aaa.txt-bash: tuoch: command not found[root@iz2zedg4ylq9iqtwm11wecz _data]# touch aaa.txt[root@iz2zedg4ylq9iqtwm11wecz _data]# lsaaa.txt[root@iz2zedg4ylq9iqtwm11wecz _data]# docker exec -it c2b49fbba406 /bin/bash[root@c2b49fbba406 centos]# cd /data1[root@c2b49fbba406 data1]# lsaaa.txt[root@c2b49fbba406 data1]# touch 111.txt[root@c2b49fbba406 data1]# ls111.txt aaa.txt[root@c2b49fbba406 data1]# exitexit[root@iz2zedg4ylq9iqtwm11wecz _data]# ls111.txt aaa.txt[root@iz2zedg4ylq9iqtwm11wecz _data]#

3.5、CMD与ENTRYPOINT区别

一个在执行run时会被后面指定的命令覆盖,一个不会被覆盖

CMD会被覆盖,ENTRYPOINT会被覆盖

3.6、自定义tomcat

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。