Docker容器技术 |DockerFile文件解析


DockerFile是什么

Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。类似Linux中Shell脚本。

构建DockerFile文件的步骤:
①编写Dockerfile文件
②docker build 获得自定义的镜像
③docker run

DockerFile构建过程解析

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

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

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

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

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

DockerFile保留字指令

在这里插入图片描述
BUILD

FROM      基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER   镜像维护者的姓名和邮箱地址:镜像维护者的姓名和邮箱地址
COPY      类似ADD,拷贝文件和目录到镜像中。
ADD       将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
RUN       容器构建时需要运行的命令
ONBUILD     当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

BOTH
WORKDIR     指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点

RUN
CMD       指定一个容器启动时要运行的命令
ENV       用来在构建镜像过程中设置环境变量

ENV MY_PATH /usr/mytest 这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样。也可以在其它指令中直接使用这些环境变量,比如:WORKDIR $MY_PATH

EXPOSE     当前容器对外暴露出的端口
VOLUME     容器数据卷,用于数据保存和持久化工作
ENTRYPOINT    指定一个容器启动时要运行的命令

将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置。

案例1:自定义镜像centos

在这里插入图片描述

Base镜像(scratch) :大多数的镜像都是通过在base镜像中安装和配置需要的软件构建出来的,所以大多数DockerFile开头都是 from scratch

①编写:

由于从阿里云拉下来的centos只是一个内核,不附带vim、ifconfig等命令、默认进入即是/目录,所以我们可以自定义设置它:

FROM centos
MAINTAINER gql<[email protected]>
 
ENV MYPATH /usr/local
WORKDIR $MYPATH
 
RUN yum -y install vim
RUN yum -y install net-tools
 
EXPOSE 80
 
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash

②构建
docker build -f /mydocker/Dockerfile1 -t mycentos:1.2 .

③运行
docker run -it mycentos:1.2

此时运行,镜像就有了ifconfig和vim命令的功能。
在这里插入图片描述
还可以使用docker history 镜像id列出镜像的变更历史,这里的列表是顺着加载倒着执行的,类似于栈。
在这里插入图片描述

案例2:ONBUILD命令案例

首先在宿主机的/mydocker下创建Dockerfile2,使用vim编写以下命令:

FROM centos
RUN yum install -y curl
ENTRYPOINT ["curl","-s","http://ip.cn"]
ONBUILD RUN echo "father onbuild----------"

将Dockerfile2构建为父镜像:docker build -f /mydocker/Dockerfile2 -t my_father .

然后在宿主机的/mydocker下创建Dockerfile3,使用vim编写以下命令:

FROM my_father
RUN yum install -y curl
CMD ["curl","-s","http://ip.cn"]

以my_father为父镜像,将Dockerfile3构建为子镜像:docker build -f /mydocker/Dockerfile3 -t my_son .

可以看到,在子镜像构建的时候,父镜像中的指令执行。
在这里插入图片描述

案例3:自定义tomcat9

①创建文件夹:/mydocker/my_tomcat9,并在其中创建c.txt

mkdir /mydocker/my_tomcat9
cd /mydocker/my_tomcat9
touch c.txt

另外还需要手动下载apache-tomcat-9.0.8.tar.gzjdk-8u171-linux-x64.tar.gz/mydocker/my_tomcat9

②再创建Dockerfile_tomcat

FROM         centos
MAINTAINER    gql<[email protected]>
#把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下
COPY c.txt /usr/local/cincontainer.txt
#把java与tomcat添加到容器中
ADD jdk-8u171-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.8.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_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_BASE /usr/local/apache-tomcat-9.0.8
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.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out

③构建:docker build -f /mydocker/my_tomcat9 -t my_tomcat9 .

④运行:
docker run -d -p 8080:8080 --name myt9 -v /mydockerfile/tomcat9/test:/usr/local/apache-tomcat-9.0.8/webapps/test -v /mydockerfile/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.8/logs --privileged=true my_tomcat9

DockerFile总结

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43691058/article/details/106983617
今日推荐