Docker学习笔记(三)-编写自己的Dockerfile
Dockerfile是什么Dockerfile用于快速创建自定义的Docker镜像,在上一篇博客中我们知道常见的三种创建image的手法,一般情况我们可以通过在基础镜像的基础上通过docker commit的方式生成新的image,但是对于这样的image是缺乏安全性的,我们很难确定在base image基础上镜像创建者安装了什么或者镜像包含什么不安全的因素,所以一个安全合理的image需要从..
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.0”
LABEL 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领域入了门哦~。
更多推荐
所有评论(0)