编写Dockerfiles的优秀实践
每个容器应该只有一个关注点。将应用程序解耦到多个容器可以更容易地水平伸缩和重用容器。例如,web应用程序栈可能由三个独立的容器组成,每个容器都有自己独特的镜像,以解耦的方式管理web应用程序、数据库和内存缓存。 限制每个容器只运行一个进程是一个很好的经验法则。但是,这并不准确。因为很多应用都会有很多进程。比如,Celery就会有很多worker进程。Apache每个request就会有一个进程。容器自己也有init进程。 所以,用你的严谨和专业来保持容器尽可能的干净和模块化。如果容器彼此依赖,可以使用Docker容器网络来确保这些容器能够通信。 保存最小数量的层 在老一点的docker版本中,保持层数的最少是非常重要的,因为要保证性能。 为了减少这样的限制,增加了一下的特性:
命令行参数排序 只要方便,可以通过对多行参数进行字母数字排序来简化后面的更改。这有助于避免包的重复,并使列表更容易更新。这也使得PRs更容易阅读和审查。在反斜杠()之前添加空格也有帮助。 下面是一个参数排列的例子:
利用构建缓存 在构建映像时,Docker逐步读取 Dockerfile中的指令,并且按照顺序执行。在检查每条指令时,Docker会在缓存中查找可以重用的现有镜像,而不是创建一个新的(重复的)镜像。 如果,你就是不想用cache,可以使用—no-cache=true来关闭在执行docker build的时候。当然,如果你开启了cacha,docker 在构建是找到缓存,如果没有匹配到,就创建新的镜像。 Docker遵循的基本规则如下:
一旦缓存失效,所有后续的Dockerfile命令都会生成新的镜像,而缓存则不被使用。 Dockerfile 指令这些建议旨在帮助您创建一个高效且可维护的Dockerfile。 FROM 只要可能,使用当前的官方镜像作为你的镜像的基础镜像。我们推荐Alpine镜像【https://hub.docker.com/_/alpine/】,因为编写这个镜像是非常严格的,并且很小(目前小于5 MB),但仍然是一个完整的Linux发行版。 LABEL 您可以将标签添加到镜像中,以帮助按项目组织镜像、记录许可信息、帮助实现自动化或出于其他原因。对于每个标签,用LABEL标记开始,用一个或者多个键值对 。下面的示例显示了不同的可接受格式。解释性注释是内联的。 必须引用带空格的字符串,否则必须转义空格。内部引号字符(")也必须转义。
一个镜像可以有多个标签。在Docker 1.10之前,建议将所有标签合并到一个标签指令中,以防止创建额外的层。这不再需要,但是仍然支持组合标签。
上面的这个例子还可以写成下面这样:
使用反斜杠() 来分隔独立的命令行可以使RUN命令更有可读性、易于维护。 APT-GET Apt-get 命令是很多Docker经常使用的命令。因为,他是安装各种包必须使用的命令。 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |