欢迎光临国标麻将

Docker容器构建最佳实践

深度 2020-06-07 01:158736

在容器和虚拟化广泛流行的今天,如何构建出一个安全、洁净的容器是大家都关心的问题。和安全领域对系统的要求一样"只安装必须的应用"的最小化原则也是容器构建的基本法则。一方面最小化的应用可以减小镜像的大小,节省上传下载的时间,同时减少了容器中的应用也就减少了可入侵点,使容器更安全。本文介绍我们给大家介绍了一套总结了业界实践的容器的最佳实践。目的是让容器构建更加快速,更安全,也更具弹性。本文假设读者有一定Docker和Kubernetes了解,但也可以单独作为Docker容器构建守则。

一个容器一个应用程序

当开始使用容器时,常见的一个误区是把容器当成虚拟机来使。这样做往往会让他们不能轻易满足某些需求而非常痛苦,同时也背离了容器的最大优势点。很多初学者在群里问了很多为么:为什么Docker不能aaa?怎么实现Dockerbbb?然后他需要的答案其实上只是需要一个虚拟。虽然现代容器已经可以满足这些需求,但是这会极大减弱容器模型的大多数优点。以经典的Apache/MySQL/PHP堆栈为例,你可能很想在一个容器中运行所有组件。但是,最佳实践是使用两个或三个不同的容器:Apache容器,MySQL容器,和运行PHP-FPM的php容器。

由于容器设计思想是容器和托管的应用程序具有相同的生命周期,因此每个容器应当只包含一个应用程序。当容器启动时,应用程序随之启动,当容器停止时,应用也会停止。

容器如果部署了多个应用,则它们有可能具有不同的生命周期或处于不同的状态。例如,一个正在运行的容器,但其核心组件之一突然崩溃或无响应。由于没有额外的运行状况检查,整个容器管理系统将无法判断容器是否健康。在Kubernetes集群中,容器默认是不会重启的。

有些公共镜像中可能会使用如下有一些的操作,但不遵循原则:

使用进程管理系统来管理容器中的一个或多个应用。使用bash脚本作为容器中的入口点,并使其产生多个应用程序作为后台作业。

信号处理,PID1和僵尸进程

Linux信号是控制容器内进程生命周期的主要方法。为了与前一条最佳实践保持一致,为了将应用程序的生命周期和容器关连,请确保应用程序能够正确处理Linux信号。其中最重要的一个Linux信号是SIGTERM,因为它用来终止进程。应用可能还会收到SIGKILL信号,用于非正常地终止进程,或者SIGINT信号,用于接受,键入的Ctrl+C指令。

进程标识符是Linux内核为每个进程提供的唯一标识符。PID具有名称空间,容器具有自己的一组PID,这些PID会被映射到宿主机系统的PID。Linux内核启动时会创建第一个进程具有PID1。用来init系统用来管理其他进程,比如systemd或SysV。同样,容器中启动的第一个进程也是PID1。Docker和Kubern@AnsonC@SEO@etes使用信号与容器内的进程进行通信。Docker和Kubernetes都只能向容器内具有PID1的进程发送信号。

Copyright © 2020 国标麻将 版权所有