Docker从入门到应用(六):Dockerfile解析

DockerFIle文件解析

是什么

Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。DockerFile定义了进程需要的一切东西,DockerFile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和系统内核进程打交道,这时需要考虑如何设计namespace的权限控制)等,简单来说通过DockerFile可以构建出我们锁需要的镜像。

  • 构建镜像三个步骤: 编写DockerFile文件 -> docker build -> docker run

  • DockerFile文件举例: centos DockerFIle

image-20220810000337041

DockerFile构建过程解析

DockerFile 内容基础知识

  1. 每条保留字指定都必须为大写字母且后面要跟随至少一个参数
  2. 指令按照从上到下,顺序执行
  3. #表示注释
  4. 每条指令都会创建一个新的镜像层,并对镜像进行提交(层层包裹)

Docker执行DockerFile的大致流程

  1. docker从基础镜像运行一个容器
  2. 执行一条指令并对容器做出修改
  3. 执行类似docker commit的操作提交一个新的镜像层
  4. docker再基于刚提交的镜像运行一个新的容器
  5. 执行dockerfile中的下一条指令直到所有指令都执行完成

小总结

从应用软件的角度看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,DockerFile是软件的原材料,Docker镜像是软件的交付品,Docker容器则可以认为是软件的运行态。DockerFile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。

image-20220814153812554

DockerFile 定义了进程需要的一切东西。DockerFile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这是需要考虑如何设计namespace的权限控制)等等

Docker镜像,在用DockerFile定义了一个文件之后,docker build时会产生一个Docker镜像,当运行Docker镜像时,会真正开始提供服务

Docker容器,容器是直接提供服务的

DockerFile体系结构保留字指令

image-20220814164608591

  • FROM 基础镜像,当前镜像是基于哪个镜像的
  • MAINTAINER 镜像维护者的姓名和邮箱地址
  • RUN 容器构建是需要运行的命令
  • EXPOSE 当前容器对外暴露出的端口
  • WORKDIR 指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
  • ENV 用来在构建镜像过程中设置环境变量 eg:ENV JAVA_PATH /user/java/bin
  • ADD 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
  • COPY 类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中<源路径>的文件/目录复制到新的一层镜像内的<目标路径>位置
  • VOLUME 容器数据卷,用于数据保存和持久化工作
  • CMD 指定一个容器启动时要运行的命令,CMD 指令和RUN 类似,也是两种格式,DockerFile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run 之后的参数替换
    • shell 格式: CMD<命令>
    • exex 格式: CMD [“可执行文件”,“参数1”,“参数2”,…]
    • 参数列表格式:CMD[“参数1”,“参数2”…].在指定了ENTRYPOINT指令后,用CMD指定具体的参数
  • ENTRYPOINT 指定一个容器启动时要运行的命令,ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数
  • ONBUILD 当构建一个被继承的DockerFile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

案例

Base 镜像 (scratch)

Docker Hub 中99%的镜像都是通过在Base 镜像 中安装和配置需要的软件构建出来的,scratch是Docker镜像中最基础的镜像

image-20220821175406936

自定义centos 镜像

docker hub中拉去默认centos 镜像并启动,默认centos镜像 中并未安装vim,与ifconfig,启动后默认路径为 根路径 /

image-20220821180450712

自定义构建centos镜像并安装vim、ifconfig命令,同时修改centos 启动默认路径,首先查看docke hub centos Dockerfile内容

image-20220822004400617

执行docker build 构建镜像,出现问题,替换源后解决

image-20220822004611966

# 当前镜像基于centos
FROM centos
# 镜像维护者姓名和邮箱
MAINTAINER UncleJ<[email protected]>
# 设置环境变量
ENV rootPath /usr/local
# 指定在容器创建后,终端默认登陆进来的工作目录,一个落脚点,这里$rootPath 引用上面配置的环境变量
WORKDIR $rootPath
# RUN 容器构建时需要运行的命令,安装vim,net-tools
RUN mkdir /etc/yum.repos.d.bak
RUN mv /etc/yum.repos.d/* /etc/yum.repos.d.bak/
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
RUN yum clean all
RUN yum makecache
RUN yum -y install vim
RUN yum -y install net-tools
# 指定当前容器启动时对外暴露的端口
EXPOSE 80
# CMD 命令,指定一个容器启动时要运行的命令
# Dockerfile中可以有多个CMD指令,但只有最后一个生效,以下添加了三个CMD命令,只有最后一个 CMD /bin/bash生效
CMD echo $rootPath
CMD echo "finished,--------success1"
CMD /bin/bash

重新执行docker build -t mycentos:1.0 . 镜像构建成功

image-20220822005102453

运行新创建的镜像,查看结果,vimifconfig 命令正常使用,终端默认登录进来的工作目录为 /usr/local

image-20220822005738772

docker history 查看镜像变更历史,每条命令都会生成一个新的镜像,层层包裹

image-20220822010119096

CMD / ENTRYPOINT 命令对比

CMD与ENTRYPOINT都是指定一个容器启动时要运行的命令,但CMD与ENTRYPOINT有不同的区别
CMD: Dockerfile中可以有多个CMD指令,但只有最后一个生效,且CMD会被docker run 之后的参数替换

  • 已创建的mytomcat:1.0为例,运行 docker run -it -p 8888:8080 mycent:1.0 ls -l CMD 命令会被替换。
CMD echo $rootPath
CMD echo "finished,--------success1"
CMD /bin/bash
# 替换命令,生成新的CMD命令
CMD ls -l

ENTRYPOINT docker run 之后的参数会被当做参数传递给 ENTRYPOINY,之后形成新的命令组合执行

#dockerfile
FROM centos
ENTRYPONIT ["curl","-s","http://www.baidu.com"]

以上述Dockerfile为例,docker run -it xxxx -i,在docker run 后添加 -i 参数 ENTRYPOINT 命令会被替换为 ENTRYPOINT ["curl","-s","-i","http://www.baidu.com"]

自定义tomcat镜像

创建tomcatTest 目录,目录中下载tomcat 与jdk tar包,创建test.txt文件

image-20220823012034536

创建DockerFile文件

#当前镜像基于mycentos:1.0 基于我们自己的centos,已安装好vim
FROM mycentos:1.0
#镜像维护者姓名和邮箱
MAINTAINER UncleJ<[email protected]>
#把宿主机当前上下文的test.txt拷贝到容器/usr/local/路径下
COPY test.txt /usr/local/text-copy.txt
#把java与tomcat添加到容器中,ADD 命令会自动解压缩文件,除次情形外,复制文件命令建议使用copy命令
ADD jdk-11.0.16.1_linux-x64_bin.tar.gz /usr/local/
ADD apache-tomcat-9.0.65.tar.gz /usr/local/
#安装vim编辑器,mycentos:已安装即可以跳过
#RUN yum -y install vim
#设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk-11.0.16.1
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.65
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.65
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE  8080
#启动时运行tomcat
# 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.65/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.65/logs/catalina.out
 

执行镜像构建命令docker build -t mytomcat:1.0 .构建镜像,镜像构建成功

image-20220825165441743

运行启动镜像 docker run -it -p 8080:8080 mytomcat:1.0,将容器8080端口映射至宿主机8080端口

image-20220825175719745

容器创建成功,输出tomcat启动日志,访问主机8080端口,响应默认tomcat 界面,tomcat 启动成功

image-20220825180033487

登录容器访问/usr/local 目录 文件被成功复制,环境变量成功配置

image-20220825181710304

猜你喜欢

转载自blog.csdn.net/Hong_pro/article/details/126530331