| 
                        副标题[/!--empirenews.page--]
                         Kubernetes要从容器化开始,而容器又需要从Dockerfile开始,本文将介绍如何写出一个优雅的Dockerfile文件。 
  
文章主要内容包括: 
    - Docker容器
 
    - Dockerfile
 
    - 使用多阶构建
 
 
感谢公司提供大量机器资源及时间让我们可以实践,感谢在此专题上不断实践的部分项目及人员的支持。 
一、Docker容器 
1. 容器的特点 
我们都知道容器就是一个标准的软件单元,它有以下特点: 
    - 随处运行:容器可以将代码与配置文件和相关依赖库进行打包,从而确保在任何环境下的运行都是一致的。
 
    - 高资源利用率:容器提供进程级的隔离,因此可以更加精细地设置CPU和内存的使用率,进而更好地利用服务器的计算资源。
 
    - 快速扩展:每个容器都可作为单独的进程予以运行,并且可以共享底层操作系统的系统资源,这样一来可以加快容器的启动和停止效率。
 
 
2. Docker容器 
目前市面上的主流容器引擎有Docker、Rocket/rkt、OpenVZ/Odin等等,而独霸一方的容器引擎就是使用最多的Docker容器引擎。 
Docker容器是与系统其他部分隔离开的一系列进程,运行这些进程所需的所有文件都由另一个镜像提供,从开发到测试再到生产的整个过程中,Linux  容器都具有可移植性和一致性。相对于依赖重复传统测试环境的开发渠道,容器的运行速度要快得多,并且支持在多种主流云平台(PaaS)和本地系统上部署。Docker容器很好地解决了“开发环境能正常跑,一上线就各种崩”的尴尬。 
Docker容器的特点: 
    - 轻量:容器是进程级的资源隔离,而虚拟机是操作系统级的资源隔离,所以Docker容器相对于虚拟机来说可以节省更多的资源开销,因为Docker容器不再需要GuestOS这一层操作系统了。
 
    - 快速:容器的启动和创建无需启动GuestOS,可以实现秒级甚至毫秒级的启动。
 
    - 可移植性:Docker容器技术是将应用及所依赖的库和运行时的环境技术改造包成容器镜像,可以在不同的平台运行。
 
    - 自动化:容器生态中的容器编排工作(如:Kubernetes)可帮助我们实现容器的自动化管理。
 
 
二、Dockerfile 
Dockerfile是用来描述文件的构成的文本文档,其中包含了用户可以在使用行调用以组合Image的所有命令,用户还可以使用Docker  build实现连续执行多个命令指今行的自动构建。 
通过编写Dockerfile生磁镜像,可以为开发、测试团队提供基本一致的环境,从而提升开发、测试团队的效率,不用再为环境不统一而发愁,同时运维也能更加方便地管理我们的镜像。 
Dockerfile的语法非常简单,常用的只有11个: 
1. 编写优雅地Dockerfile 
编写优雅的Dockerfile主要需要注意以下几点: 
    - Dockerfile文件不宜过长,层级越多最终制作出来的镜像也就越大。
 
    - 构建出来的镜像不要包含不需要的内容,如日志、安装临时文件等。
 
    - 尽量使用运行时的基础镜像,不需要将构建时的过程也放到运行时的Dockerfile里。
 
 
只要记住以上三点就能写出不错的Dockerfile。 
为了方便大家了解,我们用两个Dockerfile实例进行简单的对比: 
- FROM ubuntu:16.04 
 - RUN apt-get update 
 - RUN apt-get install -y apt-utils libjpeg-dev       
 - python-pip 
 - RUN pip install --upgrade pip 
 - RUN easy_install -U setuptools 
 - RUN apt-get clean 
 
  
- FROM ubuntu:16.04 
 - RUN apt-get update && apt-get install -y apt-utils  
 -   libjpeg-dev python-pip  
 -            && pip install --upgrade pip  
 -       && easy_install -U setuptools  
 -     && apt-get clean 
 
  
我们看第一个Dockerfile,乍一看条理清晰,结构合理,似乎还不错。再看第二个Dockerfile,紧凑,不易阅读,为什么要这么写? 
    - 第一个Dockerfile的好处是:当正在执行的过程某一层出错,对其进行修正后再次Build,前面已经执行完成的层不会再次执行。这样能大大减少下次Build的时间,而它的问题就是会因层级变多了而使镜像占用的空间也变大。
 
    - 第二个Dockerfile把所有的组件全部在一层解决,这样做能一定程度上减少镜像的占用空间,但在制作基础镜像的时候若其中某个组编译出错,修正后再次Build就相当于重头再来了,前面编译好的组件在一个层里,得全部都重新编译一遍,比较消耗时间。
 
 
                                                (编辑:泰州站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |