工具|dockerfile

docker file是什么
dockerfile是用来构建docker镜像的文件,是由一系列命令和参数构建的脚本
构建步奏

  1. 编写dockerfile
  2. 使用dockerfile和docker build命令获得自定义镜像
  3. run
【工具|dockerfile】dockerfile基础知识
  1. 每条保留字指令必须大写字母且后面最少跟一个参数
  2. 指令按照从上到下依次执行
  3. #表示注释
  4. 每条指令都会创建新镜像,并对镜像进行提交
dockerfile 执行流程
  1. docker从基础镜像运行一个容器
  2. 执行一条命令并对容器修改
  3. 执行类型docker commit操作提交一个新的镜像层
  4. docker基于刚才提交的镜像运行新容器
  5. 执行dockerfile下一条指令,知道所有指令都执行完成
保留关键字
  1. FROM 基于哪个镜像
  2. MAINTAINER 镜像维护者和邮箱
  3. RUN 容器构建是需要运行的命令
  4. EXPOSE 当前容器对外暴漏的端口号
  5. WORKDIR 指定用户登录容器后,终端默认工作目录
  6. ENV 构建过程中设置环境变量
ENV $MY_PATH /usr/mytest--可以在后续RUN指令中使用,也可以在其他指令中使用WORKID $MY_PATH

  1. ADD 将文件copy到镜像,ADD会自动处理url和tar压缩包
  2. COPY copy文件和目录到镜像中
  3. VOLUME 数据卷,用于保存和持久化数据
  4. CMD 指定容器启动的命令
    –dockerfile可以有多个CMD指令,但只有最后一个生效,CMD会被docker run 之后的参数覆盖
  5. ENTRYPOINT 指定容器启动的命令
    – docker run 指定的参数会追加到ENTRYPOINT命令后
  6. ONBUILD 构建一个被继承的dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
dockerfile 案例
案例1 诉求:
  1. 进入镜像后默认目录为根目录
  2. 支持vim命令
FROM centos MAINTAINER lzc<1060905996@qq.com>ENV MYPATH /usr/local# 指定起始目录 WORKDIR $MYPATHRUN yum -y install vimEXPOSE 80CMD echo $MYPATH CMD echo "success ---------- ok" CMD /bin/bash

docker build -f /root/mydocker/Dockerfile2 -t mycentos:1.3 .
docker run -it mycentos:1.3 – 直接进入目录/usr/local,vim命令支持
列出镜像历史 docker history ce720531821d
IMAGECREATEDCREATED BYSIZECOMMENT ce720531821d5 minutes ago/bin/sh -c #(nop)CMD ["/bin/sh" "-c" "/bin…0B adfc449180df5 minutes ago/bin/sh -c #(nop)CMD ["/bin/sh" "-c" "echo…0B 598c523cf6e85 minutes ago/bin/sh -c #(nop)CMD ["/bin/sh" "-c" "echo…0B 1bd45d3aaf8b5 minutes ago/bin/sh -c #(nop)EXPOSE 800B 61542d686d1f5 minutes ago/bin/sh -c yum -y install vim66.9MB 127d673c4ce310 minutes ago/bin/sh -c #(nop) WORKDIR /usr/local0B ccd1700ce26910 minutes ago/bin/sh -c #(nop)ENV MYPATH=/usr/local0B 10c87392a37310 minutes ago/bin/sh -c #(nop)MAINTAINER lzc<1060905996…0B 0f3e07c0138f7 weeks ago/bin/sh -c #(nop)CMD ["/bin/bash"]0B 7 weeks ago/bin/sh -c #(nop)LABEL org.label-schema.sc…0B 7 weeks ago/bin/sh -c #(nop) ADD file:d6fdacc1972df524a…220MB

CMD和ENTRYPOINT区别 以tomcat为列,
# tomcat dockerfileEXPOSE 8080 CMD ["catalina.sh", "run"]

启动tomcat
docker run -it -p 7777:8080 tomcat --正常启动tomcatdocker run -it -p 7777:8080 tomcat ls -l --不启动tomcat,只是打印目录 CMD 命令被覆盖

docker run 之后的命令会被传递给ENTRYPOINT,之后形成新的命令组合
FROM centos RUN yum install -y curl CMD ["curl","-s","https://ip.cn"]

使用ENTRYPOINT代替CMD
FROM centos RUN yum install -y curl ENTRYPOINT ["curl","-s","https://ip.cn"]

编译镜像 : docker build -f /root/mydocker/Dockerfile4 -t mycentos:1.5 .
启动镜像 : docker run -it mycentos:1.5
启动镜像 : docker run -it mycentos:1.5 -i --返回http和请求头
– 相当于执行 curl -s https://ip.cn -i
ONBUILD docker build -f /root/mydocker/Dockerfile5 -t mycentos:1.6
FROM centos RUN yum install -y curl ENTRYPOINT ["curl","-s","https://ip.cn"] ONBUILD RUN echo "father onbuild ------8886"

docker build -f /root/mydocker/Dockerfile6 -t mycentos:1.7
FROM mycentos:1.6 RUN yum install -y curl ENTRYPOINT ["curl","-s","https://ip.cn"]

build执行时输出日志
# Executing 1 build trigger ---> Running in aff0f7dc847f father onbuild ------8886 Removing intermediate container aff0f7dc847f

    推荐阅读