新IT运维时代 | Docker运维之最佳实践-上篇

 

容器技术的发展能够分为两个阶段,第一个阶段聚焦在IaaS层,仅仅把容器当作更轻量级虚拟机来使用,解决了应用运行时进程级资源隔离的问题;随着Docker的出现,容器虚拟化才有了统一的平台,由此容器技术发展到了第二个阶段,开始聚焦在PaaS层,以应用为中心,统一应用分发标准,实现DevOps。html

 

本篇将针对操做系统、主机配置、容器镜像、容器运行时四大方面分享一些Docker的运维经验。nginx

 

操做系统docker

 

一、支持的操做系统类型json

 

目前Docker官方支持的操做系统包含桌面版、服务器版、云提供商以及容器操做系统,具体以下:centos

  • 桌面版:Mac、Windows;安全

  • 服务器版:Windows Server、Centos、Debian、Fedora、Oracle Linux、RHEL、SLES、Ubuntu;bash

  • 云提供商:AWS、Azure、阿里云等;服务器

  • 容器操做系统:RancherOS、CoreOS、Atomic、Photon;网络

 

二、操做系统的选择标准app

 

有关操做系统的选择不能一律而论。首先,企业自己也有对操做系统的规定;其次,应用的不一样也要求的操做系统不一样;基于以上两点,若没有其余要求,相对而言采用容器操做系统有很大的优点。

 

容器操做系统相对于其余操做系统的优点有如下几点:

 

  • 精简安全:容器操做系统只包含运行容器所需的必要软件和必要的管理工具,相比传统的操做系统而言会精简不少;全部应用经过容器的方式运行,从而使操做系统和应用软件隔离开来,极大下降了出现安全漏洞的几率;

  • 升级回滚:系统采用可回滚的双分区模式,活动的分区经过只读方式挂载,另一个分区用来自动更新, 经过切换系统分区便可实现快速升级,升级出现问题时,能够快速切换回原来的分区保证系统可用;

  • 集群模式:在系统安装的时候即可自动加入内置的ETCD集群中,每一个系统均可以经过本机的ETCD读取或发布配置信息和状态数据,经过选举形式在服务器之中选举Leader来同步数据,并以此确保集群以内信息始终可用;

 

主机配置

 

从安全性、稳定性、可靠性来说,如何合理规划Docker运行环境很是重要,也是

Docker运维的基础条件,下面会从容器分区、系统内核、Docker版本、Docker Daemon访问控制及日志审计来说讲怎么规划:

 

  • 单独为容器划分一个分区做为容器的存储空间:全部容器的数据、元数据默认都存储在/var/lib/docker下(固然能够修改docker容器默认的存储路径),很容易形成争抢磁盘空间,致使系统崩溃,推荐在内部存储中单独划分一个分区挂载到该目录上,一样的方法也可使用外部存储;

  • 使用比较新且稳定的Linux内核:官方推荐Linux内核版本为3.10+,可是有些功能模块要求的内核版本更高,如支持MacVlan网络模块就须要内核版本为3.9+,这个时候就得权衡一下Linux内核版本的选择,推荐采用该功能模块推荐的内核版本;

  • 使用比较新且稳定的Docker版本:官方推荐的Docker版本为1.9.1+,但从实施和运维经验来看,推荐选择比较稳定的1.12.1版本;

  • 只容许可信任的用户来控制Docker Daemon:Docker Daemon控制须要root特权,推荐将可信任的用户加入到一个组中,并将整个组授予root特权;

  • 增长Docker Daemon及其相关文件、目录的日志审计:Docker Daemon做为Docker的后台守护进程,对其访问控制、行为操做作日志审计是很是有必要的,一旦出现问题,很方便进行定位,推荐增长Docker文件(docker、daemon.json、docker.service、docker.sock)和目录(/var/lib/docker、/etc/docker、/usr/bin)的日志审计;

 

容器镜像

 

镜像是容器运行的基础,因此说镜像的安全很是重要,包括基础镜像的安全、软件包的漏洞、暴露的端口、SSH服务、非root用户等;

  • 使用可信任的镜像来建立容器:Docker官方或非官方的镜像有不少漏洞,若使用它们来运行容器,很容易被攻击,建议使用Docker官方认证过的镜像,或是本身构建的镜像(建议采用Alpine做为基础镜像),并经过漏洞扫描工具(如Clair);

  • 在容器里面尽可能不要安装没必要要的软件:没必要要的软件会占用磁盘的空间,也会增长系统的安全威胁。

  • 建立一个非root用户的容器:容器拥有root权限,很容易让人经过容器的root权限攻击所在的宿主机,能够在制做镜像的时候指定用户,如:RUN useradd -d/home/username -m -s /bin/bash username。

  • 开启Docker的Content Trust选项:Content Trust会将数据经过数字签名发送到远程的Docker Registries或是从远程的Docker Registries接收数据,用来保证镜像在build, create, pull, push, run过程当中没有被篡改,开启命令:export DOCKER_CONTENT_TRUST=1;

 

容器运行时参数

 

容器运行时的一些参数设置,在整个容器运行过程当中很是重要,设置很差会严重影响容器的安全性、性能,下面就讲讲容器运行时须要考虑设置的一些比较重要的参数:

 

  • 为容器建立一个AppArmor Profile文件:AppArmor Profile文件里面包含了各类威胁的安全策略,经过它能够保护宿主机系统和应用程序的各类威胁,设置参数如:docker run --interactive --tty--security-opt="apparmor:PROFILENAME" centos /bin/bash。

  • 开启SELinux Security选项:SELinux提供了强制访问控制,加强了自主访问模型,能够经过SELinux为系统增长一层额外的安全层,设置参数如:docker run --interactive --tty--security-opt label=level:TopSecret centos /bin/bash。

  • 为容器限制Linux内核的Capabilities能力:Linux把原来和超级用户相关的高级权限划分红为不一样的单元,称为Capability,这样就能够独立对特定的Capability进行开启或禁止,来增长容器的安全,设置参数如:

  • docker run --interactive --tty--cap-drop=all --cap-add={"NET_ADMIN","SYS_ADMIN"}centos:latest /bin/bash。以只读的模式挂载容器的root文件系统,设置参数如:docker run --interactive --tty--read-only --volume /centdata centos /bin/bash

  • 设置容器在失败的时候尝试重启的次数:若不设置的话,重启则会不断的尝试重启,参数如:docker run --detach--restart=on-failure:5 nginx。

  • 不要挂载宿主机上敏感的目录到容器上,或是以只读的方式挂载:

  • 如宿主机上这些目录:/、/boot、/dev、/etc、/lib、/proc、/sys、/usr;

  • 在容器里面最好不要运行ssh服务:使用docker exec 或 docker attach来查看容器实例;

  • 容器运行时不要映射privileged的端口:处于安全考虑,privileged的TCP/IP端口约束在1024如下,通常的用户是不能使用这个端口;

 

本篇的分享到此结束,下篇的分享将继续针对Docker Daemon参数和权限两个方面,敬请期待~

 

本文来源:http://www.youruncloud.com/blog/123.html