定义
- dockerfile是用来构建docker镜像的构建文件,是由一系列命令和参数构成的脚本
- 构建三步骤
- 编写dockerfile文件
- docker build 编译dockerfile文件
- docker run 执行编译好的自定义镜像文件
dockerfile构建过程解析
dockerfile基础知识
- 每条保留字指令都必须为大写字母且后面至少一个参数
- 指令按照从上到下顺序执行
- #表示注释
- 每条指令都会创建一个新的镜像层,并对镜像进行提交
docker指定dockerfile的大致流程
- docker从基础镜像运行一个容器
- 执行一条指令对容器做出修改
- 执行类似docker commit的操作提交一个新的镜像层
- docker在基于刚提交的镜像运行一个新容器
- 执行dockerfile中的下一条指令知道所有指令都执行完成
dockerfile保留字
FROM
: 基础镜像,当前新镜像是基于那个镜像的MAINTAINER
:镜像维护者的姓名和邮箱RUN
:容器构建时需要执行的命令EXPOSE
:当前容器对外暴露的端口WORKDIR
:指定在创建容器后,终端默认登录进来的工作目录ENV
:当前镜像中的环境变量(ENV PATH 具体的绝对路径),设置的环境变量可以在后续的指令中直接使用ADD
:将宿主机目录下的文件拷贝进镜像,且会自动处理URL和解压tar包COPY
:类似add,拷贝文件和,目录到镜像中
- shell格式:
COPY src dest
- exec格式:
COPY ["src","dest"]
,指定了ENTRYPOINT
指令后,用CMD指定具体的参数
VOLUME
:容器数据卷,保存数据和数据持久化CMD
- 指定容器启动时要运行的命令
- dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
ENTRYPOINT
- 指定一个容器启动时要运行的命令
- ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数,ENTRYPOINT会在docker run命令执行时进行追加
ONBUILD
:类似于触发器,当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
案例
base镜像
- docker hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的
自定义镜像mycentos
编写
FROM centos
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN /bin/bash -c yum -y install vim
RUN /bin/bash -c yum -y install net-tools
EXPOSE 80
CMD echo "--------success---------"
CMD /bin/bash
构建
docker build -t mycentos:1.0 .
运行
docker run -itd --name mycentos mycentos:1.0
列出镜像的变更历史
CMD/ENTRYPOINT镜像案例
- 都是指定一个容器启动时要运行的命令
- CMD:dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
FROM centos:7
RUN yum install -y curl
CMD ["curl", "-s", "http://ip.cn"]
- ENTRYPOINT:之后的参数会被当做参数传递给ENTRYPOINT,之后形成新的命令组合
FROM centos:7
RUN yum install -y curl
ENTRYPOINT ["curl", "-s", "http://ip.cn"]
执行图