- 手动编写一个dockerfile文件,当然,必须要符合file的规范:编写
- 有了这个文件后,直接docker build命令执行,获得一个自定义的镜像:构建
- run:执行
1、DockerFile是什么
DockerFile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本
构建三步骤 :
编写DockerFile文件
Docker build
Docker run
DockerFile长什么样:以centos为例子
2、DockerFile构建过程解析
以Java的代码为例子
class Book{
private int id;
public Book(){
}
{
System.out.println();
}
static{
}
}
2.1、DockerFile基础知识
- 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
- 指令按照从上到下,顺序执行
- #表示注释
- 每条指令都会创建一个新的镜像层,并对镜像进行提交
每条指令都会创建一个新的镜像层,并对镜像进行提交示意图
2.2、Docker执行DockerFile的大致流程(Docker build)
-
Docker从基础镜像运行一个容器
-
执行一条指令并对容器作出修改
-
执行类似docker commit的操作提交一个新的镜像层
-
Docker再基于刚提交的镜像运行一个新容器
-
执行dockerfile中的下一条指令直到所有指令都执行完成
从应用软件的角度来看,DockerFile、Docker镜像与Docker容器分别代表软件的三个不同阶段
- DockerFile是软件的原材料
- Docker镜像是软件的交付品
- Docker容器则可以认为是软件的运行太
DockerFile面向开发,Docker镜像成为交付标准,Docker容器则设计部署与运维,三者缺一不可,合力充当Docker体系的基石
2.3、DockerFile的保留字指令
2.3.1、FROM
基础镜像,当前镜像是基于哪个镜像的
2.3.2、MAINTAINER
镜像维护者的姓名和邮箱地址
2.3.3、RUN
容器构建时需要执行的命令
2.3.4、EXPOSE
当前容器对外暴露的端口号
2.3.5、WORKDIR
指定在创建容器后,终端默认登录的进来的工作目录,一个落脚点
2.3.6、ADD
将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包.
2.3.7、COPY
类似ADD,拷贝文件个目录到镜像中 COPY
2.3.8、VOLUME(参考05数据卷)
容器数据卷,用于数据保存和持久化操作,实现数据共享
2.3.9、CMD
指定一个容器启动时要运行的命令。
DockerFile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run 之后的参数替换
CMD指令的格式和RUN类似,也是两种格式
- Shell格式: CMD <命令>
- exec格式: CMD [“可执行文件”,“参数1”,”参数2“。。。]
- 参数列表格式: CMD[“参数1”,“参数2”。。。。。],在指定了ENTRYPOINt之后,用CMD指定具体的参数
2.3.10、ENTRYPOINT
指定一个容器启动时要运行的命令
ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数
2.3.11、ONBUILD
当构建一个被继承的
2.3.12、小结
3、案例
3.0、Base镜像(scratch)
Docker Hub中的99%的镜像都是通过在base及镜像中安装和配置需要的软件构建出来的
3.1、自定义mycentos
#基础镜像
FROM centos
ENV myPath /tmp
#配置金融企之后工作路径
WORKDIR $myPath
#安装vim
RUN yum -y install vim
RUN yum -y install net-tools
#暴露的端口
EXPOSE 80
CMD /bin/bash
3.2、CMD/ENTRYPOINT镜像案例
都是指定容器启动时要运行的命令
3.2.1、CMD
DockerFile中可以有多个CMD,但只有最后一个生效
https://github.com/docker-library/tomcat/blob/134944c089ab2e2f741da6f1467d794feac12ebf/8.5/jdk11/corretto/Dockerfile
3.2.2、ENTRYPOINT
docker run之后的参数会被当做参数传递给ENTRYPOINT,之后形成的新的命令组合
3.2.3、ONBUILD
当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
3.2.4、ADD
FROM centos
MAINTAINER zzyy<zzyy@126.com>
#把宿主机当前上下问的c.txt拷贝到容器/usr/local路径下
COPY c.txt /usr/local/cincontainer.txt
#把java与tomcat添加到容器中
ADD jdk-8u191-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.30.tar.gz /usr/local/
#安装vim编辑器
RUN yum -y install vim
#设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置JAVA与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_191
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.30
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.30
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE 8080
#启动时运行tomcat
#ENTRYPOINT ["usr/local/apache-tomcat-9.0.30/bin/startup.sh"]
#CMD ["usr/local/apache-tomcat-9.0.30/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.30/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.30/bin/logs/catalina.out