Dockerfile
Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
构建三步骤:
- 编写Dockerfile
- docker build
- docker run
基础知识:
- 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
- 指令按照从上到下,顺序执行
-
表示注释
- 每条指令都会创建一个新的镜像层,并对镜像进行提交
docker执行Dockerfile的大致流程
- docker从基础镜像运行一个容器
- 执行一条指令并对容器做出修改
- 执行类似docker commit的操作提交一个新的镜像
- docker再基于刚提交的镜像运行一个新容器
- 执行Dockerfile中的下一条指令直到所有指令都执行完成
Dockerfile面向开发,Docker镜像成为交付标准,Docker容器涉及部署与运维。三者合力充当Docker体系的基石。
Dockerfile保留字指令
FROM:基础镜像,当前新的镜像是基与哪个镜像
MAINTAINER:镜像维护者的姓名和邮箱地址
RUN:容器构建时需要运行的命令
EXPOSE:当前容器对外暴露出的端口
WORKDIR:指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
ENV:用来构建镜像过程中设置环境变量
ADD:将宿主机目录下的文件拷贝进镜像,且会自动处理URL和解压tar压缩包
COPY:拷贝文件和目录到镜像中(copy src dest || copy ["src","dest"])
VOLUME:容器数据卷,用于数据保存和持久化工作。
CMD:指定一个容器启动要运行的命令,Dockerfile中可以有多个CMD指令,但是 只有最后一个生效,CMD会被docker run之后的参数替换。
解释:执行命令 docker run -it -p 8080:8080 tomcat ls -l 后,ls -l 会替换tomcat中的Dockerfile最后的CMD ["catalina.sh" "run"],变成CMD ls -l,这样tomcat就会启动失败。如下图所示:
ENTRYPOINT:指定一个容器启动要运行的命令,docker run之后的参数会被当做参数传递给ENTRYPOINT,之后形成新的命令组合
ONBUILD:当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
LABEL:语法:LABEL
LABEL 指令将元数据添加到镜像。LABEL 是键值对。要在 LABEL 值中包含空格,请使用引号和反斜杠,就像在命令行解析中一样。
Base镜像(scratch)
Docker hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的。
举例:
官方centos8的Dockerfile:
FROM scratch
ADD centos-8-x86_64.tar.xz /
LABEL org.label-schema.schema-version="1.0" org.label-schema.name="CentOS Base Image" org.label-schema.vendor="CentOS" org.label-schema.license="GPLv2" org.label-schema.build-date="20200809"
CMD ["/bin/bash"]
编写自己的Dockerfile:
FROM centos
MAINTAINER wj<wj@qq.com>
ENV mypath /opt
WORKDIR $mypath
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 10000
CMD /bin/bash
构建命令:
docker build -t 镜像名:TAG .
执行刚才自定义的Dockerfile:
docker build -t wj/centos:1.2 .
查看刚才创建的镜像的创建历史: