博客
关于我
《容器高手实战: Dockerfile最佳实践》
阅读量:432 次
发布时间:2019-03-06

本文共 1521 字,大约阅读时间需要 5 分钟。

Dockerfile最佳实践指南

一个容器对应一个进程

Docker容器通常应对应一个特定的进程,这意味着一个Docker镜像一般只应包含一个应用的制品包(如.jar文件)。在需要运行多个进程的场景下,应使用容器组(如Docker Compose或Kubernetes Pod)。

选择合适的基础镜像

基础镜像的选用原则

  • 官方镜像优先:优先选择Docker官方提供的基础镜像。
  • 镜像简洁性:基础镜像应提供充分的支持,尽量简化Dockerfile的复杂性。
  • 镜像精简:尽量避免基础镜像中包含不必要的内容。
  • 明确标签:使用指定的版本标签,而非latest标签。

示例

FROM openjdk:8-jdk-stretch

Dockerfile构建优化

最少改动的步骤优先

将最少改动的步骤放在前面,以便重用前面的构建缓存,避免重复构建。Dockerfile的典型构建步骤如下:

  • 选择基础镜像
    FROM openjdk:8-jdk-stretch
  • 安装工具和环境
    RUN apt-get update && apt-get upgrade -y && apt-get install -y git curl \  && rm -rf /var/lib/apt/lists/*
  • 处理应用
    COPY jenkins.sh /usr/local/bin/jenkins.sh
  • 声明入口点
    ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/jenkins.sh"]
  • 暴露端口
    EXPOSE 8080
  • 多阶段构建

    如果需要多阶段构建,可将Dockerfile分为两部分:

  • 构建应用制品包(如.jar文件)
  • 将生成的制品包复制到镜像中
  • 减少镜像层数量

    尽量减少RUNCOPYADD命令的次数,以减少镜像层的数量。例如,安装工具时尽量在一行命令中完成:

    RUN apt-get install -y git curl

    Docker构建上下文优化

    使用.dockerignore文件

    在构建时,Docker会将PATH路径下的所有内容作为上下文传递给Docker Daemon。如果PATH路径包含过多不必要的文件,会导致镜像构建速度变慢。通过.dockerignore文件,可以忽略不需要的文件:

    .git.cache**/*.class*.md

    建议

    将Dockerfile和制品包(如.jar)放置在一个干净的新目录中,再进行构建:

    # docker-build.sh脚本示例#!/bin/bashset -o pipefaildocker build -t my-image .

    环境变量管理

    一次构建,多环境运行

    在Dockerfile中使用ENV指令定义环境变量,并在运行时通过docker run -e指定:

    ENV JENKINS_HOME=/var/jenkins_home

    常见混淆项

    ADDCOPY

    优先使用COPY指令。ADD虽然功能强大,但可以通过命令完成(如curl下载、tar解压)。

    CMDENTRYPOINT

    • CMD:用于指定镜像运行的入口命令,可与ENTRYPOINT同时使用。
    • ENTRYPOINT:用于指定镜像暴露的入口点,优先于CMD生效。

    ARGENV

    • ARG:构建时参数,可通过docker build --build-arg指定。
    • ENV:运行时参数,可通过docker run -e指定。

    最佳实践总结

    通过以上优化,您可以构建出高效、简洁且易于扩展的Docker镜像。遵循Dockerfile最佳实践,可以显著提升镜像构建速度和性能,同时减少镜像层的数量。

    转载地址:http://zavkz.baihongyu.com/

    你可能感兴趣的文章
    NodeJs学习笔记001--npm换源
    查看>>
    NodeJs学习笔记002--npm常用命令详解
    查看>>
    nodejs学习笔记一——nodejs安装
    查看>>
    vue3+Element-plus icon图标无法显示的问题(已解决)
    查看>>
    NodeJS实现跨域的方法( 4种 )
    查看>>
    nodejs封装http请求
    查看>>
    nodejs常用组件
    查看>>
    nodejs开发公众号报错 40164,白名单配置找不到,竟然是这个原因
    查看>>
    Nodejs异步回调的处理方法总结
    查看>>
    NodeJS报错 Fatal error: ENOSPC: System limit for number of file watchers reached, watch ‘...path...‘
    查看>>
    nodejs支持ssi实现include shtml页面
    查看>>
    Nodejs教程09:实现一个带接口请求的简单服务器
    查看>>
    nodejs服务端实现post请求
    查看>>
    nodejs框架,原理,组件,核心,跟npm和vue的关系
    查看>>
    Nodejs概览: 思维导图、核心技术、应用场景
    查看>>
    nodejs模块——fs模块
    查看>>
    Nodejs模块、自定义模块、CommonJs的概念和使用
    查看>>
    nodejs生成多层目录和生成文件的通用方法
    查看>>
    nodejs端口被占用原因及解决方案
    查看>>
    Nodejs简介以及Windows上安装Nodejs
    查看>>