• 如何创建一个安全的Docker基础镜像


    http://geek.csdn.net/news/detail/61634

    背景


    我最初使用Docker的时候,每个人都在说它用起来有多简单方便,它内部的机制是有多么好,它为我们节省了多少时 间。但是当我一使用它就发现,几乎所有镜像都是臃肿而且不安全的(没有使用包签名,盲目相信上游的镜像库以curl | sh的方式安装),而且也没有一个镜像能实现Docker的初衷:隔离,单进程,容易分发,简洁。

    Docker镜像本来不是为了取代复杂的虚拟机而设计的,后者有完整的日志、监控、警报和资源管理模块。而Docker则倾向于利用内核的cgroups和namespaces特性进行封装组合,这就好像:

    在物理机器环境下,一旦内核完成了初始化,init进程就起来了。

    这也是为什么当你在Dockerfile的CMD指令启动的进程PID是1,这是与Unix中的进程机制类似。

    现 在请查看一下你的进程列表,使用top或者ps,你会看到init进程占用的也是这个PID,这是每个类Unix系统的核心进程,所有进程的父进程,一旦 你理解这个概念:在类Unix系统上每个进程都是init进程的子进程,你会理解Docker容器里不应该有无关的修饰文件,它应该是刚好满足进程运行需 要。


    如何开始



    以Java为例

    从零开始,思考你要构建一个最通用的基础容器,想想你的应用本身,它运行需要什么?

    可能性有很多,如果你要运行Java应用,它需要Java运行时;如果运行Rails应用,它需要Ruby解释器,对Python应用也一样。Go和其他一些编译型语言有些许不同,我以下会提到。

    在Java例子中,下一步要想的是:JRE需要什么依赖才能运行?因为它是让应用能运行的最重要的组件,所以很自然的下一步就是要想清楚JRE运行依赖于什么。

    而实际上JRE并没太多依赖,它本来就是作为操作系统的抽象层,使代码不依赖于宿主系统运行,因此安装好JRE就基本准备就绪了。

    (实际上,对操作系统的独立性并不是理所当然的事,有非常多的系统特有API和专有的系统扩展,但是便于举例,我们把注意力放在简单的情况下)

    在Linux上,JVM主要是调用系统的C语言库,Oracle的官方JRE,使用的是libc,也就是glibc,这意味着你要运行任何Java程序,都需要先装好glibc。另外你可能需要某种shell来管理环境,还有一个与外部通讯的接口,例如网络和资源的接口。

    我们总结一下Java应用示例需要的最低配置是:

    JRE,在例子中我们使用Oracle JRE
    glibc,JRE的依赖
    一个基础环境(包含网络、内存、文件系统等资源管理工具)


    走进Alpine Linux


    Alpine Linux最近得到很多关注,主要是因为它打包了一系列的经过验签的可信任的依赖,并且还保持体积在2MB!而在本文发布时,其他的一些镜像分发版如下:

    ubuntu:latest: 66MB (已经瘦身了非常多了,以前有些版本超过600MB)
    debian:latest: 55MB (同上,一开始是200MB以上的)
    arch:latest: 145MB
    busybox:latest: 676KB (是的!KB,我稍后会讨论它)
    alpine:latest: 2MB (2MB,包含一个包管理工具的Linux系统)

    Busybox是最小的竞争者?

    从上边的对比中你可以看到,在体积上唯一能打败Alpine Linux的是Busybox,所以现在几乎所有嵌入式系统都是使用它,它被应用在路由器,交换机,ATM,或者你的吐司机上。它作为一个最最基础的环境,但是又提供了足够容易维护的shell接口。

    在网上有很多文章解释了为什么人们会选择Alpine Linux而不是Busybox,在这总结一下:

    开 放活跃的软件包仓库:Alpine Linux使用apk包管理工具,它集成在Docker镜像中,而Busybox需要另外安装一个包管理器,例如opkg,更甚者,需要寻找一个稳定的包 仓库源(这几乎没有),Alpine的包仓库中提供了大量常用的依赖包,例如,如果你仍然需要在容器中编译NodeJS或Ruby之类的代码,可以直接运 行apk来添加nodejs和ruby,这在几秒内便可以完成。

    体积确实重要,但是当你在功能性,灵活性,易用性和1.5MB之间衡量,体积就不那么重要了,Alpine上添加的包使这些方面都大大增强了。

    广泛的支持:Docker公司已经聘请了Alpine Linux的作者来维护它,所有官方镜像,在以后都将基于Alpine Linux来构建。没有比这个更有说服力的理由去让你在自己的容器中使用它了吧。

    希云cSphere很早就意识到镜像越来越庞大的问题,因此在去年推出微镜像,也是引导大家如何更好地构建和理解镜像,镜像只是一种软件包格式而已。


    <script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
    阅读(44) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~
    评论热议
  • 相关阅读:
    minimsg升级扩展
    一起学习Avalonia(十三)
    @Import注解源码
    Python入门随记(3)
    NET WebApi 后端重定向指定链接
    Net Nlog 持久化到数据库
    NetCore Xunit单元测试依赖注入
    VS 调试时,提示无法启动iis服务器
    NET 反射,对可空类型动态赋值
    MSSQL 查询表结构
  • 原文地址:https://www.cnblogs.com/ztguang/p/12649650.html
Copyright © 2020-2023  润新知