自定义脚本-DockerFile

  • 1.通过DockerFile构建一个镜像并运行容器
  • 1.1 运行DockerFile脚本
  • 1.2 运行容器
  • 2.DockerFile命令
  • FOMR命令
  • MAINTAINER
  • ADD命令
  • ENV命令
  • RUN命令
  • ENTRYPOINT命令
  • CMD命令
  • EXPOSE
  • 3.RUN和ENTRYPOINT和CMD的区别。
  • 小结



今天我们讲一个相对轻松的话题

DockerFile, 也就是docker的自定义脚本。


DockerFile是由一组命令组成的自定义脚本,它可以通过预设命令,指定镜像、追加文件、分配端口等多个操作,将我们手工构建镜像的命令脚本化。


“如果一件事情是可重复、可描述的,请用系统、脚本固话下来,毕竟我们需要的是创造,而不是机械的重复 。------鲁迅 ”。


既然鲁迅先生都这么说,那么开工吧。

1.通过DockerFile构建一个镜像并运行容器

1.1 运行DockerFile脚本

首先我们创建一个文本,添加如下内容:

#20200422 castle
#执行 镜像
FROM ubuntu:18.10
#作者信息
MAINTAINER caslte "454383487@qq.com"
ADD war/info.txt /info.txt
#拷贝文件到指定目录
RUN echo "Asia/Shanghai" > /etc/timezone
ENV LANG C.UTF-8
#执行程序 
CMD ["echo","docker start"]
#开放端口
EXPOSE 80

将其保存,并在同级目录下创建war文件夹,war文件夹中创建一个txt文本,里面写入“Doing is better than saying”,效果如图。

docker脚本if jenkins docker脚本编写图片_ubunut


运行构建镜像的语句格式为

docker build -t [镜像名称] [文件路径]

所以执行命令,通过Dockerfile构建一个名称为“my_docker_images”的镜像。

docker build -t my_docker_images /java/Docker

如图,我们就构建成功了一个镜像文件,接下来我们对DockerFile脚本中的命令进行讲解。

docker脚本if jenkins docker脚本编写图片_docker_02

1.2 运行容器

创建一个容器,应用的镜像为[my_docker_images],并且进入该容器。

docker run --name my_docker_new  -it  my_docker_images  /bin/bash

执行 “ls”命令,可以看得到,新创建容器根据我们生成的镜像,根目录存在info.txt文件。

docker脚本if jenkins docker脚本编写图片_jenkins_03

2.DockerFile命令

FOMR命令

指定了容器需要加载的镜像及其版本,每一个dockerFile脚本的开头命令一定是FORM。

MAINTAINER

标明了作者的相关信息。

ADD命令

ADD命令可以将文件追加到容器中,但是需要注意的是,它ADD的文件一定要与DockerFile文件同级目录或者其下级目录。如下图所示,ADD到容器中一个war包,那么war文件夹一定要放置到脚本文件同级目录,否则无法执行。

docker脚本if jenkins docker脚本编写图片_dokcer_04

ENV命令

用来在镜像构建过程中设置环境变量,后续的RUN可以使用它所创建的环境变量。

RUN命令

在Build命构建时执行的命令。

ENTRYPOINT命令

容器启动时执行的命令,DockerFile中可以存在多个ENTRYPOINT命令,但是容器启动只执行最后一条ENTRYPOINT命令。

CMD命令

容器启动后执行的默认命令,DockerFile中可以存在多个CMD命令,但是容器启动只执行最后一条CMD命令。

EXPOSE

可以指定容器的对外端口。

3.RUN和ENTRYPOINT和CMD的区别。

从下图不难看出,RUN执行在构建镜像的时候,而ENTRYPOINT和CMD是在容器启动的时候。

docker脚本if jenkins docker脚本编写图片_docker脚本if jenkins_05


貌似ENTRYPOINT和CMD是实现一样的功能,那他们之间的区别又是什么呢。

ENTRYPOINT,一般执行较为固定的命令。

CMD,一般是执行默认执行的命令,但是可以被参数替换。

比如,如下的命令 /bin/bash 就是一条运行是传入的参数,它会覆盖容器中默认执行的CMD命令。

docker run --name my_docker_new  -it  my_docker_images  /bin/bash

那么docker为什么提供两条相同功能的命令呢?
我们举例说明,这是一个很简单的DockerFile脚本。按照顺序,容器启动的时候会将ENTRYPOINT和CMD命令合并,执行 ps -ef

#执行 镜像
FROM ubuntu:18.10
RUN echo "images building"
ENTRYPOINT ["ps"]
CMD ["-ef"]

分别执行如下命令,获得如下结果。

docker build -t docker_images /java/Docker
docker run --name test1  docker_images
docker run --name test2  docker_images  -aux

可以看出,如果我们执行执行容器,则执行的是ps -ef命令,如果我们传入了 -aux参数,则容器启动执行的就是ps -aux命令。

docker脚本if jenkins docker脚本编写图片_ubunut_06

小结

DockerFile是docker技术中非常重要的功能,后续的章节中,我们会通过它来构建特定镜像,希望大家学习愉快。