参考自:
http://www.jikexueyuan.com/course/820.html
什么是容器
一种虚拟化解决方案,是一种操作系统级别的虚拟化,只能运行在相同或者相似的操作系统上,依赖于linux的namespace根cgroups。
什么是Docker
容器本身比较复杂,不易安装,管理和实现自动化。docker出现就是为了改变这些。Docker是一种可以把程序自动部署到容器中的一种开源引擎
docker 可以将应用程序自动部署到容器,使用Go语言编写,2013出由dotCloud公司发布,基于Apache 2.0 开源授权协议发行。
docker特别之处:
在虚拟化的容器环境中,增加一个应用程序部署引擎,提供一个轻量、快速的环境,能够运行开发者程序,并方便高效的程序从开发者环境部署到测试环境,然后再部署到生产环境。
Docker依赖的linux内核特性
- Namespaces 命名空间
- Control groups (cgroups) 控制组
Namespaces
在编程语言中用来封装,实现代码隔离
在操作系统中用来提供系统智源的隔离,进程、网络、文件系统
docker使用了5种命名空间:
- PID(Process ID) 提供进程隔离
- NET (Network) 网络管理接口
- IPC (InterProcess Communication) 管理跨进程通信的访问
- MNT (Mount) 管理挂载点
- UTS (Unix Timesharing System)隔离内核和版本标识
cgoups
前面隔离的资源是怎么管理起来的呢?这就要用到cgroups,cgroups就是为容器而生的
- 资源限制
- 优先级设定
- 资源计量
- 资源控制
Docker容器的能力
namespace跟cgoups 使得docker拥有:
- 文件系统隔离:每个容器都有自己的root文件系统
- 进程隔离:每个容器都运行在自己的进程环境中
- 网络隔离:容器的虚拟网络接口和IP地址都是分开的
- 资源隔离和分组:使用cgroups将CPU和内存之类的资源独立分配给每个Docker容器
Docker 的基本组成
- Docker Client 客户端
- Docker Daemon 守护进程
- Docker Image 镜像 :容器基于镜像启动和运行,是一个成叠的只读文件系统,联合加载:
Docker Container 容器:通过镜像来启动,docker会在该Image的最顶层加载一个可写文件系统,当要读诶只读的Image中改写东西时,就复制一份到可写层(写时复制 copy on write)
Docker Registry 仓库:分 公有(Docker Hub)、私有