自定义脚本-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 build -t [镜像名称] [文件路径]
所以执行命令,通过Dockerfile构建一个名称为“my_docker_images”的镜像。
docker build -t my_docker_images /java/Docker
如图,我们就构建成功了一个镜像文件,接下来我们对DockerFile脚本中的命令进行讲解。
1.2 运行容器
创建一个容器,应用的镜像为[my_docker_images],并且进入该容器。
docker run --name my_docker_new -it my_docker_images /bin/bash
执行 “ls”命令,可以看得到,新创建容器根据我们生成的镜像,根目录存在info.txt文件。
2.DockerFile命令
FOMR命令
指定了容器需要加载的镜像及其版本,每一个dockerFile脚本的开头命令一定是FORM。
MAINTAINER
标明了作者的相关信息。
ADD命令
ADD命令可以将文件追加到容器中,但是需要注意的是,它ADD的文件一定要与DockerFile文件同级目录或者其下级目录。如下图所示,ADD到容器中一个war包,那么war文件夹一定要放置到脚本文件同级目录,否则无法执行。
ENV命令
用来在镜像构建过程中设置环境变量,后续的RUN可以使用它所创建的环境变量。
RUN命令
在Build命构建时执行的命令。
ENTRYPOINT命令
容器启动时执行的命令,DockerFile中可以存在多个ENTRYPOINT命令,但是容器启动只执行最后一条ENTRYPOINT命令。
CMD命令
容器启动后执行的默认命令,DockerFile中可以存在多个CMD命令,但是容器启动只执行最后一条CMD命令。
EXPOSE
可以指定容器的对外端口。
3.RUN和ENTRYPOINT和CMD的区别。
从下图不难看出,RUN执行在构建镜像的时候,而ENTRYPOINT和CMD是在容器启动的时候。
貌似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命令。
小结
DockerFile是docker技术中非常重要的功能,后续的章节中,我们会通过它来构建特定镜像,希望大家学习愉快。