容器与Docker
什么是容器
容器是将软件打包成标准化单元,用于开发,交付和部署。容器技术起源于Linux, 是一种内核虚拟化技术,提供提供轻量级的虚拟化,以便隔离进程和资源。
容器与虚拟机
容器和虚拟机具有相似的资源隔离和分配方式,容器虚拟化了操作系统而不是硬件。
相比于虚拟机,容器有如下优点:
- 更高效的利用系统资源
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,容器对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。
- 更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而Docker容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间,大大节约了开发、测试、部署的时间。
- 一致的运行环境
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些问题并未在开发过程中被发现。而Docker的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性。
- 更轻松的迁移
由于Docker确保了执行环境的一致性,使得应用的迁移更加容易。Docker可以在很多平台上运行,无论是物理机、虚拟机,其运行结果是一致的。因此可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
- 更轻松的维护和扩展
Docker使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker团队同各个开源项目团队一起维护了大批高质量的官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。
Docker 核心思想
- 集装箱
- 运输方式、存储方式和Api接口的标准化
- 隔离
Docker 概念
- 镜像(Image): 类似虚拟机镜像,一个只读的模板,它包含应用程序可用的文件系统和其他元数据,如镜像运行时的可执行文件路径。
- 容器(Container):一个运行中的容器是一个运行在Docker主机上的进程,但它和主机,以及所有运行在主机上的其他进程都是隔离的。这个进程也是资源受限的,意味着它只能访问和使用分配给它的资源(CPU、内存等)。
- 仓库(Repository): 仓库是集中存放镜像文件的场所。
镜像仓库
- 公开仓库(Public): 最大的公开仓库是Docker Hub, 存放了大量的镜像供用户下载。 国内的公开仓库包括Docker Pool 等,大陆用户可以稳定下载访问。
- 私有仓库(Private): 限定特定账号的方式来访问
- docker 命令列表: docker
微服务与Docker关系
Docker作为容器的工具可以把业务逻辑容器化,存储容器化,消息队列容器化,使软件可以拆分成若干个标准化容器,然后像搭积木一样组合起来,彼此通信。这正式微服务的思想。
Kubernets
Docker: 一个开源的应用容器引擎,开发者可以打包他们的应用及依赖到一个可移植的容器中,发布到Linux机器上,也可实现虚拟化。
Kubernets: 一个开源的容器集群管理系统,可以实现容器集群的自动化部署、自动化扩缩容、维护等功能。
Kubernets 概念
- API Server
-
- 用户通过api server 和集群交互,通过kubectl给Api server 发送请求
- 集群网关认证组件对用户的请求进行校验,确保有权限的用户才能访问
- Scheduler
-
- 扫描新创建但没分配到Node的Pod, 为Pod选择一个Node
- Controller Manager
-
- 检测集群状态变化(如pods处于非运行态),尝试调整集群到最初的状态。
- 比如,如果一个pod意外销毁,Controller manager请求scheduler,尝试拉起一个新的pod去替代销毁的pod.
- etcd
-
- 可以认为是集群的大脑
- 集群状态的key-value 存储
- 任何集群状态的变更都会被记录
- 应用的数据不会存储在etcd, 只存储集群的状态数据,其他的组件通过etcd感知整个集群的状态信息。