Dockerfile
Dockerfile简介
1-Dockerfile基本介绍
基本结构
Dockerfile 是一个文本格式的配置文件,用户可以使用 Dockerfile 快速创建自定义镜像。
Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。
Docker分为四部分:
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动时默认要执行的指令
例如:
# This dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author: GIN
# Command format: Instruction [arguments / command] ...
# 第一行必须指定基于的基础镜像
FROM ubuntu
# 维护者信息
LABEL MAINTAINER='GIN 163@163.com'
# 镜像操作指令
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
# 容器启动时默认要执行的指令
CMD /usr/sbin/nginx
其中,一开始必须指明所基于的镜像名称,接下来一般会说明维护者信息。
后面则是镜像操作指令,例如RUN指令,RUN指令将对镜像执行跟随的命令。每运行一条RUN指令,镜像添加新的一层,并提交。
最后是CMD指令来指定运行容器时的操作指令。
2-Dockerfile构建过程
基础:
每条保留字指令必须为大写字母,且后面至少要跟随一个参数
指令按照从上到下,顺序执行
#表示注释
每条指令都会创建一个新的镜像层,并对镜像进行提交
从应用软件的角度看,DockerFile、Docker镜像与Docker容器分别代表软件的三个不同阶段:
- DockerFile是软件的原材料
- Docker镜像是软件的交付品
- Docker容器则可以认为是软件的运行态。
- DockerFile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。
详细解释:
- DockerFile,需要定义一个DockerFile,DockerFile定义了进程需要的一切东西。DockerFile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这是需要考虑如何涉及namespace的权限控制)等到。
- Docker镜像,在用DockerFile定义一个文件后,docker build会产生一个- Docker镜像,当运行Docker镜像时,会真正开始提供服务。
- Docker容器,容器直接提供服务。
3-Dockerfile指令用法
指令
指令的一般格式为INSTRUCTION arguments,指令包括:
FROM #基础镜像,当前镜像是基于哪个镜像的
MAINTAINER #镜像作者 姓名+邮箱
RUN #容器构建是需要运行的命令(构建镜像中执行一些命令,如Redis的DockerFile中的run命令建立用户组)
ADD #将宿主机目录下的文件拷贝进镜像,且 ADD命令会自动处理URL和解压tar文件
COPY #类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录<源路径>的文件/目录复制到新的一层的镜像内<目标路径>位置。
VOLUME #容器数据卷,用于数据保存和持久化工作
CMD #指定容器启动时要运行的命令。DockerFile中可以有多个CMD指令,但只有最后一个生效(覆盖),CMD会被docker run 之后的参数替换
ENTRYPOINT #指定容器启动时要运行的命令。ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序以及参数(但是不会被覆盖)
EXPOSE #当前容器对外暴露的端口
WORKDIR #指定在创建容器后,终端默认登录(启动后的工作目录)进来的工作目录,一个落脚点
ENV #用来在构建镜像过程中设置环境变量
ONBUILD #当构建一个被集成的DockerFile时运行命令,父镜像在被子集成后父镜像的ONBUILD被触发
格式为FROM 或FROM :。
第一条指令必须为FROM指令。并且,如果在同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令(每个镜像一次)。
LABEL MAINTAINER
格式为LABEL MAINTAINER ,指定维护者信息
RUN
格式为RUN 或RUN [“executable”,“param1”,“param2”]。
前者将在shell终端中运行命令,即/bin/sh -c;后者则使用exec执行。指定使用其他终端可以通过第二种方式实现,例如:
RUN ["/bin/bash","-c","echo hello"]
每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用 \ 来换行,例如:
RUN echo "hello world\nhello tom" > /tmp/abc && \
cat /tmp/abc
CMD
CMD支持三种