Docker入门之七Dockerfile

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

#
# 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 6379
View Code

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

1.FROM 基础镜像信息github

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

2.MAINTAINER指定维护者信息docker

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

3.RUN 运行指定命令ubuntu

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

4.CMD ide

用于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。

相关文章
相关标签/搜索