ToB企服应用市场:ToB评测及商务社交产业平台

标题: DockerFile [打印本页]

作者: 天津储鑫盛钢材现货供应商    时间: 2024-9-12 05:08
标题: DockerFile
一、Dockerfile 概念

Dockerfile 是一个用于定义 Docker 容器镜像的文本文件。它包含了一组指令,告诉 Docker 如何构建镜像,这些指令包括从基础镜像开始,添加应用程序代码、安装依赖项、设置情况变量,以及设置启动命令等。
   执行Dockerfile build能够按照预先设定的指令构建好docker镜像举行使用。
  
构建步骤
● ① 编写 Dockerfile 文件。
● ② 使用 docker build 命令构建镜像。
● ③ 使用 docker run 命令根据天生的镜像运行容器。

基础知识
● ① 每条保留字指令都必须为大写字母 且后面要跟随至少一个参数。
● ② 指令按照从上到下的次序依次执行。
● ③ # 表示解释。
● ④ 每条指令都会创建一个新的镜像层并对镜像举行提交。

执行流程
● ① Docker 从基础镜像上运行一个容器。
● ② 执行一条指令并对容器举行修改。
● ③ 执行雷同 docker commit 的操作提交一个新的镜像层。
● ④ Docker 再基于刚才提交的镜像运行一个新的容器。
● ⑤ 依次类推,直到 Dockerfile 文件中的所有指令都执行完成。
   Docker 使用 联合文件体系来构建和管理镜像。联合文件体系允很多个文件体系层叠加在一起,从而创建一个单一的、统一的文件体系视图。Docker 中的每个镜像都由多个层组成,而容器则是镜像的可写副本。
    Docker采用联合文件体系,在Dockerfile中表现为每执行一个对应的指令就构建出了一个新的镜像,所有指令执行完成后就构建出了目的镜像。
  
从应用软件的角度来看,Dockerfile、Docker 镜像和 Docker 容器分别代表软件的三个差别的阶段:
○ Dockerfile 是软件的原质料。
○ Docker 镜像是软件的交付品。
○ Docker 容器则可以认为是软件镜像的运行态,即根据镜像运行的容器实例。
Dockerfile 面向开发,Docker 镜像成为交付标准,Docker 容器则涉及摆设和运维,三者缺一不可,协力充当了 Docker 体系的基石。

● Dockerfile 定义了进程需要的统统东西。Dockerfile 涉及的内容包括执行代码大概是文件、情况变量、依赖包、运行时情况、动态链接库、操作体系的发行版、服务进程和内核进程(当应用进程需要和体系服务以及内核进程打交道的时候,还需要思量如何计划 namespace 的权限控制)等等。
● Docker 镜像就是在编写了一个 Dockerfile 文件之后,使用 docker build 命令来产生一个镜像,当运行 Docker 镜像的时候会真正的提供服务。
● Docker 容器是直接提供服务的。
二、Dockerfile的保留字指令

