Dockerfile介绍

简介

Dockerfile是docker构建镜像的基础,也是docker区别于其他容器的重要特征,正是有了Dockerfile,docker的自动化和可移植性才成为可能。 不论是开发还是运维,学会编写Dockerfile几乎是必备的,这有助于你理解整个容器的运行。

命令解释

FROM , 从一个基础镜像构建新的镜像
FROM ubuntu

MAINTAINER , 维护者信息
MAINTAINER William <wlj@nicescale.com>

ENV , 设置环境变量
ENV TEST 1

RUN , 非交互式运行shell命令
RUN apt-get -y update
RUN apt-get -y install nginx

ADD , 将外部文件拷贝到镜像里,src可以为url
ADD   http://nicescale.com/  /data/nicescale.tgz
# 将index.php复制到容器内的/var/www目录下
# 会自动解压tar包
ADD  index.php /var/www/

# 用copy而不用add,因为ADD指令会自动解压tar文件
COPY redis.tgz /home/redis.tgz

# 设置工作目录,exec进入容器就直接进入到这个目录中
WORKDIR /path/to/workdir
WORKDIR /var/www

USER , 设置用户ID
USER nginx

# 设置volume, 声明一个数据卷, 可用于挂载, []里面是路径
# 出于可移植和分享的考虑,用于-v主机目录:容器目录这种方法不能够直接在DockerFile中实现
# 可自行创建软链接实现特定目录挂载
VULUME <#dir>
VOLUME ['/data']

EXPOSE , 暴露哪些端口
EXPOSE 80 443

ENTRYPOINT ["executable", "param1","param2"]执行命令
ENTRYPOINT ["/usr/sbin/nginx"]

# 一般只用cmd就可以了
CMD ["param1","param2"]
CMD ["start"]
docker创建、启动container时执行的命令
如果设置了ENTRYPOINT,则CMD将作为参数
如果没有设置ENTRYPOINT, 则直接命令参数传入
  • 尽量将一些常用不变的指令放到前面
  • CMD和ENTRYPOINT尽量使用json数组方式

Dockerfile示例

  • 创建dockerfile
#使用的基础镜像
FROM centos
#作者信息
MAINTAINER by caiwen (xiaogang.zhou@qq.com)

WORKDIR /usr/local/src
#安装wget
RUN yum install -y  wget
#下载并解压源码包
RUN wget http://nginx.org/download/nginx-1.8.0.tar.gz
RUN tar -zxvf nginx-1.8.0.tar.gz
WORKDIR nginx-1.8.0
#编译安装nginx
RUN yum install -y gcc make pcre-devel zlib-devel
RUN ./configure   --prefix=/usr/local/nginx   --with-pcre
RUN make
RUN make install

#修改Nginx配置文件,以非daemon方式启动
RUN echo "daemon off;">>/usr/local/nginx/conf/nginx.conf

#开放22、80、443端口
EXPOSE 22
EXPOSE 80
EXPOSE 443

#设置生成容器时需要执行的脚本
CMD ["/usr/local/nginx/sbin/nginx","start"]
  • 构建镜像
docker build -t nginx:v1 .

参考:

Dockerfile介绍