DockerFile介绍、编写dockerfile、构建(build)、运行(run)、实例

简介: >DockerFile是用来构建Docker镜像的构建文件,是由一系列命令参数构成的脚本。#### 二、DockerFile的一些规则* 每条保留字指令都必须为大写字母且后面要跟随至少一个参数* 指令顺序执行,遵循从上到下原则* #表示注释* 每条指令都会创建一个新的镜像层,并对镜像进行提交

注意:转载请注明出处
你的点赞与评论是我最大的创作动力!

在这里插入图片描述

一、简介

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

二、DockerFile的一些规则

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

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

三、docker执行DockerFile的大致流程

  • docker从基础镜像运行一个容器
  • 顺序执行一条指令对容器做出修改
  • 执行类似docker commit的操作提交一个新的镜像层
  • docker基于刚才提交的镜像运行一个新的容器
  • 执行DockerFile中下一条指令直到文件中的所有指令都执行完成

上述过程类似图:
dockerfile图

四、使用DockerFile构建镜像的步骤

  • 编写DockerFile文件
  • docker build
  • docker run

上述过程类似图:
dockerfile、docker镜像、容器

五、DockerFile的保留字指令

  • FROM:指定基础镜像
  • MAINTAINER:镜像维护者姓名及邮箱地址
  • RUN:容器构建时需要运行的命令
  • EXPOSE:当前容器对外暴露的端口号
  • WORKDIR:指定在创建容器后,终端默认登录进来的工作目录
  • ENV:用来在构建镜像过程中设置环境变量
  • ADD:将宿主机目录下的文件拷贝进镜像,ADD命令会自动处理URL和解压tar压缩包
  • COPY:拷贝文件、目录到镜像中。具体是将从构建上下文目录中<src原路径>的文件或目录复制到新一层镜像的<目标路径>位置 ,有两种写法:COPY src dest 或者 COPY ["src", "dest"]
  • VOLUME:容器数据卷,用于数据保存和持久化工作
  • CMD:指定一个容器启动时要运行的命令

    • 注意DockerFile中可以有多个CMD指令,但只有最后一个在启动时生效,CMD会被 docker run 之后的命令或参数覆盖
    • CMD指令的格式和RUN相似,也是两种格式:

      • shell格式:CMD <命令>
      • exec格式:CMD ["可执行文件", "参数1", "参数2" ...]
      • 参数列表格式:CMD ["参数1", "参数2", ...],在指定了ENTRYPOINT 指令后,用CMD指定具体的参数。
  • ENTRYPOINT:指定一个容器启动时要运行的命令,与CMD一样都是在指定容器启动程序及参数(下面通过实例2将他们的区别)。
  • ONBUILD:当构建一个被继承的DockerFile时运行命令, 父镜像在被子镜像继承后,父镜像的ONBUILD被触发。

关键字

六、实例

下面我们通过几个实际的案例来构建DockerFile。
实例一:
  • 需求:构建一个自己的centos镜像,使其具有登录后进入路径为/etc

并且支持vim命令及ifconfig命令,运行生成容器时并暴露5000端口。

  • 下面是具体的步骤,一步步跟着来实现
  • DockerFile的内容:

    FROM centos
    MAINTAINER lihongcheng<xxx@163.com>
    ENV ETCPATH /etc
    WORKDIR $ETCPATH
    RUN yum -y install vim
    RUN yum -y install net-tools
    EXPOSE 5000
    CMD echo "-----successful------"
    CMD /bin/bash

    上面内容中 FROM 父镜像为原生 centos,MAINTAINER 为作者邮箱名,ENV设置了一个环境变量 ETCPATH ,WORKDIR 设置了容器运行后默认进入的路径为ETCPATH变量指定的路径,RUN 运行两条构建时运行的命令,分别是用yum安装vim编辑器和net-tools网络调试工具(注意原生centos镜像具有yum指令),EXPOSE 指定了镜像生成运行实例容器对象时暴露的端口5000。第一个CMD只是运行在控制台打印一句话(不会最后启动生效,只是通常为了检测是否执行到这一步),第二个CMD表明运行时启动容器的/bin/bash终端。

  • build 命令来构建自己的 centos 镜像

    • 命令:docker build -f /path/DataFile -t 镜像名 [:TAG] .
    • /path/DataFile 是DataFile文件的路径,例:/mydocker/datafile.txt
  • run 命令来启动运行这个镜像生成的实例容器

    • 命令:docker run -it 镜像名[:TAG]
  • 查看 docker 镜像的运行历史(仅用于查看是如何运行的)

    • 命令:docker history 镜像名[:TAG]
实例二(主要用来区分CMD和ENTRYPOINT):
  • 需求:构建一个centos镜像,通过curl命令在启动容器后输出ip地址,在启动时添加 -i 选项,可以查看详细的报文信息。
  • Dockerfile内容两个版本

    FROM centos
    MAINTAINER lihongcheng<xxx@163.com>
    RUN yum -y install curl
    CMD ["curl", "-s", "http://ip.cn"]

    构建镜像、运行容器如上例,在运行容器实例后会由CMD命令输出ip地址的信息。但当使用命令:docker run -it 镜像名[:TAG] -i 来输出详细的报文时却显示错误,这是由于CMD关键字命令会被 docker run 之后的 -i 参数覆盖而并非在命令中添加一个 -i 选项。所以不满足上面需求。

    FROM centos
    MAINTAINER lihongcheng<xxx@163.com>
    RUN yum -y install curl
    ENTRYPOINT ["curl", "-s", "http://ip.cn"]

    将 CMD 关键字换成 ENTRYPOINT 后,使用命令:docker run -it 镜像名[:TAG] -i就可以输出详细信息,因为ENTRYPOINT关键字命令是可以将 docker run 之后 -i 选项加载到它的参数中执行,这就是 CMD 与 ENTRYPOINT 的区别。满足上面需求。

上一篇:https://blog.csdn.net/Chenftli/article/details/91444960

目录
相关文章
|
6月前
|
Java Shell Docker
Docker启动后怎样运行jar包文件
Docker启动后怎样运行jar包文件
|
Shell Docker 容器
dockerfile编写和构建运行
dockerfile编写和构建运行
|
前端开发 Docker 容器
Docker - build 命令后点号 & .dockerignore 文件
Docker - build 命令后点号 & .dockerignore 文件
693 0
Docker - build 命令后点号 & .dockerignore 文件
|
4月前
|
Linux 应用服务中间件 开发工具
Dockerfile编写
Dockerfile编写
40 3
|
6月前
|
Docker 容器
docker build -t和docker build -f区别
参数用于指定要使用的Dockerfile的路径,允许你在不同的位置使用不同的Dockerfile来构建镜像。
103 0
|
移动开发 前端开发 Java
Docker——使用Dockerfile构建SpringBoot项目(打包 & 部署 & 运行)
Docker——使用Dockerfile构建SpringBoot项目(打包 & 部署 & 运行)
2179 0
Docker——使用Dockerfile构建SpringBoot项目(打包 & 部署 & 运行)
|
Linux Shell Docker
docker--Dockerfile、构建 python 镜像
docker--Dockerfile、构建 python 镜像
|
Docker 容器
`target/demo.jar` 文件添加到 Docker 镜像
`target/demo.jar` 文件添加到 Docker 镜像
125 1
|
Linux Go Docker
goland如何把go项目打包进docker镜像
goland如何把go项目打包进docker镜像
420 0
|
前端开发 JavaScript Java
Shell脚本自动发布springboot到docker容器中
Shell脚本自动发布springboot到docker容器中
213 0