是什么
用来构建docker镜像的构建文件。由一系列命令和参数构成的脚本。
构建三步:编写Dockerfile文件>docker build>docker run
centOS的dockerfile
FROM scratch
ADD centos-7-x86_64-docker.tar.xz /
LABEL \
org.label-schema.schema-version="1.0" \
org.label-schema.name="CentOS Base Image" \
org.label-schema.vendor="CentOS" \
org.label-schema.license="GPLv2" \
org.label-schema.build-date="20201113" \
org.opencontainers.image.title="CentOS Base Image" \
org.opencontainers.image.vendor="CentOS" \
org.opencontainers.image.licenses="GPL-2.0-only" \
org.opencontainers.image.created="2020-11-13 00:00:00+00:00"
CMD ["/bin/bash"]
DockerFile构建过程解析
Dockerfile内容基础知识
1每条保留指令都必须大写,且字母后面要跟随至少一个参数;
2指令按照从上到下,顺序执行;
3#表示注释
4每条指令都会创建一个新的镜像层,并对镜像进行提交。
Docker执行Dockerfile的大致流程
1docker从基础镜像运行一个容器
2执行一条指令并对容器做出修改
3执行类似docker commit的操作提交一个新的镜像层
4docker再基于刚提交的镜像运行一个新容器
5执行dockerfile中的下一条指令直到所有指令都指令完毕。
DockerFile的体系结构(保留指令)
FROM
基础镜像,当前镜像是来源于哪个镜像。
类似于java中的extends
MAITAINER
镜像维护者的姓名和邮箱地址
RUN
容器构建时需要运行的命令
EXPOSE
当前容器对外暴露的端口
WORKDIR
指定在创建容器后,终端默认登录进来的工作目录
ENV
用来在构建镜像过程中设置环境变量。
设置后可以在后续的任何RUN指令中使用,也可以在其他指令中直接使用这些环境变量。
ADD
拷贝+解压缩
将宿主机目录下的文件拷贝进镜像并且ADD命令会自动处理url和解压tar压缩包
COPY
宿主机目录和文件拷贝进镜像中。
将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置。
VOLUME
容器数据卷,用于数据保存和持久化工作
CMD
指定一个容器启动时要运行的命令
Dockerfile中可以有多个CMD指令,但是只有最后一个生效,CMD会被docker run只有的参数替换。
ENTRYPOINT
指定一个容器启动时要运行的命令
ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数。
ONBUILD
当构建一个被继承的Dockerfile时运行命令,父镜像在被子镜像继承后,父镜像的onbuild被触发。
案例
Base镜像scratch
Docker Hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的。
自定义镜像mycentos
编写DockerFile
FROM centos
ENV workpath /tmp
WORKDIR $workpath
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD /bin/bash
构建
docker build -t 新镜像名:TAG .
运行
docker run
列出镜像的变更历史
docker history
CMD/ENTRYPOINT镜像案例
FROM centos
RUN yum install -y curl
CMD ["curl","-s","http://ip.cn"]
FROM centos
RUN yum install -y curl
ENTRYPOINT ["curl","-s","http://ip.cn"]
上述两个dockerfile构建出的镜像1(CMD)和镜像2(ENTRYPOINT),在启动容器时会获取ip信息
docker run 镜像1 -i 时会报错,因为最后一行的启动bash命令会被-i取代
docker run 镜像2 -i时会打印出ip信息和请求头信息,因为-i会作为参数传入命令中
FROM centos
RUN yum install -y curl
ENTRYPOINT ["curl","-s","http://ip.cn"]
ONBUILD RUN echo "father images ----"
上述构建的镜像为myip_father
FROM myip_father
RUN yum install -y curl
ENTRYPOINT ["curl","-s","http://ip.cn"]
上述构建的镜像为myip_son
当它构建时会打印father images ----信息
自定义镜像Tomcat9
创建mydocker/tomcat9/目录
同时在该目录touch c.txt
将apache-tomcat-9.0.8.tar.gz和jdk-8u171-linux-x64.tar.gz也拷贝到当前目录。
在当前目录创建Dockerfile文件
FROM centos
MANTAINER hukl<hukl@xx.com>
COPY c.txt /usr/local/cincontainer.txt
ADD jdk-8u171-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.8.tar.gz /usr/local
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8
ENV CATALINA_BATH /usr/local/apache-tomcat-9.0.8
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
#ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh"]
#CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out