Dockerfile是一个文本格式的配置文本,可以使用它来创建自定义的镜像。首先我们可以先看一个dockerfile是什么样子。这里可以有一个网站不错:http://dockerfile.github.io,可以在里面找到常用的开源软件的dockerfile.例如reids的dockersfile。如果在日常开发中用到的话,直接参考就行了,也是比较方便的。

#
# Redis Dockerfile
#
# https://github.com/dockerfile/redis
# # Pull base image.
FROM dockerfile/ubuntu # Install Redis.
RUN \
cd /tmp && \
wget http://download.redis.io/redis-stable.tar.gz && \
tar xvzf redis-stable.tar.gz && \
cd redis-stable && \
make && \
make install && \
cp -f src/redis-sentinel /usr/local/bin && \
mkdir -p /etc/redis && \
cp -f *.conf /etc/redis && \
rm -rf /tmp/redis-stable* && \
sed -i 's/^\(bind .*\)$/# \1/' /etc/redis/redis.conf && \
sed -i 's/^\(daemonize .*\)$/# \1/' /etc/redis/redis.conf && \
sed -i 's/^\(dir .*\)$/# \1\ndir \/data/' /etc/redis/redis.conf && \
sed -i 's/^\(logfile .*\)$/# \1/' /etc/redis/redis.conf # Define mountable directories.
VOLUME ["/data"] # Define working directory.
WORKDIR /data # Define default command.
CMD ["redis-server", "/etc/redis/redis.conf"] # Expose ports.
EXPOSE

DockerFile分为四部分组成:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。在这四部分中包含若干个指令。下面是指令的介绍。

1.FROM 基础镜像信息

指定所创建镜像的基础镜像。必须指定且需要在Dockerfile其他指令的前面。后续的指令都依赖于该指令指定的image。FROM指令指定的基础image可以是官方远程仓库中的,也可以位于本地仓库。格式:FROM <image>或FROM <image>:<tag>

2.MAINTAINER指定维护者信息

用于将image的制作者相关的信息写入到image中。当我们对该image执行docker inspect命令时,输出中有相应的字段记录该信息,格式:MAINTAINER <name>

3.RUN 运行指定命令

