Docker容器的概念
前言
Docker的概述
- Docker的Logo设计为蓝色鲸鱼,拖着许多集装箱
- 鲸鱼可看作为宿主机,集装箱可理解为相互隔离的容器 ,每个集装箱中都包含了自己的应用程序
一、Docker与虚拟机区别
特性 | Docker容器(一个进程控制) | 虚拟机虚拟化(完整的操作系统) |
---|---|---|
启动速度 | 秒级 | 分钟级 |
运行性能 | 接近原生(直接在内核运行)10%-20%左右的损失 | 50%左右损失(全虚拟化类型) |
磁盘占用 | 50-100MB | 3-5G |
数量 | 成百上千,每个进程可控制一个容器 | 几十个 |
隔离性 | 进程级别 | 系统级别(更彻底) |
操作系统 | 主要支持Linux | 几乎所有 |
封装程度 | 只封装目标代码和依赖关系,共享宿主机内核 | 完整的操作系统,与宿主机隔离 |
二、虚拟化简介
2.1 虚拟化概述
虚拟化: 将应用程序和系统内核资源进行解耦,以操作系统进行隔离,目的是提高资源利用率
2.2 虚拟化类型
- 全虚拟化: 将物理硬件资源全部通过软件的方式抽象化,最后进行调用
- 半虚拟化: 需要修改操作系统
- 直通: 直接调用硬件实现虚拟化功能
2.3 虚拟化功能
- 在一个操作系统内,模拟多个操作系统
- 以软件的方式模拟物理设备的功能
三、Docker容器简介
3.1 Docker概述
- Docker是一个开源的应用容器引擎,基于go语言开发并遵循apache2.0协议开源
- 是在Linnux容器里运行应用的开源工具
- 一种轻量级的“虚拟机”
- Docker的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植、自给自足的容器
- Docker设计宗旨:Build,Ship and Run Any App,Anywhere (一次封装,到处运行)
即通过对应组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的"一次封装,到处运行"的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。
3.2 Docker使用场景
- 打包应用程序简化部署
- 可脱离底层硬件任意迁移
- 适合做微服务的部署
- 适合持续集成和持续交付(CI/CD):开发到测试发布
3.3 使用Docker的意义
把容器化技术做成了标准平台
- Docker 引擎统一 了基础设施环境—— docker 容器环境(引擎)
- Docker 引擎统一 了程序打包(装箱)方式 —— docker 镜像
- Docker 引擎统一 了程序部署(运行)方式 —— docker 容器
3.4 Docker三要素(核心组件)
三要素 | 概念 |
---|---|
Image(镜像) | 一个面向Docker容器引擎的只读模板 |
Container(容器) | 从镜像创建的运行实例 |
Repository(仓库) | 集中保留镜像的地方,分为共有仓库和私有仓库 |
镜像是Docker运行容器的前提,仓库是存放镜像的场所,可见镜像更是Docker的核心
Image(镜像)
Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
Container(容器)
容器 (container) 的定义和镜像 (image) 几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
由于容器的定义并没有提及是否要运行容器,所以实际上,容器 = 镜像 + 读写层。
Repository(仓库)
Docker仓库是用来集中保存镜像的地方 ,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public) 或者私有仓库(Private)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。
仓库分为:
- 公有仓库:Docker官方仓库
- 私有仓库:个人化、私有化的仓库
3.5 容器特性
特性——》性能损耗10-20%
- 灵活:即使是最复杂的应用也可以集装箱化。
- 轻量级:容器利用并共享主机内核。
- 可互换:可以即时部署更新和升级。
- 便携式:可以在本地构建,部署到云,并在任何地方运行。
- 可扩展:可以增加并自动分发容器副本。
- 可堆叠:可以垂直和即时堆叠服务。
四、 名称空间(namespace)
Docker使用namespaces提供容器的隔离工作区的技术;运行容器时,Docker为该容器创建一组名称空间。这些名称空间提供了一层隔离,容器的每个方面都在单独的名称空间中运行,并且其访问仅限于该名称空间。
容器完美的实现了6个名称空间隔离(namespace资源隔离-用容器化技术封装):
mount 文件系统,挂载点
user 操作进程的用户和用户组
pid 进程编号
uts 主机名和主机域
ipc 信号量、消息队列,共享内存(理解,不同的应用调用的时候应该使用不同的内存空间)
net 网络设备、网络协议栈、端口等
Docker Engine 在 Linux 上使用以下名称空间:
- 该pid命名空间:进程隔离(PID:进程ID)
- 该net命名空间:管理网络接口(NET:网络)
- 该ipc命名空间:管理访问IPC资源(IPC:进程间通信)
- 该mnt命名空间:管理文件系统挂载点(MNT:mount)
- 该uts命名空间:隔离内核和版本标识符。(UTS:Unix时间共享系统)
五、 控制组(Control Groups)
- 六种名称空间是由cgroups管理的
- 最后一种centos的cgroups管理版本是3.8版本,3.6和3.5用不了
- cgroups 管理linux内核态中资源管理的模块
- cgroups 管理一些系统资源
- 不是docker原生的