xdays

Docker基础教程之镜像安全

上一篇我总结下了Docker的镜像构建,这一篇我来谈下镜像安全。

概述

安全一直是一个不出事没人关心等到出事的时候也已经晚了的话题,以我目前的了解成熟的项目基本没有,而且比较知名的就是Docker Cloud和Quay.io在收费版里集成了安全扫描的功能。本文主要是我以 A Scan of the Container Vulnerability Scanner Landscape 这篇文章为线索,实战了其中的Anchore和Clair两个项目的简单介绍,后续还会持续观察更新。这类工具的共同特点就是静态分析镜像里的内容,找出其中的软件包和对应的版本,然后和从各大Linux版本的CVE源下载漏洞数据库做匹配,最终判断镜像里的安全漏洞。

Anchore

项目地址在这里 。总体来说anchore还是比较简陋,其对应的 SaaS服务 也是处于比较初级的阶段,还有待观察。

安装配置

yum install epel-release && yum install -y python-pip rpm-python dpkg
pip install anchore
anchore feeds sync

实战演示 ...

Docker基础教程之镜像构建

这个系列已经好久没更新了,上一篇我总结了目前主流的镜像存储方案,这一篇总结下Docker的镜像构建

Dockerfile

这是Docker官方的构建镜像的方案,其背后的思想和早在Docker诞生之前就已经广泛使用的配置管理工具(puppet, ansible, chef等)是一样的,就是说你只需要用一个文件来描述你想要的镜像是什么样的,然后Docker会依据Dockerfile来build出来目标镜像,并且你在Dockerfile里的指令就是对应最终镜像的每一层,这样就可以充分利用镜像分层复用的优势了。只不过不同点在于目前主流的配置管理工具在你的描述文件和实际运行的系统命令之间进行了一层抽象,这样就大大降低了学习的成本也便于复用代码(puppet的module, ansible的role),而Dockerfile来的就比较直接,你直接写shell命令,其优缺点也就是shell的优缺点了。总结来说,Dockerfile通过定义一些指令提供了一种可重复构建镜像的方式。

这一小节我只针对常用的指令进行一个介绍,更多关于Dockerfile的每个指令的详细解释不是本文的重点,你可以在用的时候参考这里

FROM centos

ADD iami.txt /root/
RUN echo "Hello World!" > /root/iami.txt

EXPOSE 80
CMD ["cat", "/root/iami.txt"]

指令解释:

  • FROM 指定要build的镜像是基于哪个镜像build的 ...

Docker基础教程之镜像存储

上一篇我总结下了Docker的基本概念,这一篇我来重点总结下目前主流的镜像存储的方案。

Registry

总体上来说,我这里的方案是启动一个仅支持http的registry服务,然后在前面放一个nginx来终结https请求和用户验证(basic auth或者通过第三方模块来集成LDAP)。

启动registry

docker run -d -p 5000:5000 --restart=always --name registry \
    -v /data:/registry/var/lib/registry registry:2

编译安装nginx

mkdir /opt/source
git clone https://github.com/kvspb/nginx-auth-ldap.git
git clone https://github.com/openresty/headers-more-nginx-module.git
wget -O ...

Docker基础教程之基本概念

简介

本文是整个系列教程的第一篇,我将从一个使用者的角度向你展示其中几个技术:namespace, cgroups, veth, bridge, copy-on-write, image 和 container。整个容器技术的核心包括namespace和cgroup两个部分,其中namespace负责资源隔离,cgroups负责资源限制。而Docker在这两个技术之上提出了几个重要概念让容器技术得以流行。

如果你刚接触Docker请参考我另外两篇文章:

安装

官方提供了很方便的安装脚本,只需运行如下命令即可安装完成:

curl -s https://get.docker.com | bash

namespace

Namespace是Linux在内核级别的隔离技术,它可以让进城拥有自己独立的进程号,网络,文件系统(类似chroot)等,不同namespace下的进程之间相互不可见。因为系统是通过底层的系统调用来提供namespace功能的,所以并没有用户态的管理namespace的工具,关于怎么创建具体类型的namespace可以参考酷壳的两篇文章Docker基础技术:Linux Namespace(上)Docker基础技术:Linux Namespace(下),但是等进程在namespace启动之后有时候我们需要进入到进程的运行环境来debug等操作。