指令分析FROM指定基础镜像,保举使用小镜像,scratch是一个空镜像,常用于多阶段构建。MAINTAINER指定维护着信息,已逾期,可以使用 LABEL xxx=yyy 来取代。RUNRUN 指令在当前镜像层顶部的新层执行任何命令,并提交结果,天生新的镜像层。CMD指定启动容器时默认的命令。比方 CMD [“sh”,“c”,“127.0.0.1”]ENTRYPOINT指定镜像的默认入口以及运行命令 。比方 ENTRYPOINT[“sh”,“c”,“127.0.0.1”]EXPOSE声明镜像内服务监听的端口,一样平常而言,此指令只有指导意义,如:SpringBoot 项目的端口是 8080 ,而指定的 EXPOSE 是 8090 ,当然依据 8080 了。ENV指定情况变量,可以在 docker run 的时候使用 -e 改变。ADD复制指定的 src 路径下的内容到容器中的 dest 路径下,src 可以为 url 会自动下载,也可以为 tar 文件,会自动解压。COPY复制本地主机的 src 路径下的内容到镜像中的 dest 路径下,但是不会自动解压等等。LABEL标注镜像的一些分析信息,常常用来指定维护者的信息。VOLUME创建数据卷挂载点,此处仅是指定挂载点不会绑定挂载目次,详细绑定要到run时指定。USER指定运行容器时的用户名或 UID 。WORKDIR设置工作目次,为后续的 RUN、CMD、ENTRYPOINT 指令设置工作目次。ARG指定镜像内使用的参数(如版本号信息等),可以在 docker build 的时候,使用 --build-args 改变。OBBUILD设置当创建的镜像作为其他镜像的基础镜像是,所指定的创建操作指令。STOPSIGNAL容器退出的信号值。HEALTHCHECK康健查抄。SHELL指定使用 shell 时的默认 shell 类型。
  1. FROM alpine
  2. RUN mkdir /demo && mkdir /app
  3. RUN echo 111 > /demo/a.txt
  4. RUN echo 222 > /app/b.txt
  5. # 挂载 容器指定的文件夹,如果不存在,会自动创建。
  6. # 指定了 VOLUME 指令后,即使启动容器的时候没有指定 -v 参数,也会自动进行匿名卷挂载。容器内的 /demo 和 /app ,需要在启动容器的时候,需要使用 -v 参数进行挂载。
  7. # VOLUME 挂载出去的东西,容器改变也不会最终在 docker commit 的时候生效。
  8. # -v 和 VOLUME 挂载出去的目录,主机变,容器里面也会发生变化,但是
  9. # ① docker commit 提交当前容器的所有变化为镜像,就会丢弃。
  10. # ② VOLUME [ "/demo","/app" ] 容器会自动挂载,在之后对这些目录所操作的变化,也会丢弃
  11. # ③ 挂载仅仅是为了将外边的数据同步到容器里面
  12. # VOLUME 的最佳实践是写在 CMD 或 ENTRYPOINT 前面
  13. VOLUME [ "/demo","/app" ]
  14. # 下面的 2 个 RUN 指令没有生效,因为 VOLUME 指定的挂载目录是固化配置,当执行到 VOLUME 的时候就已经写入到容器中了,即使后面容器怎么变,也不会改变。
  15. RUN echo 333 > /demo/a.txt
  16. RUN echo 444 > /app/b.txt
  17. CMD ping www.baidu.com
复制代码
三、虚悬镜像和多阶段构建

3 .1 虚悬镜像

虚悬镜像就是堆栈名和标签名都是 < none > 的镜像,俗称 dangling image。
使用 Dockerfile 写一个虚悬镜像:
  1. FROM ubuntu
  2. CMD echo 'action is success'
复制代码
Dockerfile构建后的镜像结果:

3.2 多阶段构建

多阶段构建的目的是让一个镜像变得更小,构建时耗费的资源更少。
示例: 通例package
  1. ### 我们如何打包一个 Java 镜像
  2. FROM maven
  3. WORKDIR /app
  4. COPY . .
  5. RUN mvn clean package
  6. COPY /app/target/*.jar /app/app.jar
  7. ENTRYPOINT java -jar app.jar
  8. ## 这样的镜像有多大?
  9. ## 我们最小做到多大??
复制代码
Docker底层采用的联合文件体系的多层构建提供了很大的操作空间,在构建项目的每一阶段只使用需要用到的资源,删除多余的资源,每一层都做到最小,达到镜像瘦身的目的。
示例: 多阶段package
  1. # 以下所有前提 保证 Dockerfile 和项目在同一个文件夹
  2. # 第一阶段:环境构建
  3. FROM maven:3.8.4-openjdk-8-slim AS builder
  4. WORKDIR /app
  5. # 此时有坑,想想 Maven 的标准目录结构
  6. COPY src ./src/
  7. COPY pom.xml .
  8. RUN mvn clean package -Dmaven.test.skip=true
  9. # 第二阶段,最小运行时环境,只需要 jre;第二阶段并不会有第一阶段哪些没用的层
  10. # jdk springboot-actutor(jdk)
  11. FROM openjdk:8u282-slim
  12. LABEL maintainer="xxxx@qq.com"
  13. # 从上一个阶段复制内容
  14. COPY --from=builder /app/target/*.jar /app.jar
  15. # 修改时区
  16. RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone && touch /app.jar
  17. # 环境变量
  18. # docker run -e JAVA_OPTS="-Xmx512m -Xms64m" -e PARAMS="--spring.profiles.active=dev --server.port=8080" xxx
  19. ENV JAVA_OPTS=""
  20. ENV PARAMS=""
  21. # 运行 jar 包
  22. ENTRYPOINT [ "sh", "-c", "java -Djava.security.egd=file:/dev/./urandom $JAVA_OPTS -jar /app.jar $PARAMS" ]
复制代码

咔咔,Dockerfile详细构建可以问gpt,上边的保留字指令和示例可供参考。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4