Docker学习,理论知识,第三天–DockerFile
一、DockerFile解析
1、DockerFile是什么
DockerFile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
构建三步骤:1、手动编写一个DockerFile文件2、docker build,获得一个自定义的镜像3、docker run
2、DockerFile构建过程解析
基础知识:2.1》、每条保留字指令都必须为大写字母,且后面要跟随至少一个参数2.2》、知名按照从上到下,顺序执行2.3》、#表示注释2.4》、每条指令都会创建一个新的镜像层,并对镜像进行提交大致执行流程:2.1》、docker从基础镜像运行一个容器(一定会有一个基础镜像)2.2》、执行一条指令并对容器做出修改2.3》、执行类似docker commit的操作提交一个新的镜像层2.4》、docker再基于刚提交的镜像运行一个新容器2.5》、执行dockerfile中的下一条指令到所有制令都执行完成
①、dockerfile是软件原材料build>②、docker镜像是软件的交付品==run=>③、docker容器则是软件的一个运行状态
3、DockerFile保留字指令
3.1》、FROM 基础镜像,当前新的镜像是基于那个镜像的FROM scratch
3.2》、MAINTAINER 镜像维护者的姓名和邮箱地址MAINTAINER The CentOs Project <james_taylor@126.com>
3.3》、RUN 容器构建的时候需要运行的命令RUN groupadd -r redis && useradd -r -g redis redis
3.4》、EXPOSE 当前容器对外暴露出的端口EXPOSE 6379
3.5》、WORKDIR 制定在创建容器后,终端默认登录进来的工作目录,一个落脚点WORKDIR /data
3.6》、ENV 用来在构建镜像的过程中设置环境变量ENV MY_PATH /usr/mytest(这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前制定了环境变量前缀一样,也可以在其他指令中直接使用这些环境变量,如 WORKDIR $MY_PATH)3.7》、ADD 将宿主机目录下的文件拷贝进镜像且ADD命令自动处理URL和解压tar压缩包 ADD centos-7-docker.tar.xz (COPY直接拷贝,ADD拷贝+解压缩)
3.8》、COPY 类似ADD,拷贝文件和目录到镜像中 COPY src desc 或 COPY["src","desc"]
3.9》、VOLUME 容器数据卷,用于数据保存和持久化[HOST和容器目录文件映射]VOLUME myFile:myFileContainer
3.10》、CMD 指定一个容器启动时要运行的命令(DockerFile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换)shell格式: CMD <命令>exec格式: CMD ["可执行文件","参数1","参数2"](即 docker run -it centos /bin/bash 会覆盖dockerfile文件中的CMD 命令)
3.11》、ENTRYPOINT 指定一个容器启动时要运行的命令(EBTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数)(和CMD不同的是,CMD会被覆盖,ENTRYPOINT会被追加)
3.12》、ONBUILD 当构建一个被继承的DockerFile时运行命令,父镜像在被子继承后,父镜像的onbuild被触发ONBUILD RUN echo "hello...world"(类似于触发器,只要有子镜像继承了‘我’,就会处罚这条命令)
3.13》、LABEL 标签
4、DockerFile自定义镜像myCentOS
Base镜像scratch,DockerHub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的
需求:修改centos登录后的默认路径、支持vim编辑器、支持ip addr查看网络配置代码:4.1、创建mycentos DockerFile文件FROM centos ##本地centos镜像MAINTAINER mycentosmlee<james_taylor@126.com> ##作者介绍ENV MYPATH /usr/local ##设置变量WORKDIR $MYPATH ##默认登录后进入tmp路径RUN yum -y install vim ##安装vimRUN yum -y install net-tools ##安装网络适配器EXPOSE 80 ##对外暴露端口80CMD echo $MYPATH ##输出 mypathCMD echo "success.....ok" ##输出 success。。。okCMD /bin/bash ##运行/bin/bash4.2、构建 docker build -f dockerfile文件路径 -t 新镜像的名字:TAG . (TAG版本号.当前目录)4.3、docker images 查看新创建的镜像4.4、docker run -it mycentos:1.3 (检测目录 ip addr vim)4.5、docker history 镜像ID 列出镜像的变更历史
5、DockerFile 的 CMD和ENTERPOINT命令案例
都是指定一个容器启动时要运行的命令
回忆:
3.10》、CMD 指定一个容器启动时要运行的命令(DockerFile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换)shell格式: CMD <命令>exec格式: CMD ["可执行文件","参数1","参数2"](即 docker run -it centos /bin/bash 会覆盖dockerfile文件中的CMD 命令)
3.11》、ENTRYPOINT 指定一个容器启动时要运行的命令(EBTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数)(和CMD不同的是,CMD会被覆盖,ENTRYPOINT会被追加)
案例:
CMD
在hub.docker.com中tomcat dockerfile文件的最后有一句话:CMD ["catalina.sh", "run"] ##启动tomcat
我们测试 docker run -it tomcat ls -l 会发现列出了/usr/local/tomcat的目录列表
docker ps 发现tomcat没有运行,证明CMD ["catalina.sh", "run"]没有被执行,而是执行了ls -l
ENTERPOINT
先测试下这个:
curl http://ip.cn 会将该网址的页面信息输出
curl -s http://ip.cn
curl -s -i http://ip.cn1)、创建myCurlDockerFile文件,内容:FROM centosRUN yum -y install curlCMD ["curl","-s","http://ip.cn"]
2)、build文件生成镜像docker build -f myCurlDockerFile -t myip .
3)、run镜像docker run -it myip
4)、测试 curl -s -i http://ip.cn
5)、测试 增加一个 -i 的参数docker run -it myip -i类似 在CMD ["curl","-s","http://ip.cn"]后增加了一行CMD -i
6)、将CMD 变成ENTERPOINTFROM centosRUN yum -y install curlENTERPOINT ["curl","-s","http://ip.cn"]
7)、build文件生成镜像docker build -f myCurlDockerFile2 -t myip2 .
8)、run镜像docker run -it myip2
9)、run镜像docker run -it myip2 -i类似在ENTERPOINT ["curl","-s","http://ip.cn"]中增加了参数ENTERPOINT ["curl","-s","-i","http://ip.cn"]
6、DockerFile的ONBUILD命令案例
3.12》、ONBUILD 当构建一个被继承的DockerFile时运行命令,父镜像在被子继承后,父镜像的ONBUILD被触发
案例:
1、创建myonbuild文件FROM centosRUN yum -y install curlENTERPOINT ["curl","-s","http://ip.cn"]ONBILD RUN echo "hello...world"
2、build生成镜像并rundocker build -f myonbuild -t myip_father .docker imagesdocker run myip_father
3、创建myonbuild2文件FROM myip_fatherRUN yum -y install curlCMD ["curl","-s","http://ip.cn"]
4、build生成镜像并rundocker build -f myonbuild -t myip_son .docker imagesdocker run myip_son