容器技术的发展可以分为两个阶段,第一个阶段聚焦在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运维之最佳实践-上篇的更多相关文章

  1. 新IT运维时代 | Docker运维之最佳实践-下篇

    上篇针对操作系统.主机配置.容器镜像.容器运行时四大方面分享一些Docker的运维经验,本篇将着重在Docker Daemon参数和权限两个方面进一步分享.(阅读上篇请点击右侧:新IT运维时代 | D ...

  2. 8.云原生之Docker容器镜像构建最佳实践浅析

    转载自:https://www.bilibili.com/read/cv15220861/?from=readlist 本章目录 0x02 Docker 镜像构建最佳实践浅析 1.Dockerfile ...

  3. [Docker] 写 Dockerfile 的最佳实践理论

      指导方针   创建短暂的容器   意思是 container 可以停止和销毁,接着以最小化启动和配置进行重新构建和替换.   理解构建的上下文   使用 docker build ,当前工作环境称 ...

  4. [Docker] 容器开发环境最佳实践理论

      保持 image 小       选择合适的 base image.       使用 multi-stage 构建. https://docs.docker.com/develop/develo ...

  5. Docker容器日志管理最佳实践

    目录 一 .Docker 引擎日志 二.容器日志 2.1.常用查看日志命令--docker logs 2.2 .Docker 日志 驱动 三. 生产环境中该如何储存容器中的日志 一.当是完全是标准输出 ...

  6. Docker多主机互联最佳实践

    在公司使用docker多主机互联时碰到了各种坑.搞清楚后才发现如此简单,以下是根据实际经验的总结. 版本信息 Client: Version: 18.09.0 API version: 1.39 Go ...

  7. Docker镜像原理和最佳实践

    https://yq.aliyun.com/articles/68477 https://yq.aliyun.com/articles/57126  DockerCon 2016 深度解读: Dock ...

  8. DOCKER学习_008:Docker容器的运行最佳实践

    一 容器分类 容器按用途大致可分为两类: 服务类容器,如 web server. database等 工具类容器,如cur容器, Iredis-cli容器 通常而言,服务类容器需要长期运行,所以使用 ...

  9. Docker笔记(十一):Dockerfile详解与最佳实践

    Dockerfile是一个文本文件,包含了一条条指令,每条指令对应构建一层镜像,Docker基于它来构建一个完整镜像.本文介绍Dockerfile的常用指令及相应的最佳实践建议. 1. 理解构建上下文 ...

随机推荐

  1. 使用git提交时报错:error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 Request Entity Too Large

    Delta compression using up to 4 threads.Compressing objects: 100% (2364/2364), done.Writing objects: ...

  2. 开源joda-time使用demo

    开源joda-time 1.maven中引入 <dependency> <groupId>joda-time</groupId> <artifactId> ...

  3. 戴尔R720安装ESXI系统

    1.U盘安装系统,使用UltraISO制作启动盘 参考地址:https://jingyan.baidu.com/article/5225f26b0bb45fe6fa0908bc.html 2.插上U盘 ...

  4. 通过phpmyadmin设置数据库密码后若出现phpmyadmin拒绝访问的情况

    方法一:可以修改config.inc.php配置文件中的$cfg['Servers'][$i]['password'] = '你的密码'; 方法二:将config.inc.php配置文件中的$cfg[ ...

  5. 如何将 qsys 子模块设置为参数可调的方式给另外的qsys 调用

    Intel FPGA Quartus 软件中的 Qsys工具 也就是 Platform Designer 系统集成工具,可以 图形化界面操作 使用系统自带ip,自定义ip 系统自动生成 ip 间的连接 ...

  6. java Http工具类

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...

  7. 微服务-springboot日志配置

    springboot 默认会加载classpath:logback-spring.xml文件. springProfile 中的name名字对应application-xx.properties 中的 ...

  8. RT-Thread定时器以及结构体指针的一些思考

    定时器分为软件定时器和硬件定时器.顾名思义,软件定时器就是有操作系统提供的软件定时器,硬件定时器就是用硬件芯片提供的定时器. 而在RT-Thread操作系统提供的定时器是软件定时器,但是为了便于管理, ...

  9. 使用字蛛教程以及遇到的bug

    前言: 前段时间刚完成一个外项目,歇了几天,老大让我看看公司的官网,优化一下,发现移动端的字体下载特别慢,才发现引用了字体包,一个字体包就达到了11M,想着既然有了图片压缩,那么应该有字体压缩,所以百 ...

  10. python输出带颜色详解

    书写格式:     开头部分:\033[显示方式;前景色;背景色m + 结尾部分:\033[0m      注意:开头部分的三个参数:显示方式,前景色,背景色是可选参数,可以只写其中的某一个:另外由于 ...