一张图学dockerfile

一张图就能学会Dockerfile

Dockerfile是为快速构建docker image而设计的,当你使用dockerbuild 命令的时候,docker 会读取当前目录下的命名为Dockerfile(首字母大写)的纯文本文件并执行里面的指令构建出一个docker image。这比SaltStack的配置管理要简单的多,不过还是要掌握一些简单的指令。

Dockerfile 由一行行命令语句组成,并且支持以#开头的注释行。指令是不区分大小写的,但是通常我们都大写。

下面我们通过构建一个Nginx的镜像来学习Dockerfile

Nginx Dockerfile实战

注意:第一个指令必须是FROM。

为了大家更容易学习,我这里总结一个命令的介绍:

一般的,我们将Dockerfile 分为四部分:

  • 基础镜像信息
  • 维护者信息
  • 镜像操作指令
  • 容器启动时执行指令

思路混乱的比喻

这就是学会Dockerfile的一张图

构建Dockerfile

注意:ADD index.html就是放一个文件进去,这个文件需要大家自己准备一下。例如:

[[email protected] mynginx]# echo “nginx indocker test” > index.html

使用dokcer build命令构建镜像

[[email protected]]# docker build -t mynginx:v2 .

构建完毕之后,我们就可以Run起来。

[[email protected] ~]# docker run -d -p92:80 nginx:v2 nginx

现在你应该发现编写Dockerfile有多么的简单了吧。

Dockerfile指令详解

下面我们来分别介绍下上面使用到的命令:

1. FROM

格式:FROM<image>或FROM<image>:<tag>。

解释:FROM是Dockerfile里的第一条指令(必须是),后面跟有效的镜像名(如果该镜像你的本地仓库没有则会从远程仓库Pull取)。然后后面的其它指令FROM的镜像中执行。

2. MAINTAINER

格式:MAINTAINER <name>

解释:指定维护者信息。

3. RUN:在镜像构建过程中运行。

格式:RUN <command>或 RUN[“executable”, “param1”, “param2”](exec模式)

解释:运行命令,命令较长使可以使用\来换行。推荐使用上面数组的格式

例如: shell模式:RUN echo hello 执行的方式是用shell来执行,实际效果是 /bin/sh -c echo hello

exec模式:可以指定其他形式的shell来执行指令

RUN ["/bin/bash", "-c", "echo hello"]

两条RUN指令可以合并成一条, 例如:RUN apt-get update && apt-get -y nginx

docker build -t="镜像名" .   在当前目录构建镜像,注意后面的 点 表示当前目录

4. CMD:指定容器启动时的默认行为

格式:

CMD [“executable”,”param1″,”param2″] 使用 exec 执行,推荐方式;

CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;

CMD [“param1″,”param2”] 提供给ENTRYPOINT的默认参数,和ENTRYPOINT搭配使用

解释:

CMD指定容器启动时执行的命令,每个Dockerfile只能有一条CMD命令,如果指定了多条,只有最后一条会被执行。如果你在启动容器的时候也指定的命令,那么会覆盖Dockerfile构建的镜像里面的CMD命令。

例如:使用exec方式

在dockerfile中添加 CMD ["/usr/sbin/nginx", "-g",  "daemon off;"]  启动容器时运行nginx, 并且以前台方式运行。

这样使用命令docker build -t="home/hong"(给镜像起名) .  构建一个home/hong的镜像后,

启动容器:docker run -d -p 80 --name cmd_test1 home/hong ---------不用再写容器启动的命令nginx -g "daemon off;")

之前不加CMD时,

启动容器:docker run -p 80 -d home/hong nginx -g "daemon off;"

如果使用命令docker run -d -p 80 --name cmd_test2 home/hong /bin/bash来启动一个容器,

再用docker ps -l 查看(显示最后一次创建的容器,包括未运行的),发现COMMAND列显示的内容已经变化为/bin/bash, 之前是/usr/sbin/nginx -g

可以用docker top cmd_test1来查看容器的进程。

5. ENTRYPOINT

格式:

ENTRYPOINT [“executable”, “param1″,”param2”]

ENTRYPOINT command param1 param2(shell中执行)。

例如:ENTRYPOINT ["/usr/sbin/nginx", "-g",  "daemon off;"]

解释:和CMD类似,区别:不可被 docker run 提供的参数覆盖。

每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。ENTRYPOINT没有CMD的可替换特性,也就是你启动容器的时候增加运行的命令不会覆盖ENTRYPOINT指定的命令。

所以生产实践中我们可以同时使用ENTRYPOINT和CMD,使用ENTRYPOINT来指定命令,用CMD来指定命令默认的参数。例如来dockerfile中写入如下命令来构建镜像后:

