Docker入门
Docker简介
一种虚拟容器技术。
- 一种虚拟化分方案;
- 操作系统级别的虚拟化;
- 只能运行相同或相似内核的操作系统;
- 依赖与linux内核特性:Namespace和Cgroups(Control Group)
虚拟机技术和容器技术最大的区别就是对资源的占用。
Docker目标
- 提供简单轻量的建模方式
- 职责的逻辑分离
- 快速高效的开发生命周期
- 鼓励使用面向服务的架构
Docker使用场景
- 使用Docker容器开发、测试、部署服务
- 创建隔离的运行环境
- 搭建测试环境
- 构建多用户的平台即服务(PaaS)基础设施
- 提供软件即服务(SaaS)应用程序
- 高性能、超大规模的宿主机部署
Docker的基本组成
- Docker Client 客户端
- Docker Daemon 守护进程
- Docker Image 镜像
- Docker Container 容器
- Docker Registry 仓库
Docker Client 客户端
- C/S架构
- 本地/远程调用
Docker客户端向服务器端发出请求,也就是守护进程。守护进程处理完所有工作将结果返回给客户端。Docker客户端对服务器端的访问既可以在本地也可以在远程。
Docker Image 镜像
- 容器的基石
- 层叠的只读文件系统
Docker镜像是容器的基石,保存了启动容器的条件,容器基于镜像启动和运行。 Docker镜像是一个层叠的只读文件系统,他的最底端是一个引导文件系统及bootfs。 Docker用户几乎永远都不会和引导文件系统有交互,实际上当一个容器启动后,bootfs会被移到内存中,引导文件将被卸载。
Docker镜像的第二层是rootfs(root文件系统),位于引导文件系统之上,可以有多种操作系统。 在传统的linux系统中root文件系统最先会以只读的方式加载,当引导和启动完成后他才会被切换成读写模式。 但是在Docker里,root文件系统永远只能是只读,并且Docker会用联合加载系统在rootfs之上加载更多的只读文件系统。 联合加载只得是一次加载多个文件系统。但是在外面开来只有一个文件系统。联合加载会将各层文件系统加载到一起, 这样最终的文件系统会包含所有的文件及目录。Docker将这样的文件系统称为镜像。 一个镜像可以放到另一个镜像顶部,位于下面的镜像称为父镜像。以此类推,直到镜像栈的最底部。最底部的镜像称为基础镜像。 也就是bootfs文件系统。
Docker Container 容器
- 容器通过镜像来启动
- 启动和执行阶段
- 写时复制(copy on write)
一个容器中可以运行用户的一个或多个进程。当一个容器启动时,Docker会在镜像的最顶层增加一个读写文件系统,我们在Docker中运行的程序 就是在这个层运行并执行的。第一次启动Docker时,读写层是空的,当文件发生变化后都会应用到这一层。比如修改一个文件,先将该文件从只读层复制到读 写层,然后隐藏只读层,这就是Docker的写时复制。
当创建一个容器时,Docker会创建一个镜像栈,在栈的最顶层增加读写层,这个读写层和下面的镜像层以及一些配置数据就构成了一个容器。 容器的这个特点及镜像分层,可以让我们快速的构建镜像,并运行包含我们自己的应用程序和服务的容器。
Docker Registry 仓库
- 共有
- Docker Hub
- 私有
Docker用仓库来保存用户构建的镜像。
从上图可以看出,Docker客户端调用守护进程从而操作Docker的容器,而容器是通过镜像来创建的,而镜像又保存在仓库中。
Docker容器的相关技术
Docker依赖的Linux内核特性
- Namespaces 命名空间
- Control groups(cgroups)控制组
Namespaces 命名空间
- PID(Process ID) 进程隔离
- NET(Network) 管理网络接口
- IPC(Inter Process Communication) 管理跨进程通信的访问
- MNT(Mount) 管理挂载点
- UTS(Unix Timeshring System) 隔离内核和版本标识
编程语言中命名空间实现封装,即代码隔离。 操作系统中命名空间实现系统资源的隔离,进程、网络、文件系统...
各种隔离的资源时如何管理起来的,这就用到了Cgroups。
Control groups(cgroups)控制组
- 资源限制
- 优先级设定
- 资源计量
- 资源控制
Docker容器的能力
- 文件系统隔离:每个容器都有自己的root文件系统
- 进程隔离:每个容器都运行在自己的进程环境中
- 网络隔离:容器间的虚拟网络接口和IP地址都是分开的
- 资源隔离和分组:使用Cgroups将CPU和内存等资源独立分配给每个Docker容器