Dockerfile文件总结

Dockerfile文件总结

  • 基础概念
  • 关键命令
  • dockerfile解析
  • 执行命令

基础概念

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明

docker 删除镜像前需要先删除容器(docker ps -a 查看容器) 再删镜像

关键命令

配置命令

  • FROM
  • MAINTAINER
  • ARG 定义创建镜像中的变量
  • STOPSIGNAL 指定退出的信号值
  • SHELL 默认shell类型
  • HEALTHCHECK 健康检查
  • EXPOSE
  • WORKDIR
  • VOLUME
  • ENV
  • ENTRYPOINT
  • ONBUILD
  • USER

操作命令

  • ADD
  • COPY
  • RUN
  • CMD

FROM

FROM Dockerfile文件第开头必须是一个FROM命令 表示当前的镜像基于哪个父镜像

例如
FROM java8  使用java8作为父镜像  FROM 必须放在第一位

MAINTAINER

MAINTAINER 用来声明镜像的作者信息不是必须的
使用docker inspect 查看到作者信息

例如 
MAINTAINER  liuyijinag  liuyijinag@qq.com

ARG

定义创建镜像过程中的变量

ARG <name>[=default value]
可以使用 -build-arg= 来为Dockerfile中的变量赋值

HEALTHCHECK

可以使用HEALTHCHECK 来配置容器启动后的健康检查
配置文件可以参考 my-docker-demo-sp-goods/Dockerfile

HEALTHCHECK --interval=5s --timeout=2s --retries=12 CMD curl --silent --fail localhost:5599/health || exit 1

