Dockerfile是什么

Dockerfile用于快速创建自定义的Docker镜像,在上一篇博客中我们知道常见的三种创建image的手法,一般情况我们可以通过在基础镜像的基础上通过docker commit的方式生成新的image,但是对于这样的image是缺乏安全性的,我们很难确定在base image基础上镜像创建者安装了什么或者镜像包含什么不安全的因素,所以一个安全合理的image需要从Dockerfile中构建

Dockerfile语法

工欲善其事,必先利其器。在开始编写Dockerfile之前,需要学习一下Dockerfile的基本语法:

FROM

Dockerfile第一条必须为FROM指令,为了安全尽量使用官方的base image,如果同一个Dockerfile创建多个镜像时,可使用多个FROM指令:

FORM scratch       #制作base image
FORM centos        #使用base image
FORM centos:14.04 #使用带版本的base image

LABEL

LABEL用于定义Metadata,包括作者信息,版本信息,描述信息:

LABEL maintainer=“starlihang@qq.com”
LABEL version=“1.0LABEL description=“hello docker”

RUN

RUN用于在镜像生成过程中执行一些操作命令,每次执行run都会生辰新的一层,为了美观复杂度RUN使用反斜杠换行,合并多条命令成一行,避免无用分层

* RUN yum update && yum -y install vim  #执行yum update并安装vim
* RUN /bin/bash -c 'source $HOME/.bashrc;echo $HOME'

WORKDIR

设定当前的工作目录,尽量使用WORKDIR切换工作目录,避免使用RUN cd!尽量使用绝对目录

WORKDIR /test  #切换到test目录,如果没有会自动创建test目录
WORKDIR hello
RUN  pwd       #输出当前目录为/test/hello

ADD and COPY

添加/复制文件到指定目录。优先使用COPY,ADD还有解压的作用,添加远程文件或目录使用curl或者wget:

ADD hello /         # 添加hello到根目录
ADD test.tar.gz /   # 添加到根目录并解压(COPY不会解压)
WORKDIR /root       # 切换到root目录
ADD hello test/     # /root/test/hello
WORKDIR /root
COPY hello test

ENV

设置常量,多使用常量增加可维护性

ENV MYSQL_VERSION 5,7    #设置常量
RUN apt-get install -y mysql-server="${MYSQL_VERSION}" #使用常量

CMD and ENTRYPOINT

CMD和ENTRYPOINT用于指定在容器启动时执行的命令,二者区别在于:

CMD:
    * 设置容器启动后默认执行的命令和参数
    * 如果docker run 指定了其它命令,CMD命令会被忽略
    * 如果定义了多个CMD,则只会执行最后一个
ENTRYPOINT:
    * 设置容器启动时运行的命令
    * 让容器以应用程序或者服务的形式运行(后台进程)
    * 不会被忽略,一定会执行
    * 常见使用方式:写一个脚本作为ENTRYPOINT去执行
PS:RUN是执行命令并创建新的image layer

VOLUME and EXPOSE

存储和网络设置,VOLUME创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据。EXPOSE 告诉Docker服务端容器暴露的端口号,供互联系统使用。在启动Docker时,可以通过-P,主机会自动分配一个端口号转发到指定的端口,如:

docker run -d -p 127.0.0.1:23333:22 centos6-ssh

容器ssh服务的22端口将被映射到宿主机的23333端口

编写自己的Dockerfile

基于上述的语法我们就可以构造安全合理清晰的image了,一个完整的Dockerfile分为四部分组成:基础镜像信息、作者信息、镜像操作指令和容器启动时执行指令,从最简单的开始,我们以基础镜像centos为基础,给它安装vim编辑器:

### 基础镜像信息
FROM    centos

### 作者信息
LABEL maintainer="starlihang@qq.com"
LABEL version="1.0"
LABEL description="hello docker"

### 镜像操作指令
RUN yum update && yum -y install vim  #执行yum update并安装vim
ENV HELLO "hello docker, it's my first dockerfile!"

### 容器启动时执行指令
CMD echo ${HELLO}

编写完Dockerfile后我们就可以构建image了,执行:

docker build -t starlh/hello-dockerfile .

我们指定image名字为starlh/hello-dockerfile,后面的点表示使用当前目录下的dockerfile进行build,构建完后通过docker images我们可以看到当前我们所有的image:
这里写图片描述

运行命令docker run starlh/hello-dockerfile,可以看到容器输出:

# docker run starlh/hello-dockerfile
hello docker, it's my first dockerfile!

至此,一个简单的dockerfile就诞生了,有了这个基础我们就可以编写或者读懂更加复杂的dockerfile,借助这个能力我们算是在docker领域入了门哦~。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