DockerFile

发布于 2021-09-17  1.32k 次阅读


一,Dockerfile的概念和用途

概念:dockerfile本质上是包含一组或多组docker镜像命令的文档,通过文档docker可以构建镜像

一,dockerfile镜像构建和传统构建镜像的对比(以Tomcat项目为例)

1,传统docker构建镜像的过程:

  1. 拉取远程仓库tomcat镜像
  2. 用基础镜像构建tomcat容器
  3. 项目编码完成,打成war包
  4. 通过cp或者数据卷把war包放入tomcat容器中
  5. tomcat解析war包运行项目 
  6. 通过commit把容器打包成镜像
  7. 在通过save把docker镜像保存到本地

传统构造过程至少要有五步才能完成构建

 

2,dockerfile构建镜像的过程:

  1. 拉取远程仓库Tomcat镜像做为基础镜像
  2. 打包项目成war包
  3. 书写dockerfile命令到dockerfile文件中
  4. 通过docker -build命令直接构建

docker除了写dockerfile文件,其实只需要一步就完成镜像的构建

 

 

二,dockerfile的作用

主要用来帮助我们构建自定义的镜像,dockerfile为镜像文件和描述文件

出现原因:传统方式构建镜像太过繁杂

核心作用:方便用户在开发过程中将自己的应用打包成镜像

二,Dockerfile命令

Dockerfile格式:第一条命令必须是FROM指定基础镜像,命令标识必须大写,通过#注释

1,FROM:指定基础镜像,必须为第一条命令

三种书写格式:

  1. FROM image
  2. FROM image:tag
  3. FROM image@digest

注:tag和digest是可选的,如果不使用这两个值,会使用latest版本的镜像

FROM mysql
FROM mysql:5.6

2,RUN:构建镜像时执行的命令

两种书写格式:

  1. shell形式:run后面直接写shell命令
  2. exec形式:run后面写json格式的命令(本质上执行的还是shell命令)

注:RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache

#shell形式
run ll /
#exec形式
run ["ll","/"]

3,CMD:构建容器后要执行的命令(也就是容器启动时才能被调用)

和RUN一样两种书写格式:不重复

注: CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令,CMD指令会被后面的CMD指令和run自带的命令覆盖

CMD echo "This is a test." | wc -
CMD ["/usr/bin/wc","--help"]

4,ENTPYPOINT:配置容器使其可执行化(配合CMD命令使用)

和RUN一样两种书写格式:不重复

注:ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。

   FROM ubuntu
   ENTRYPOINT ["top", "-b"]
   CMD ["-c"]

一般在使用使用CMD为ENTPYPOINT传参,run动态覆盖CMD的内容

5,EVN:设置环境变量

两种书写格式:name变量名,value变量值

  1. ENV name=value
  2. ENV name value

调用EVN变量:$name

ENV myname=wql
ENV mysex nan
RUN echo $mysex >wql.txt

6,EXPOSE:指定对外界开发的端口(与主机做端口映射必须指定)

格式:EXPOSE port [port]

一次可以开发多个端口

注:EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-p参数来发布EXPOSE导出的所有端口

EXPORE 8080 443
EXPOSE 8011

7,WORKDIR:指定工作目录(进入容器时会直接跳到此目录)

格式:WORKDIR pth

 WORKDIR /usr/tomcat/webapps

8,COPY:将本地文件或目录添加到容器指定目录中

格式:COPY locanpath conatinerpath

#拷贝本地文件wql.txt到容器的tomcat目录中
COPY ./wql.txt /home/tomcat
#拷贝当前整个目录到容器home目录中
COPY ./ /home

9,ADD:如COPY一样都将本地拷贝到容器

ADD的拷贝特性(COPY不具备):

  • 拷贝tar类型的文件会自动进行解压
  • 可以通过wget下载网络资源到容器
#下载网络图片到容器image目录
ADD wget http://wql.luoqin.ltd/wp-content/uploads/2020/04/1.jpg /home/image
#拷贝wql.tar文件到容器home目录
ADD ./wql.tar /home

10,VOLUME: 义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。

格式:

  • VOLUME ["path1", "path2"...]
  • VOLUME path

在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点。

三,Docker加载Dockerfile命令

命令:docker build 目录

参数:

  • -t:指定镜像的名称和版本号(wql:1.0)
  • -f:指定要使用的Dockerfile文件的路径
  • -m:设置内存最大值
  • -q:安静模式创建(只输出镜像ID)

注:.代表当前目录和linux的./是一样的

#把当前目录文件打包成镜像
docker build -t wql:1.0 -f ./Dockerfile -q .

路漫漫其修远兮,吾将上下而求索