1.Docker入门
[toc]
Docker基本含义
Docker包括一个命令行程序、一个后台守护进程,以及一组远程服务。它解决了常见的软件问题,并简化了安装、运行、发布和删除软件。这一切能够实现是通过使用一项UNIX技术,称为容器。
什么是容器?
Docker 是Docker.Inc公司开源的,一个基于LXC技术之上构建的Container容器引擎,源码托管在
GitHub上,基于Go语言,并基于Apache2.0协议开源
Docker是通过内核虚拟化技术(namespace及cgroup等)来提供容器的资源隔离与安全保障等。
由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的
操作系统开销,提高资源利用率。
Docker在开发和运维中的优势
对于开发和运维人员来说,最梦寐以求的效果可能就是一次创建和配置,之后可以在任意地方、任意时间让应用正常运行,而Docker恰恰可以实现这一中级目标。具体来说,在开发和运维过程中,Docker具有以下几个方面的优势:
1.更快的交付和部署:
使用Docker,开发人员可以使用镜像来快速构建一套标准的开发环境;开发完之后,测试和运维人员可以直接使用完全相同的环境来部署代码。只要是开发测试过的代码,就可以确保在生产环境无缝运行。Docker可以快速创建和删除容器,实现快速迭代,节约开发、测试及部署的时间。
2.更高效的利用资源:
运行Docker容器不需要额外的虚拟化管理程序的支持,Docker是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低,与传统的虚拟机方式相比,Docker的性能要提高1 ~ 2个数量级。
3.更轻松的迁移和扩展:
Docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑等等,同时支持主流的操作系统发行版本。这种兼容性能让用户可以在不同的平台之间轻松的迁移应用。
4.更轻松的管理和更新:
使用Dockerfile,只需要小小的配置修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的容器管理。
Docker和虚拟化
Docker和KVM虚拟化的区别
在没有Docker 的时代,商家通常使用硬件虚拟化(也称为虚拟机),以提供隔离。虚拟机提供虚拟的硬件,可安装一个操作系统和其他程序。它们需要很长的时间(通常以分钟计)来创建,也需要显著的资源开销,因为它们除了要执行你需要的软件,还得运行整个操作系统的副本。
不同于虚拟机,Docker容器不使用硬件虚拟化。运行在Docker容器中的程序接口和主机的 Linux内核直接打交道。因为容器中运行的程序和计算机的操作系统之间没有额外的中间层,没有资源被冗余软件的运行或虚拟硬件的模拟而浪费掉。这是一个很重要的区别。Docker不是一个虚拟化技术。相反,它可以帮助使用已经内置到操作系统中的容器技术。
Docker以及其他容器技术,都属于操作系统虚拟化范畴,操作系统细腻化最大的特点就是不需要额外的supervisor支持。Docker虚拟化方式之所以有众多优势,跟操作系统虚拟化技术自身的设计和实现分不开。
- docker是容器
- KVM是Linux虚拟服务
- VMware是Windows虚拟服务
1 | --virt-type kvm \ |
传统方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层。Docker容器时在操作系统层面实现虚拟化,直接复用本地主机的操作系统,因此更加轻量级。
Docker与虚拟机的比较
作为一种轻量级的虚拟化方式,Docker在运行应用上跟传统的虚拟机的方式相比具有如下显著优势:
Docker容器启动很快,启动和停止可以实现秒级,相比传统的虚拟机方式(分钟级)要快速很多。
Docker容器对系统资源需求很少,一台主机上可以同时运行数千个Docker容器。
Docker通过类似git设计理念的操作来方便用户获取、分发和更新应用镜像,存储复用,增量更新。
Docker通过Dockerfile支持灵活的自动化创建和部署机制,可以提高工作效率,并标准化流程。
特性 | 容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
性能 | 接近原生 | 较好 |
内存 | MB级 | GB级 |
硬盘适应 | MB级 | GB级 |
运行密度 | 单台主机支持上千个 | 单台主机支持几个 |
隔离性 | 安全隔离 | 完全隔离 |
迁移 | 优秀 | 一般 |
Namespace 和 cgroup
Namespace 资源隔离
内核提供了namespace的机制用来隔离相关资源,namespace设计之初就是为了实现轻量级的系统资
源隔离,可以让容器中的进程仿佛置身于一个独立的系统环境中。
Namespace | 系统调用参数 | 隔离内容 |
---|---|---|
UTC | CLONE_NEWUTC | 主机名和域名 |
IPC | CLONE_NEWIPC | 信号量,消息队列,共享内存 |
PID | CLONE_NEWPID | 进程号 |
Network | CLONE_NEWNET | 网络设备,网络栈,端口 |
Mount | CLONE_NEWNS | 文件系统 |
User | CLONE_NEWUSER | 用户和用户组 |
cgroup 资源隔离
cgroups 限制一个进程能够使用的资源,cpu、内存、硬盘io等
cgroup的四大作用:
- 资源限制:
- 例如设定任务指定内存
- 优先级分配:
- 比如跟任务分配的CPU时间,片数,磁盘IO,带宽大小来控制任务的优先级
- 资源统计:
- 统计CPU,内存,IO等资源使用时长,该功能比较适合用于计费
- 任务控制:
- cgroup可以对任务进行 运行,挂起,恢复等操作
Docker三个重要的概念
Docker中有三个核心概念:镜像、容器和仓库。准确把握这三大概念对于掌握Docker技术尤为重要。
镜像(Image)
- Docker 镜像(Image),可以看做是一个特殊的文件系统,除了提供容器运行时所需要的程序、库、资源、配置文件以外,还包含了一些为运行时,准备的配置参数(匿名卷,环境变量,用户等),镜像是不可更改的
容器(Container)
- 镜像(Image)和容器(Container),容器的定义和镜像,几乎是一模一样,唯一区别在于容器的最上面那一层是可读可写的。
- 容器可以被创建、启动、停止、删除、暂停等。
仓库(Repository)
dockerhub(公有仓库)
harbor(私有仓库)
1
2
3仓库是Docker用来存放镜像的地方,类似于我们之前常用的代码仓库。
通常一个仓库会包含,同一个软件,不同版本的镜像
我们可以通过<仓库名>:<标签>格式来指定具体使用哪个版本的镜像,如果不给标签,那么默认以Latest作为默认标签
docker组成部分
- Docker是传统的C/S架构,分为 docker client 和 docker server
- Docker客户端是Docker用户与Docker交互的主要方式
- 当使用Docker命令行运行命令时,Docker客户端将这些命令发送给服务端,服务端执行这些命令
- Docker命令使用Docker API
- Docker客户端可以与多个服务端进行通讯
Docker总结
- 操作系统的趋势
- 系统越来越多,也越来越复杂
- 系统之间的兼容性得不到保证
- 容器带来的优势
- 解决了一个相对隔离的环境(容器与容器,容器与主机之间互不影响)
- 解决了系统不兼容的问题(重点)
- 容器解决了稳定部署的问题
- 容器软件:docker
- 基于golang语言开发
- Linux 基金会
- 增加知名度
- 全世界的开发者共同维护软件的生态系统
- docker与虚拟机的区别
- 虚拟机之间的系统级别的隔离
- docker容器之间的进程级别的隔离
- docker仓库: