Docker:Dockerfile基础知识

Dockerfile

Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。

构建三步骤:

  • 编写Dockerfile
  • docker build
  • docker run

基础知识:

  • 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  • 指令按照从上到下,顺序执行
  • 表示注释

  • 每条指令都会创建一个新的镜像层,并对镜像进行提交

docker执行Dockerfile的大致流程

  1. docker从基础镜像运行一个容器
  2. 执行一条指令并对容器做出修改
  3. 执行类似docker commit的操作提交一个新的镜像
  4. docker再基于刚提交的镜像运行一个新容器
  5. 执行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 .

2020-09-17_214537
查看刚才创建的镜像的创建历史:
image-20200917220842513

总结

原文地址:https://www.cnblogs.com/wwjj4811/p/13688156.html