博客
关于我
再学dockerfile
阅读量:477 次
发布时间:2019-03-06

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

Dockerfile 指南:从基础到实战

前言

docker 的系统学习可以看我这篇博文,如果你想深入了解docker系统,推荐阅读我的另一篇博文。

简介

Dockerfile 是一个用于构建 docker 镜像的文本文件,它通过一系列指令逐步构建镜像。镜像的构建过程从基础镜像开始,每条指令都会生成新的镜像层,最终形成完整的镜像文件。

Dockerfile 的结构

Dockerfile 通常分为几个部分:

  • 基础镜像信息:镜像的来源。
  • 维护者信息:镜像的作者。
  • 镜像操作指令:包括文件复制、环境变量设置、运行命令等。
  • 容器启动时执行指令:定义容器启动时的默认命令。
  • 每条指令都以 # 开头的注释将被忽略,注释的内容不会被镜像构建过程执行。

    Dockerfile 的详解

    FROM

    指定镜像的基础镜像,且必须是 Dockerfile 中第一条非注释指令。如果没有指定基础镜像,默认使用 scratch

    语法:

    FROM # 或者FROM :
    # 或者FROM

    可以是镜像名称或镜像 ID。如果指定了

    ,可以指定镜像的标签。如果指定了
    ,可以指定镜像的摘要。

    每次使用 FROM 指令时,只需记录之前镜像的 ID。

    LABEL

    为镜像指定标签,key 和 value 可以重复,但建议每个 key 只使用一次。标签会继承基础镜像的标签,若 key 相同,值会覆盖。

    语法:

    LABEL key = value# 或者LABEL key1 = value1 \    key2 = value2

    ENV

    设置环境变量。

    语法:

    ENV key = value# 或者ENV key1 = value1 \    key2 = value2

    ADD

    将文件或目录复制到镜像中。如果源是 URL,会类似于 wget下载。如果源是多个文件,目标必须是目录。

    语法:

    ADD src/ /dest/

    COPY

    类似于 ADD,但只能复制本地文件。

    语法:

    COPY src/ /dest/

    RUN

    运行命令,构建镜像时会缓存结果。可以手动设置 --no-cache=true 来禁用缓存。

    语法:

    RUN command

    CMD

    容器启动时执行的命令。CMD 可以是 shell 命令或可执行文件。

    语法:

    CMD ["executable", "param1", "param2"]# 或者CMD command param1 param2

    ENTRYPOINT

    容器启动时默认执行的命令。

    语法:

    ENTRYPOINT ["executable", "param1", "param2"]# 或者ENTRYPOINT command param1 param2

    USER

    设置容器启动时的用户。需要确保容器内有该用户权限。

    语法:

    USER username# 或者USER uid

    VOLUME

    实现宿主机目录到容器的挂载。AUFS 不支持持久化数据,需手动指定。

    语法:

    VOLUME ["/data/"]

    WORKDIR

    设置工作目录,对 RUNNING 指令等生效。不存在则创建。

    语法:

    WORKDIR /path/to/workdir

    ONBUILD

    用于镜像构建时触发其他镜像构建。

    语法:

    ONBUILD RUN ls -l

    EXPOSE

    暴露容器中的端口。需要在运行时使用 -p 或 -P 将端口映射到主机。

    语法:

    EXPOSE 8080

    STOPSIGNAL

    设置容器停止时发送的信号,默认为 15。

    语法:

    STOPSIGNAL signal

    Dockerfile 中的变量

    $varname ${varname} ${varname:-default value} ${varname:+default value}

    原则及建议

  • 轻量化镜像:减少镜像层数,避免不必要的依赖。
  • 使用 .gitignore:清理构建目录,提高效率。
  • 分解服务:一个容器只做一件事,解耦复杂应用。
  • 减少镜像层:避免多个 LABEL、ENV 等标签。
  • 参数排序:安装包时按字母排序。
  • 构建缓存:默认启用,除非设置 --no-cache=true。
  • 实战

    我的另一篇博文详细讲解了 docker 实战经验。

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

    你可能感兴趣的文章
    PHP-GD库-分类整理
    查看>>
    php-laravel框架用户验证(Auth)模块解析(一)
    查看>>
    php-laravel框架用户验证(Auth)模块解析(三)登录模块
    查看>>
    php-laravel框架用户验证(Auth)模块解析(二)注册模块
    查看>>
    php-laravel框架用户验证(Auth)模块解析(四)忘记密码
    查看>>
    php-redis中文参考手册_Ping_echo_set_get_setex_psetex_...
    查看>>
    Redis使用不当导致应用卡死
    查看>>
    PHP-Shopify-API-Wrapper 使用教程
    查看>>
    php-兔子问题,斐波那契数列
    查看>>
    PHP-希尔排序
    查看>>
    PHP-快速排序的2种实现方法
    查看>>
    Redis使用lua脚本
    查看>>
    php-数据结构-二叉树的构建、前序遍历,中序遍历,后序遍历,查找,打印
    查看>>
    php-有序数组合并后仍有序
    查看>>
    redis使用
    查看>>
    Redis以及Redis的php扩展安装
    查看>>
    PHP-算法-最少比较次数获取最大值最小值
    查看>>
    php-约瑟夫问题
    查看>>
    Redis从库不能同步报Can’t save in background: fork: Cannot allocate memory错误
    查看>>
    Redis从入门到精通|干货篇
    查看>>