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

容器技术的发展可以分为两个阶段,第一个阶段聚焦在IaaS层,仅仅把容器当做更轻量级虚拟机来使用,解决了应用运行时进程级资源隔离的问题;随着Docker的出现,容器虚拟化才有了统一的平台,由此容器技术发展到了第二个阶段,开始聚焦在PaaS层,以应用为中心,统一应用分发标准,实现DevOps。
本篇将针对操作系统、主机配置、容器镜像、容器运行时四大方面分享一些Docker的运维经验。
操作系统
1、支持的操作系统类型
目前Docker官方支持的操作系统包含桌面版、服务器版、云提供商以及容器操作系统,具体如下:
桌面版:Mac、Windows;
服务器版:Windows Server、Centos、Debian、Fedora、Oracle Linux、RHEL、SLES、Ubuntu;
云提供商:AWS、Azure、阿里云等;
容器操作系统:RancherOS、CoreOS、Atomic、Photon;
2、操作系统的选择标准
有关操作系统的选择不能一概而论。首先,企业本身也有对操作系统的规定;其次,应用的不同也要求的操作系统不同;基于以上两点,若没有其他要求,相对而言采用容器操作系统有很大的优势。

容器操作系统相对于其他操作系统的优势有以下几点:
精简安全:容器操作系统只包含运行容器所需的必要软件和必要的管理工具,相比传统的操作系统而言会精简很多;所有应用通过容器的方式运行,从而使操作系统和应用软件隔离开来,极大降低了出现安全漏洞的概率;
升级回滚:系统采用可回滚的双分区模式,活动的分区通过只读方式挂载,另外一个分区用来自动更新, 通过切换系统分区即可实现快速升级,升级出现问题时,可以快速切换回原来的分区保证系统可用;
集群模式:在系统安装的时候便可自动加入内置的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
新IT运维时代 | Docker运维之最佳实践-上篇的更多相关文章
- 新IT运维时代 | Docker运维之最佳实践-下篇
上篇针对操作系统.主机配置.容器镜像.容器运行时四大方面分享一些Docker的运维经验,本篇将着重在Docker Daemon参数和权限两个方面进一步分享.(阅读上篇请点击右侧:新IT运维时代 | D ...
- 8.云原生之Docker容器镜像构建最佳实践浅析
转载自:https://www.bilibili.com/read/cv15220861/?from=readlist 本章目录 0x02 Docker 镜像构建最佳实践浅析 1.Dockerfile ...
- [Docker] 写 Dockerfile 的最佳实践理论
指导方针 创建短暂的容器 意思是 container 可以停止和销毁,接着以最小化启动和配置进行重新构建和替换. 理解构建的上下文 使用 docker build ,当前工作环境称 ...
- [Docker] 容器开发环境最佳实践理论
保持 image 小 选择合适的 base image. 使用 multi-stage 构建. https://docs.docker.com/develop/develo ...
- Docker容器日志管理最佳实践
目录 一 .Docker 引擎日志 二.容器日志 2.1.常用查看日志命令--docker logs 2.2 .Docker 日志 驱动 三. 生产环境中该如何储存容器中的日志 一.当是完全是标准输出 ...
- Docker多主机互联最佳实践
在公司使用docker多主机互联时碰到了各种坑.搞清楚后才发现如此简单,以下是根据实际经验的总结. 版本信息 Client: Version: 18.09.0 API version: 1.39 Go ...
- Docker镜像原理和最佳实践
https://yq.aliyun.com/articles/68477 https://yq.aliyun.com/articles/57126 DockerCon 2016 深度解读: Dock ...
- DOCKER学习_008:Docker容器的运行最佳实践
一 容器分类 容器按用途大致可分为两类: 服务类容器,如 web server. database等 工具类容器,如cur容器, Iredis-cli容器 通常而言,服务类容器需要长期运行,所以使用 ...
- Docker笔记(十一):Dockerfile详解与最佳实践
Dockerfile是一个文本文件,包含了一条条指令,每条指令对应构建一层镜像,Docker基于它来构建一个完整镜像.本文介绍Dockerfile的常用指令及相应的最佳实践建议. 1. 理解构建上下文 ...
随机推荐
- webpack 4.0 版本的简单使用
webpack 4.0 学习指南 最近前端又要变天了,vue作者推出了vue-cli 3版本,并且里面使用了webpack 4. 但是webpack 3 和webpack 4 二者的使用方式完全不一样 ...
- Python 3网络爬虫开发实战》中文PDF+源代码+书籍软件包
Python 3网络爬虫开发实战>中文PDF+源代码+书籍软件包 下载:正在上传请稍后... 本书书籍软件包为本人原创,在这个时间就是金钱的时代,有些软件下起来是很麻烦的,真的可以为你们节省很多 ...
- BZOJ 2039:[2009国家集训队]employ人员雇佣(最小割)
http://www.lydsy.com/JudgeOnline/problem.php?id=2039 题意:中文题意. 思路:一开始想着和之前做的最大权闭合图有点像,但是如果把边全部当成点的话,那 ...
- django基础知识之自连接:
自连接 对于地区信息,属于一对多关系,使用一张表,存储所有的信息 类似的表结构还应用于分类信息,可以实现无限级分类 新建模型AreaInfo,生成迁移 class AreaInfo(models.Mo ...
- Visual Studio中Es6的开发环境搭建
1.打开终端,输入初始化代码.输入代码之后会在目录中出现package.json,可以在红色下划线上写上作者名和描述(不写也可以) npm init -y 2.安装Babel转换器 npm in ...
- 【深入浅出-JVM】(3):浮点数
-5 浮点数推导 二进制转十进制 1 10000001 01000000000000000000000 1 10000001 101000000000000000000000 如果指数位不全为 0 则 ...
- 剑指offer第二版-3.数组中重复的数
面试题3:数组中重复的数 题目要求: 在一个长度为n的数组中,所有数字的取值范围都在[0,n-1],但不知道有几个数字重复或重复几次,找出其中任意一个重复的数字. 解法比较: /** * Copyri ...
- 自己实现IOC容器,java代码实现简易版IOC容器,IOC容器实现的步骤分解
一.需求 实现一个简易的IOC容器,管理Bean,从IOC容器的BeanFactory中获取实例,从而取代自己new实例的做法. 二.实现步骤分析 三.具体代码实现 自定义注解类 MyComponen ...
- STM32F0_HAL库驱动描述——HAL驱动程序概述
HAL库文件结构: HAL驱动文件: 外设驱动API文件和头文件:包含了常见主要的通用API,其中ppp表示外设名称,如adc.usart.gpio.irda等: stm32f0xx_hal_ppp. ...
- 如何在vue中使用echart
1.安装echarts依赖 npm install echarts --save 2.在main.js中全局中引用 import echarts from 'echarts' Vue.protot ...