docker file是什么
dockerfile是用来构建docker镜像的文件,是由一系列命令和参数构建的脚本
构建步奏
- 编写dockerfile
- 使用dockerfile和docker build命令获得自定义镜像
- run
- 每条保留字指令必须大写字母且后面最少跟一个参数
- 指令按照从上到下依次执行
- #表示注释
- 每条指令都会创建新镜像,并对镜像进行提交
- docker从基础镜像运行一个容器
- 执行一条命令并对容器修改
- 执行类型docker commit操作提交一个新的镜像层
- docker基于刚才提交的镜像运行新容器
- 执行dockerfile下一条指令,知道所有指令都执行完成
- FROM 基于哪个镜像
- MAINTAINER 镜像维护者和邮箱
- RUN 容器构建是需要运行的命令
- EXPOSE 当前容器对外暴漏的端口号
- WORKDIR 指定用户登录容器后,终端默认工作目录
- ENV 构建过程中设置环境变量
ENV $MY_PATH /usr/mytest--可以在后续RUN指令中使用,也可以在其他指令中使用WORKID $MY_PATH
- ADD 将文件copy到镜像,ADD会自动处理url和tar压缩包
- COPY copy文件和目录到镜像中
- VOLUME 数据卷,用于保存和持久化数据
- CMD 指定容器启动的命令
–dockerfile可以有多个CMD指令,但只有最后一个生效,CMD会被docker run 之后的参数覆盖 - ENTRYPOINT 指定容器启动的命令
– docker run 指定的参数会追加到ENTRYPOINT命令后 - ONBUILD 构建一个被继承的dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
案例1 诉求:
- 进入镜像后默认目录为根目录
- 支持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
推荐阅读
- 工具|后天就是七夕节,你准备好了吗(送上几个七夕代码,展示你技能的时候到了!)
- Linux|109 个实用 shell 脚本
- linux笔记|linux 常用命令汇总(面向面试)
- Linux|Linux--网络基础
- linux|apt update和apt upgrade命令 - 有什么区别()
- 工具|Wireshark抓包对其字TCP段理解
- linux|2022年云原生趋势
- Go|Docker后端部署详解(Go+Nginx)
- 开源生态|GPL、MIT、Apache...开发者如何选择开源协议(一文讲清根本区别)