ENTRYPOINT ["/usr/sbin/nginx"]

CMD ["-h"]

启动容器:docker run -d -p 80 --name ep_test1 home/hong -g "daemon off"   使用docker ps查看,显示的COMMAND参数为 /usr/sbin/nginx -g,表示CMD的默认参数被-g参数覆盖了

例子2:

ENTRYPOINT [“/usr/bin/rethinkdb”]

CMD [“–help”]

6.  USER

格式:USER daemon

例如:USER user                    USER uid

USER user:group          USER uid:gid

USER user:gid               USER uid:group

解释:指定运行容器时的用户名和UID,后续的RUN指令也会使用这里指定的用户,默认会使用root用户

7. EXPOSE

格式:EXPOSE<port> [<port>…]   :指定运行该镜像的容器使用的端口,只是告诉别人我要用某个端口,但是并不会自动打开此端口,所以启动容器是还需要用参数-p或者-P来指定开启的端口号

例如:dockerfile中 EXPOSE 80

在容器运行时 docker run -p 80 -d home/hong nginx -g "daemon off;"

解释:设置Docker容器内部暴露的端口号,如果需要外部访问,还需要启动容器时增加-p或者-P参数进行分配。

8. ENV

格式:ENV<key> <value>

ENV <key>=<value> …

解释:设置环境变量,可以在RUN之前使用,然后RUN命令时调用,容器启动时这些环境变量都会被指定

9. ADD

格式:

ADD <src>… <dest>

ADD [“<src>”,… “<dest>”]

例子: ADD index.html /usr/share/nginx/html/  使用本地编写的网页,替换nginx的默认页面

解释:将指定的<src>复制到容器文件系统中的<dest>,

1. 一般来说src地址为本机dockerfile所在的目录,目标路径要使用容器中的绝对路径,

2. 所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0

3. 如果文件是可识别的压缩格式,则docker会帮忙解压缩,还有一个COPY指令,和ADD用法完全一样,只是没解压缩功能,如果是纯拷贝,使用COPY好。

10. VOLUME

格式:VOLUME [“/data”]

解释:可以将本地文件夹或者其他container的文件夹挂载到container中。

11. WORKDIR:容器内部设置工作目录

格式:WORKDIR/path/to/workdir

解释:切换目录,为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录。

可以多次切换(相当于cd命令),

也可以使用多个WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如

WORKDIR /a

WORKDIR b

WORKDIR c

RUN pwd

则最终路径为 /a/b/c。

12. ONBUILD:为镜像添加触发器

ONBUILD 指定的命令在构建镜像时并不执行, 而是在它的子镜像中执行;

只有当一个镜像被其他镜像作为基础镜像时才会执行,会在构建过程中插入指令

例子,dockerfile文件如下

FROM ubuntu:14.04

RUN apt-get update

RUN apt-get install -y nginx

ONBUILD COPY index.html /usr/share/nginx/html/ #使用本地编写的网页,替换nginx的默认页面

EXPOSE 80

