03、Docker学习,理论知识,第三天--DockerFile
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 ##安装vim
RUN yum -y install net-tools ##安装网络适配器
EXPOSE 80 ##对外暴露端口80
CMD echo $MYPATH ##输出 mypath
CMD echo "success.....ok" ##输出 success。。。ok
CMD /bin/bash ##运行/bin/bash
4.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.cn
1)、创建myCurlDockerFile文件,内容:
FROM centos
RUN yum -y install curl
CMD ["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 变成ENTERPOINT
FROM centos
RUN yum -y install curl
ENTERPOINT ["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 centos
RUN yum -y install curl
ENTERPOINT ["curl","-s","http://ip.cn"]
ONBILD RUN echo "hello...world"
2、build生成镜像并run
docker build -f myonbuild -t myip_father .
docker images
docker run myip_father
3、创建myonbuild2文件
FROM myip_father
RUN yum -y install curl
CMD ["curl","-s","http://ip.cn"]
4、build生成镜像并run
docker build -f myonbuild -t myip_son .
docker images
docker run myip_son