目前的Docker版本已经可以通过exec子命令直接切换到进程所在的namespace ...

Docker基础教程

回首一看,又有一个多月没有更新博客了。最近工作上发生了一些变动:公司裁员,无论主动的还是被动的,多数人拿了补偿走人了;而因为我做的还可以公司希望我留下,然而当我选择离开时公司认为我是主动离职不支付赔偿,我问了下律师被告知公司从法律上没有什么问题,也就作罢。趁工作交接之际,我整理下近两年多自己的容器领域的技术积累,算是给自己的一个总结,如果能对于别人有所帮助,幸甚至哉!

我要总结的第一个系列是Docker,我从14年开始使用Docker,大概是0.5或者0.6的版本,一路过来见证了Docker从一个小而美发展成了大而全的项目,也见证了整个容器生态圈的蓬勃发展。简单整理了下这个系列的大纲:

Docker详解

说明 本文档来自前段时间写的一个slide,由于remark没有很好的支持嵌入到HTML中,只能把markdown搬过来了。

Docker

by 张向军


Agenda

  • 简介

  • 概念

  • 基础

  • 高级

  • 扩展


简介

  • 针对可移植的应用的简单轻量虚拟环境
  • 基于容器提供沙箱,基于cgroup和namespace做到资源的隔离
  • 快速,启动容器就是启动进程
  • 轻量,只需要应用运行的依赖
  • 容器即目录,故传输方便
  • 使用aufs或者devicemapper等技术作为存储引擎,节省空间
  • 仓库机制,可相互分享,搜索等

概念

  • cgroups

  • lxc

  • aufs

  • devicemapper

  • namespace


概念-cgroups

cgroups全称control groups,是linux内核提供的一种限制、记录和隔离进程组所使用物理资源的一种机制。在2.6.24之后的内核中都已经支持cgroups。详细的介绍请参考cgroups详解cgroups官方文档

应用场景: 进程隔离 资源统计 ...

Docker打造开发环境

背景

我一直想要打造这样一个干净且高效的开发环境:干净指与开发隔离,不污染物理机,我已经讨厌重装系统了;高效是指自动化,我需要每次都安装一对依赖,修改一些配置文件等等繁琐的操作,而且自动化过程要快。最开始自己用virtualbox新建虚拟机然后用其自带的克隆功能复制出来;后来用vagrant配合一些配置工具能达到不错的效果,一个文件即可生成开发环境,这应该是主流了,但是这种方式有个缺点就是太慢;现在我自己用docker+supervisor摸索了一个更快的方案。

组件

  • supervisor,管理所有进程
  • sshd,可以登陆到container里,修改代码调试代码
  • app,实际跑的项目

具体运行流程如下: ​

docker -startup-> 运行supervisor ->管理(sshd,项目进程)
                  -> dump出环境变量供远程ssh使用

组件配置

supervisor

supervisor的配置关键就是要让其前台运行,具体配置如下:

[inet_http_server]
port=0.0.0.0:9001
username=root
password=thinkin

[supervisord]
logfile=/tmp ...

Docker初识

简介

如官方文档所说,docker是一个自动将应用打包成轻量可移植自包涵的容器的引擎。开发者构建的应用可以一次构建全平台运行,包括本地开发机,生产环境,虚拟机和云等。目前处于开发阶段,不可用于生产环境。在你启动一条命令时docker会调用lcx等其他一个组建为这条命令构建一个container,包含了进程运行的所有资源。但是官方文档以说明,docker处于开发阶段目前还不能用于生产环境。

特性

  • Go语言编写
  • 基于lxc的进程级隔离,而lxc基于cgroup,轻量级
  • 通过cgroup做到文件系统,网络和资源的隔离
  • 使用aufs文件系统存储,写时复制,相同数据只保存一份,节省空间
  • 源机制,可相互分享,搜索等

概念

cgroups

cgroups全称control groups,是linux内核提供的一种限制、记录和隔离进程组所使用物理资源的一种机制。在2.6.24之后的内核中都已经支持cgroups。详细的介绍请参考cgroups详解

lxc

lxc全称是linux container,是基于cgroups和chroot等内核特性的一组工具,用于构建虚拟环境。通过一系列的命令行工具可以创建,修改,删除虚拟环境。具体用法可参考ubuntu官方文档

aufs

aufs全称是advance ...