一、为什么要用docker
大家都知道,传统的VM解决的核心问题是资源分配的问题,那么容器解决的问题是什么呢?是应用开发、测试和部署。
docker是用go语言开发的,基于linux内核的CGroup、Namespace以及AUFS类的UnionFS技术,实现对进程进行封装隔离带轻量级的虚拟化技术之一。通过共享内核,能够把应用需要的运行环境、缓存环境、数据库环境封装起来,实现快速发布,自动运维,自动扩容,微服务等大技术,让小公司玩转大技术不再是梦想。
二、docker的优势
我们可以看一下docker官方宣称的几大作用吧。
1、实现代码端到端的发布流程,无缝的配置到各个测试环境之中,同时也可以迁移到任何环境之中,实现了底层和应用层的解耦。
2、容器级别的虚拟化可以实现资源的最大化应用,避免了系统级的资源浪费。
3、开发环境生产化,实现原生环境,最大限度模拟生产分布式部署的环境。
4、应用进程级的隔离,有利于微服务的解耦。
5、快速部署,秒级的应用启动速度,便于大规模集群的管理。
三、快速部署一个docker环境
1、以centos7环境为例
1.1、鉴于centos7自带的3的内核存在一些bug导致docker运行的不稳定,可升级内核为4.4.X 以上即可
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
yum –enablerepo=elrepo-kernel install -y kernel-lt
设置开机从新内核启动
grub2-set-default 0
1.2、设置yum源
yum-config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo
安装docker
yum install docker-ce
1.3、优化docker
1.3.1、优化docker存储位置
在/etc/docker/deamon.json中添加
“data-root”: “/mnt/docker-lib”
1.3.2、优化国内镜像源
在/etc/docker/deamon.json中添加
“registry-mirrors”: [“https://registry.docker-cn.com"]
四、简单谈论一下docker
1、容器的本质是什么呢?
容器可以简单的看作是CGroup、Namespace、Rootfs的集合。
1.1、Namespace是linux提供的一种内核级别的隔离方法。到目前为止,一共提供了Mount Namespace,UTS Namespace,IPC Namespace,PID Namespace,Network Namespace,User Namespace,其中centos7需要升级到3.8以上的内核才可以使用所有的namespace,不过出于稳定性考虑,建议升级到4.4.X以上的内核。
1.2.1、Cgroup是linux内核提供的一种资源控制的机制。细化的看,Cgroup提供了以下几个功能
a、资源限制,Cgroup会对不同进程使用的资源进行限制,设定使用上限,一旦超过这个限制便会发出警告,比如OOM。
b、优先级管理,Cgroup会对不同的进程分配CPU,IO资源。
c、资源统计,Cgroup可以统计系统的资源使用情况。
e、进程控制,对进程组进行挂起、恢复等操作。
f、进程组隔离,比如:使用ns子系统可以使不同的进程组使用不同的namespace,以达到隔离的目的,不同的进程组有各自的进程、网络、文件系统挂载空间。
所以从本质上来看,cgroup是内核附加在程序山的一系列钩子(hook),通过事件触发钩子以达到对资源的限制和追踪。
1.3、Rootfs是容器启动时内部的文件系统,也就是docker容器的根目录。在启动docker容器时,会先为容器挂载Rootfs,并设定为只读模式,同时采用union mount技术,在Rootfs上挂载一个读写的空文件系统。
2、接下来谈谈docker的网络架构
众所周知,docker网络有四种模型,bridge,host,container,none
2.1、bridge
网络模型如下图
docker会为容器创建独有的network namespace,也会为这个命名空间配置好虚拟网卡,路由,DNS,IP地址与iptables规则(也就是sandbox的内容)。
2.2、host模式
在这个模式下,容器和宿主机共享一个network namespace,而不会单独获得单独的network namespace。这意味着,容器不会单独配置网卡,IP地址,而是用宿主机的,但是在这一模式下,容器内的很多操作很直接影响到宿主机,比如重启,所以这一模式并不是很推荐。
2.3、container模式,在这一模式下,docker将新建容器放到一个已知的容器网络栈中,这样会和已存在的容器共享IP和端口等网络资源,两者可通过lo回环接口进行通信。
2.4、none,不配置网络,这个需要用户自行配置网络。
3、那么docker的安全性呢
3.1、可以说,docker出现安全问题的主要原因在于容器和宿主机共享内核,因为namespace只提供了PID、Mount、Network、UTS、IPC、User这几个属性的隔离,其他资源会存在暴露的风险,假如出现宿主机资源滥用,有概率导致宿主机崩溃。其次,docker源,docker自身,DDos攻击,局域网攻击等也存在安全问题。那么应该如何应对呢?
3.2、docker安全措施
1>及时更新内核,现在一般更新到4.4.X的就可以了,如果有新问题出现,再根据需求更新即可。
2>检查Cgroup,对资源进行配额和限定,不过最新版的docker已经支持了通过docker命令行进行资源限制,可通过命令行配置即可,当然,直接修改cgroup进行限制也是可以的。
3>严禁将宿主机上的敏感目录映射到容器,比如/etc目录
4>仅运行必要的服务,禁止SSH服务
5>对docker的守护进程,文件,目录进行审计,并限制root权限的docker文件访问权限为644甚至更低
6>清理不必要的容器
7>严禁使用host网络模式,严禁映射到特权端口
8>创建本地镜像仓库,确保镜像,软件来源均可信,并采用安全扫描
9>限制重启次数,避免频繁重启导致雪崩
10>使用普通用户启动docker
可以说docker是包罗万象的,本文只是先简单进行一下讨论,从下一篇文章开始,将论述我和docker更多的故事
- 本文作者: Devops旭
- 本文链接: http://yoursite.com/2020/06/25/docker回顾(一)/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!