--interval=<间隔>:两次健康检查的间隔,默认为 30 秒。
--timeout=<间隔>:健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒。
--retries=<次数>:当连续失败指定次数后,则将容器状态视为 unhealthy,默认 3 次。
--start-period=<间隔>: 应用的启动的初始化时间,在启动过程中的健康检查失效不会计入,默认 0 秒(从 V17.05 引

未开启健康检查

在这里插入图片描述

开启后 在STATUS 出现健康状态

在这里插入图片描述

LABEL

LABEL 可以配置一些label 可以使用docker inspect 查看到不是必须的

例如 
LABEL base.name="test" 

RUN

RUN 执行命令,每执执行一个RUN指令就会在当前镜像上创建一个新的镜像层 接下来的指令在这个新镜像层上执行
执行多条命令使用 && 隔开 这样可以减少镜像层的数量

RUN 主要用于安装软件包

例如 
RUN apt-get update
RUN ["apt-get","update"]  //这种方式可将第一个字符串即(apt-get)理解成为可执行文件,后面就是两个参数
RUN yum install -y net-tools   #运行一些命令提前安装一些东西,容器内执行指定的指令,并把结果保存下来


执行多条命令使用 && 隔开 这样可以减少镜像层的数量
例如
RUN apt-get update && apt-get install

EXPOSE

EXPOSE 指定容器内进程对外开发的端口号,多个端口号之间用空格隔开
标记显示信息,不能直接打开端口,方便运维人员在使用容器时,知道要打开哪些端口
如果没有expose端口, Container之间服务也是可以互相访问的

例如
EXPOSE 80 18080  docker ps 的时候可以看到容器支持开启80 18080端口
也可在运行容器的时候使用-p 将主机的端口与容器的端口绑定  -p 8080:8080

ADD 与 COPY

ADD 与 COPY都可以向镜像中添加文件 ,文件可以是主机文件 ,网络文件 ,或者文件夹
也会增加一个新的层

例如
ADD aapp.jar  /server/aapp.jar  第一参数是主机上的原文件  第二个参数是容器中的文件文件

而ADD命令基本上是COPY命令的超集,可以实现一些方便、酷炫的拷贝操作。ADD 命令在增加了功能的同时也增加了使用它的复杂度,比如从 url 拷贝压缩文件时弊大于利。在不用自动解压工作或者添加远程文件到镜像中,同样需求下,官方推荐使用 COPY进行指令操作。

WORKDIR

WORKDIR 指定接下来的命令执行的所在目录,如果没有会自动创建

例如
WORKDIR /data/service

VOLUME

VOLUME 创建一个或多个指定的路径的挂载点,将容器内部的一个或多个文件夹挂载到主机上
注意:具体挂载到主机的哪个文件夹上需要使用docker inspect [容器id或容器名称] 查看 运行时查看

例如
VOLUME ["/data/service/logs","/docker/tmp"] 将容器内的/data/service/logs 和 /docker/tmp (没有文件夹会自动创建)挂载到主机上 (主机文件夹是docker自己随机创建的)

在这里插入图片描述

此方法不能指定挂载位置 如要指定挂载位置 需要使用 docker run -v 【主机文件夹】:【容器文件夹】

ENV

**ENV ** 设置容器环境变量 在运行容器的时候 通过-e参数可以修改变量值

ENV JAVA_INIT_PATH="/data/jdk" #设置一个环境变量 JAVA_INIT_PATH jdk就保存在这里

ENTRYPOINT 与 CMD

ENTRYPOINT 与 CMD 都是用来设置启动容器后的默认命令,ENTRYPOINT与 CMD不同的是 启动容器后面的命令对于CMD是覆盖 对于ENTRYPOINT是追加,

CMD 是给可执行文件传递参数 [“aa”,“pp”] 当容器启动时执行指定的指令(单独使用的时候)。如果还定义了 ENTRYPOINT ,该CMD指令将被解释为ENTRYPOINT 的参数

注意: 假如定义了多个 ENTRYPOINT 或 CMD 指令,那么只有最后一个生效,前面出现过的 CMD 指令全部无效

例如:
ENTRYPOINT ["nohup","java","-jar","my-docker-demo-springboot.jar","&"] 第一个字符串是命令,后面的字符串是参数

ONBUILD

ONBUILD 后面的命令不会在当前的build中执行 ,只会被子镜像执行 并且执行与子镜像FROM之后 的任意一个命令之前

ONBUILD构建当前镜像的时候不执行 只有构建基于当前镜像的镜像的时候执行

USER

USER 用于指定执行各种命令的用户 (在容器中最好不要使用root用户运行命令)

例如:
RUN groupadd -r java_runer_group && useradd -r -g java_runer_group java_runer 在容器内创建一个用户 useradd命令不用加密码那些
USER java_runer 使用创建的用户 

dockerfile解析

FROM ascdc/jdk8   使用父镜像
MAINTAINER liuyijiang 
WORKDIR "/data/service" 指定工作文件夹
VOLUME ["/data/service/logs","/docker/tmp"]  将容器内部的"/data/service/logs","/docker/tmp"两个文件夹对主机暴露
COPY my-docker-demo-springboot.jar my-docker-demo-springboot.jar 
EXPOSE 5678 开放容器5678端口
ENTRYPOINT ["nohup","java","-jar","my-docker-demo-springboot.jar","&"]

执行命令

使用 **docker build -t (或者–tag) ** 来创建镜像

例如:
docker build -t xxxxx .

建议是当前目录(由于构建环境上下文会被放进一个 tar 文件,然后传给 Docker 守护进程,因此你绝对不会希望使用一个含有大量文件的目录)

1 Dockerfile 中每一个命令为一个层,例如run指令中执行一些持久的进程,譬如数据库,但到了处理下一个指令或启动容器的时候,它们就已经不再运行了
2 如果你需要在启动容器的时候同时运行一个服务或进程,它必须从 ENTRYPOINT 或 CMD 指令中启动

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: DockerfileDocker 容器的构建文件,它包含了创建 Docker 容器所需的所有指令和信息。 要编写 Dockerfile,你需要遵循以下步骤: 1. 在文本编辑器中新建一个文件,并将其命名为 Dockerfile。 2. 在 Dockerfile 中指定基础镜像,使用 `FROM` 关键字。例如: ``` FROM ubuntu:20.04 ``` 3. 可以使用 `RUN` 关键字执行命令来安装软件包、创建文件夹、下载文件等。例如: ``` RUN apt-get update && apt-get install -y nginx ``` 4. 使用 `COPY` 关键字将本地文件文件夹复制到容器中。例如: ``` COPY /path/to/local/file.txt /path/to/container/file.txt ``` 5. 使用 `EXPOSE` 关键字指定容器对外暴露的端口。例如: ``` EXPOSE 80 ``` 6. 使用 `ENTRYPOINT` 关键字指定容器启动时运行的命令。例如: ``` ENTRYPOINT ["nginx", "-g", "daemon off;"] ``` 7. 保存 Dockerfile 并退出文本编辑器。 示例 Dockerfile: ``` FROM ubuntu:20.04 RUN apt-get update && apt-get install -y nginx COPY /path/to/local/file.txt /path/to/container/file.txt EXPOSE 80 ENTRYPOINT ["nginx", "-g", "daemon off;"] ``` 要使用 Dockerfile 构建 Docker 容器,你可以在终端中使用 `docker build` 命令。例如: ``` docker build -t my-image . ``` ### 回答2: Dockerfile是用于构建Docker镜像的脚本文件,它包含了一系列的指令和参数,用于定义构建镜像的步骤和配置。 编写Dockerfile的过程中,我们需要定义基于哪个基础镜像构建,可以选择官方提供的各种语言和操作系统的基础镜像。接着,我们可以使用COPY指令将本地文件或目录复制到镜像中,使用WORKDIR指定工作目录,RUN指令执行一些系统命令和安装软件的操作,并使用EXPOSE指令声明容器运行时的监听端口。 在编写Dockerfile时,我们还可以使用ENV指令设置环境变量,使用VOLUME指令指定容器中的挂载点,使用CMD或ENTRYPOINT指令定义容器启动时执行的命令或脚本。同时,我们还可以使用LABEL指令为镜像添加一些元数据,方便管理和标识。 编写Dockerfile的关键是要根据实际需求合理选择指令和参数,并按照正确的顺序和逻辑编写,以提高构建镜像的效率和稳定性。此外,使用Dockerfile还可以借助缓存机制,提高构建镜像的速度。 最后,在编写完Dockerfile后,我们可以使用docker build命令来构建镜像,根据Dockerfile中的指令和参数,自动化地完成构建过程。构建完成后,我们可以使用docker run命令来创建并运行基于这个镜像的容器总结来说,编写Dockerfile是一个描述和定义镜像构建过程的重要步骤,可以帮助我们更好地管理和部署应用程序。通过合理编写Dockerfile,我们可以方便地构建出符合需求的Docker镜像,提高开发和部署的效率。 ### 回答3: 编写Dockerfile是为了定义和构建Docker镜像的文件。下面是一个简单的示例Dockerfile: ``` # 使用基础镜像 FROM ubuntu:latest # 设置工作目录 WORKDIR /app # 复制应用程序代码到容器中 COPY . /app # 安装应用程序需要的依赖 RUN apt-get update && apt-get install -y python3 # 设置环境变量 ENV APP_NAME myapp ENV PORT 8080 # 暴露容器端口 EXPOSE $PORT # 运行应用程序 CMD [ "python3", "app.py" ] ``` 以上是一个基于Ubuntu镜像的Dockerfile示例。它首先指定了所使用的基础镜像,然后设置了工作目录并将应用程序代码复制到容器中。接下来是安装所需的依赖,这里以安装Python3为例。然后设置了一些环境变量,例如应用程序的名称和所使用的端口号。最后,通过EXPOSE指令暴露容器的端口,并通过CMD指令运行应用程序。 编写Dockerfile时,可以根据具体的需求,选择合适的基础镜像、设置工作目录、复制文件、安装依赖、配置环境变量、暴露端口和运行应用程序等步骤。编写完成后,可以使用`docker build`命令根据Dockerfile构建镜像,并使用该镜像创建和运行容器

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寂寞的4角钱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值