ENTRYPOINT ["/usr/sbin/nginx","-g",daemon off;"]

构建此镜像 docker build -t "home/hong" .

然后按此镜像运行容器docker run -d -p 80 --name test0 home/hong

curl http://127.0.0.1:49169来查看页面,发现默认页面并没有改变

再写一个dockerfile文件

FROM home/hong

EXPOSE 80

ENTRYPOINT ["/usr/sbin/nginx","-g",daemon off;"]

再构建镜像docker build -t "test 1" .    在构建过程中发现触发了ONBUILD指令。

13. ARG

格式:ARG<name>[=<default value>]

解释:ARG指定了一个变量在docker build的时候使用,可以使用–build-arg <varname>=<value>来指定参数的值,不过如果构建的时候不指定就会报错。

原文地址:https://www.cnblogs.com/regit/p/8295712.html

时间: 2024-10-09 07:22:50

一张图学dockerfile的相关文章

(转)一张图学会Dockerfile

原文:http://blog.51cto.com/kusorz/1942816 前言 Dockerfile是非常容易学的,和SHELL相比那简单的太多了. Dockerfile是为快速构建docker image而设计的,当你使用dockerbuild 命令的时候,docker 会读取当前目录下的命名为Dockerfile(首字母大写)的纯文本文件并执行里面的指令构建出一个docker image.这比SaltStack的配置管理要简单的多,不过还是要掌握一些简单的指令. Dockerfile

开局一张图,学一学项目管理神器Maven

Maven强大的Java工程构建工具,做Java开发时少了跟Maven打交道,之前在知乎上看到有人提问:"学Java开发需不需要学习Maven?",个人认为是必需要学的,这和 工欲善其事必先利其器是一个道理,开发软件也要先把工具学好才能 事半功倍 啊.所以最近花了一点时间,将Maven的基础知识整理成一张脑力: 这篇文件主要简单介绍一些Maven中的概念,文章大致内容如下: 安装maven配置mavenmaven的命令语法maven的构建征集周期其他的一些高级特性如依赖.插件.sett

一张图搞清楚PMBOK所有过程的使用

很多参加PMP培训的学员大概都会有一个感受,上课时似乎每个知识点都听懂了,大的知识框架也弄明白了,但是所有这些串起来在实践中怎么用呀!说的再直接一点,在考试的时候这些过程和活动是以怎样的逻辑来应用的.不用捉急,看完下面这张图,您就清楚了. (1)注意启动那一栏中的"理解商业论证",要理解成为"理解项目的商业论证"(商业论证是项目立项的原因),因为商业论证将指导项目的所有活动,以确保在项目结束的时候来所有的投资都是值得的.对于商业论证的重要性,很多考生在考试中都不太注

几张图帮你理解 docker 基本原理及快速入门

写的非常好的一篇文章,不知道为什么被删除了.  利用Google快照,做个存档. 快照地址:地址 作者地址:青牛 什么是docker Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目.它基于 Google 公司推出的 Go 语言实现. 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护. Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docke

【算法】7 一张图体会栈和队列

栈和队列 学过没学过算法的应该都听过栈和队列了吧,往往容易弄混的就是"后进先出"和"先进先出"了. 今天又看到了"河内塔"的相关资料,也被称为"汉诺塔"等.于是就想到了画出下面这样的图案. 如果大家觉得这张图不错可以直接右键另存为哦,记得点赞哈~ 那么,关于栈和队列下面就直接列出相关操作的伪代码咯. 栈 STACK-EMPTY(S) 1 if S.top==0 2 return TRUE 3 else 4 return FLA

Nodejs学习笔记(三)——一张图看懂Nodejs建站

前言:一条线,竖着放,如果做不到精进至深,那就旋转90°,至少也图个幅度宽广. 通俗解释上面的胡言乱语:还没学会爬,就学起走了?! 继上篇<Nodejs学习笔记(二)——Eclipse中运行调试Nodejs>之后,代码编写环境就从Sublime转战到Eclipse下,感觉顺手多了.于是就跟着Scott老师学起了Nodejs建站的课程(推荐大家点进去看看),踏上了未爬先走的路子. 作为一个白里透白的小白来说,今天主要记录下如何用Nodejs搭建一个小小的网站,以及自己对于这种Nodejs建站的运

想了解Java后端学习路线?你只需要这一张图!

前言 学习路线图往往是学习一样技术的入门指南.网上搜到的Java学习路线图也是一抓一大把. 今天我只选一张图,仅此一图,足以包罗Java后端技术的知识点.所谓不求最好,但求最全,学习Java后端的同学完全可以参考这张图进行学习路线安排. 当然,有一些知识点是可选的,并不是说上面有的你都要会啦.我在复习秋招的过程中就是基于此图进行复习的,感觉效果还是不错的. 闲言少叙,我们还是看看这张图上都包含哪些有价值的信息吧.再次说明,本文只对路线图做一个简单地解读,仅供参考.大家可以根据自身情况来指定合理的

一张图说明环境变量

为了搞懂环境变量,做了一个小实验,体会到环境变量到底是什么样子的. [[email protected] ~]# cat 1.sh #!/bin/bash echo $n [[email protected] ~]# cat 22.sh #!/bin/bash export n=98 /root/1.sh 我在22.sh文件中定义了环境变量n,并且执行1.sh文件.在1.sh文件中执行echo $n  .然后我给两个文件都加上x权限,执行22.sh,我们将会得到什么呢? [[email prot

一张图看懂ANSYS17.0 流体 新功能与改进

一张图看懂ANSYS17.0 流体 新功能与改进 提交 我的留言 加载中 已留言 一张图看懂ANSYS17.0 流体 新功能与改进 原创2016-02-03ANSYS模拟在线模拟在线 模拟在线 微信号sim_ol 功能介绍这是数值模拟.仿真分析领域最大的公众号,没有之一!!! 点上方“模拟在线”查看更多“牛B”资讯! 感谢ANSYS公司对平台的友情支持,本次17.0的改进报告均为ANSYS提供(授权直接摘抄,确实给小编省事不少啊).本次首先带来是流体方面的改进和优化.后续陆续推送结构.电磁等各方