格式:RUN<command>或RUN["executable","param1","param2"].前者默认在shell终端中运行命令。即/bin/sh -c,后者则使用exec执行,不会启动shell环境,指定使用其他终端类型可以通过第二种方式实现例如RUN ["/bin/bash","-c",''each hello"].每条RUN指令将在当前镜像的基础上执行指定命令,并提交为新的镜像,当命令较长可以使用\来换行。

4.CMD

用于container启动时指定的操作。该操作可以是执行自定义脚本,也可以是执行系统命令。该指令只能在文件中存在一次,如果有多个,则只执行最后一条。格式:CMD["executable","param1","param2"].使用exec执行。CMD command param1 param2 在/bin/sh中执行,提供给需要交互的应用。 CMD ["param1","param2"]提供给ENTRYPORT的默认参数。

5.ENTRYPOINT

指定容器启动时执行的命令,可以多次设置,但是只有最后一个有效。

ENTRYPOINT ["executable", "param1", "param2"] (like an exec, the preferred form)  
ENTRYPOINT command param1 param2 (as a shell) 

该指令的使用分为两种情况,一种是独自使用,另一种和CMD指令配合使用。

当独自使用时,如果你还使用了CMD命令且CMD是一个完整的可执行的命令,那么CMD指令和ENTRYPOINT会互相覆盖只有最后一个CMD或者ENTRYPOINT有效。

另一种用法和CMD指令配合使用来指定ENTRYPOINT的默认参数,这时CMD指令不是一个完整的可执行命令,仅仅是参数部分;ENTRYPOINT指令只能使用JSON方式指定执行命令,而不能指定参数。

6.LABEL

给镜像添加信息。格式 LABEL <key>=<value>

7.EXPOSE

该指令会将容器中的端口映射成宿主机器中的某个端口。当你需要访问容器的时候,可以不是用容器的IP地址而是使用宿主机器的IP地址和映射后的端口。要完成整个操作需要两个步骤,首先在Dockerfile使用EXPOSE设置需要映射的容器端口,然后在运行容器的时候指定-p选项加上EXPOSE设置的端口,这样EXPOSE设置的端口号会被随机映射成宿主机器中的一个端口号。也可以指定需要映射到宿主机器的那个端口,这时要确保宿主机器上的端口号没有被使用。EXPOSE指令可以一次设置多个端口号,相应的运行容器的时候,可以配套的多次使用-p选项.

8.ENV

指定环境变量,格式ENV<key><value>或ENV <key>=<value>在镜像生成过程中会被后续的RUN指令使用,在镜像启动的容器中也会存在。也可以通过在docker run --env key=value时设置或修改环境变量。假如你安装了JAVA程序,需要设置JAVA_HOME,那么可以在Dockerfile中这样写:ENV JAVA_HOME /path/to/java/dirent.

9.ADD

所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0;如果是一个目录,那么会将该目录下的所有文件添加到container中,不包括目录;如果文件是可识别的压缩格式,则docker会帮忙解压缩(注意压缩格式);如果<src>是文件且<dest>中不使用斜杠结束,则会将<dest>视为文件,<src>的内容会写入<dest>;如果<src>是文件且<dest>中使用斜杠结束,则会<src>文件拷贝到<dest>目录下.格式:ADD <src> <dest> .<src> 是相对被构建的源目录的相对路径,可以是文件或目录的路径,也可以是一个远程的文件url;<dest> 是container中的绝对路径.

10.COPY

复制本地主机的src(为Dockerfile所在目录的相对路径、文件或目录)下的内容到镜像中的dest下,目标路径不存在时会自动创建。格式:COPY <src> <dest>.

11.VOLUME

使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用。我们知道容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。当容器中的应用有持久化数据的需求时可以在Dockerfile中使用该指令。格式:VOLUME ["/data"]

12.USER

设置启动容器的用户,默认是root用户。格式USER daemon。当服务不需要管理员权限时,可以通过该命令指定运行用户。

13.WORKDIR

为后续的RUN CMD ENTRYPOINT指定配置工作目录。格式 WORKDIR /path/to/workdir.

14.ONBUILD

配置当所创建的镜像作为其他镜像的基础镜像时所执行的创建操作指令。格式 ONBUILD [INSTRUCTION].

15.ARG

指定一些镜像内使用的参数(例如版本号信息等).这些参数在执行docker build命令时才以 --build-arg <varname>=<value>格式传入。格式:ARG <name>[=default value].可以用docker build --build-arg <name>=<value>来指定参数值。

上面基本就是主要的常用的指令,也算是把docker入门学了一下,其实docker还有很多东西,在以后的博客中会慢慢的学习,打算再分进阶、高级、实战来深入学习docker。

Docker入门之七Dockerfile的更多相关文章

  1. Docker 入门指南——Dockerfile 指令

    COPY 复制文件 格式: COPY [--chown=<user>:<group>] <源路径>... <目标路径> 源路径可以是多个,甚至可以使通配 ...

  2. docker入门1: Dockerfile介绍

    Dockerfile是为快速构建docker image而设计的,当你使用dockerbuild 命令的时候,docker 会读取当前目录下的命名为Dockerfile(首字母大写)的纯文本文件并执行 ...

  3. Docker 入门:Dockerfile

    主要内容: 什么是 Dockerfile 查看 DockerHub 中镜像的 Dockerfile Dockerfile 编写 Dockerfile 常用命令 什么是 Dockerfile 使用 Do ...

  4. Docker入门02——Dockerfile详解

    基本示例 FROM MAINTAINER LABEL RUN ADD COPY CMD ENTRYPOINT ENV EXPOSE VOLUME WORKDIR USER ARG 基本示例 # Thi ...

  5. Docker入门教程(三)Dockerfile

    Docker入门教程(三)Dockerfile [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第三篇,介绍了Dockerfile的语法,DockerOn ...

  6. Docker入门系列之三:如何将dockerfile制作好的镜像发布到Docker hub上

    这个系列的前两篇文章,我们已经把我们的应用成功地在Docker里通过nginx运行了起来,并且用dockerfile里制作好了一个镜像. Docker入门系列之一:在一个Docker容器里运行指定的w ...

  7. Docker 入门教程(3)——Dockerfile

    Dockerfile Dockerfile是一个文本文件,用来定制镜像. 镜像是分层存储的,前一层会是下一层的基础.而镜像的定制就是定制每一层镜像在上一层做了什么改变. Dockerfile其内包含一 ...

  8. Docker入门与实践之 Dockerfile 语法详解

    一.Dockerfile 概述 Dockerfile是docker程序的解释脚本文件,Dockerfile 是一条一条的指令,Docker程序将dockerfile中的一条条指令编译成Linux可执行 ...

  9. Docker入门与应用系列(五)Dockerfile

    Dockerfile是为快速构建docker image而设计的,当你使用dockerbuild 命令的时候,docker 会读取当前目录下的命名为Dockerfile(首字母大写)的纯文本文件并执行 ...

随机推荐

  1. 【Linux相识相知】yum的配置使用和程序包的编译安装

    在上一篇博客中,写到了如何使用rpm命令来安装.卸载软件等,但是大家都知道,各个软件包之间可能存在依赖关系,如果安装某个软件需要额外的依赖其他若干的包,那么我们就需要将其他额外的包一个一个的安装上去, ...

  2. Java Runtime 详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt219 那就首先说点Runtime类吧,他是一个与JVM运行时环境有关的类,这 ...

  3. 【转】Spring AOP 实现之CGLIB

    详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp91    cglib(Code Generation Library)是 ...

  4. NSMutable属性声明时为什么不能使用copy

    在iOS开发里面我们经常会进行NSMutable(可变类型的类,常用的如NSMutableString,NSMutableArray,NSMutableDictionary,NSMutableData ...

  5. 跨浏览器tab页的通信解决方案尝试

    目标 当前页面需要与当前浏览器已打开的的某个tab页通信,完成某些交互.其中,与当前页面待通信的tab页可以是与当前页面同域(相同的协议.域名和端口),也可以是跨域的. 要实现这个特殊的功能,单单使用 ...

  6. 第二次项目冲刺(Beta阶段)第一天

    a. 安排连续七天的敏捷冲刺. 2017.5.18完成冲刺计划安排 2017.5.20完善主页面 1st day(目前位置) 2017.5.21完善功能 2st day 2017.5.22添加自定义重 ...

  7. 201521123028 《java程序设计》 第7周学习总结

    1. 本周学习总结 2. 书面作业 Q1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 Ans: ArrayList的contains源代码 contain源代码 ...

  8. 201521123028 《Java程序设计》第5周学习总结

    1. 本周学习总结 2. 书面作业 Q1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误.并分析输出结果. Ch ...

  9. 201521123002《Java程序设计》第14周学习总结

    本次作业参考文件 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. MySql数据库简单操作: 库操作: 显示所有数据库: show databases; 创建数 ...

  10. 201521123019 《Java程序设计》第9周学习总结

    1. 本章学习总结 2. 书面作业 一.题目5-1.常用异常 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避免? 答:经常会出现Ar ...