docker_基础_DockerFile
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker_基础_DockerFile相关的知识,希望对你有一定的参考价值。
1.利用 dockerfile 定制镜像
??镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是Dockerfile
?? Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建.
配置第一个dockerfile文件
$ mkdir mynginx
$ cd mynginx
$ touch Dockerfile
内容:
FROM nginx
RUN echo ‘<h1> hello,docker! </h1>‘ > /usr/share/nginx/html/index.html
FROM 指定基础镜像
??所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制,基础镜像是必须指定的。而 FROM 就是指定基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令
??除了选择现有镜像为基础镜像外,Docker 还存在一个特殊的镜像,名为 scratch 。这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像
FROM scratch
??如果你以 scratch 为基础镜像的话,意味着你不以任何镜像为基础,接下来所写的指令将作为镜像第一层开始存在。
??不以任何系统为基础,直接将可执行文件复制进镜像的做法并不罕见,比如swarm 、 coreos/etcd 。对于 Linux 下静态编译的程序来说,并不需要有操作系统提供运行时支持,所需的一切库都已经在可执行文件里了,因此直接 FROM scratch 会让镜像体积更加小巧。使用 Go 语言 开发的应用很多会使用这种方式来制作镜像,这也是为什么有人认为 Go是特别适合容器微服务架构的语言的原因之一
RUN 执行命令
??RUN 指令是用来执行命令行命令的。由于命令行的强大能力, RUN 指令在定制镜像时是最常用的指令之一。其格式有两种:
??shell 格式: RUN <命令> ,就像直接在命令行中输入的命令一样。刚才写的 Dockerfile 中的 RUN 指令就是这种格式。
??例如:RUN echo "123" > /tmp/1.txt
??exec 格式: RUN ["可执行文件", "参数1", "参数2"] ,这更像是函数调用中的格式
??Dockerfile 中每一个指令都会建立一层, RUN 也不例外。每一个 RUN 的行为,就和刚才我们手工建立镜像的过程一样:新建立一层,在其上执行这些命令,执行结束后, commit 这一层的修改,构成新的镜像,Union FS 是有最大层数限制的,比如 AUFS,曾经是最大不得超过 42 层,现在是不得超过127 层
??因此,这里没有使用很多个 RUN对应一一不同的命令,而是仅仅使用一个 RUN 指令,并使用 && 将各个所需命令串联起来, 以下只是一个演示,可能不能运行,在撰写 Dockerfile 的时候,要经常提醒自己,这并不是在写 Shell 脚本,而是在定义每一层该如何构建
比如 RUN yum -y install nginx && echo "hello docker" > /usr/share/nginx/html/index.html && systemctl start nginx && tail -f /var/log/nginx/access.log
Dockerfile 支持 Shell 类的行尾添加 \ 的命令换行方式,以及行首 # 进行注释的格式。良好的格式,比如换行、缩进、注释等,会让维护、排障更为容易,这是一个比较好的习惯
构建镜像
? 语法: docker build [选项] <上下文路径/URL/->
[[email protected] mynginx]# docker build -t nginx:v4 .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM nginx
---> 7f70b30f2cc6
Step 2/2 : RUN echo ‘<h1> hello,docker! </h1>‘ > /usr/share/nginx/html/index.html
---> Running in 065c3e52b540
Removing intermediate container 065c3e52b540
---> 3d80dfa73097
Successfully built 3d80dfa73097
Successfully tagged nginx:v4
[[email protected] mynginx]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v4 3d80dfa73097 About a minute ago 109MB
运行 以后台方式运行 名称为test 端口映射80:80
$ docker run -dit --name test -p 80:80 nginx:v4
镜像构建上下文(Context)
build 构建时最后带的那个. 并不是指定Dockerfile所在的路径,这样理解是不正确的,如果对应上面的命令格式,这其实是在指定上下文路径
??docker build 工作原理: Docker 在运行时分为 Docker 引擎(也就是服务端守护进程)和客户端工具。Docker 的引擎提供了一组 REST API,被称为 DockerRemote API,而如 docker 命令这样的客户端工具,则是通过这组 API 与 Docker 引擎交互,从而完成各种功能。因此,虽然表面上我们好像是在本机执行各种 docker 功能,但实际上,一切都是使用的远程调用形式在服务端(Docker 引擎)完成。也因为这种 C/S 设计,让我们操作远程服务器的 Docker 引擎变得轻而易举
以上是关于docker_基础_DockerFile的主要内容,如果未能解决你的问题,请参考以下文章
Docker Review - dockerfile 实战_使用dockerfile制作tomcat镜像
Docker_部署jenkins(dockerfile实现)