1、Docker 简介
Docker
啥是docker?
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
起源
Docker 是 PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上,基于go语言并遵从Apache2.0协议开源。
Docker自2013年以来非常火热,无论是从 github 上的代码活跃度,还是Redhat在RHEL6.5中集成对Docker的支持,就连 Google 的 Compute Engine 也支持 docker 在其之上运行。
Docker 架构
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker 容器通过 Docker镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。
| Docker | 面向对象 | 
|---|---|
| 容器 | 对象 | 
| 镜像 | 类 | 
Docker采用 C/S架构
Docker daemon作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。客户端和服务端既可以运行在一个机器上,也可通过socket或者RESTful API来进行通信。
Docker daemon一般在宿主主机后台运行,等待接收来自客户端的消息。Docker客户端则为用户提供一系列可执行命令,用户用这些命令实现跟Docker daemon交互。
特性
在docker的网站上提到了docker的典型场景:
- Automating the packaging and deployment of applications(使应用的打包与部署自动化)
 - Creation of lightweight, private PAAS environments(创建轻量、私密的PAAS环境)
 - Automated testing and continuous integration/deployment(实现自动化测试和持续的集成/部署)
 - Deploying and scaling web apps, databases and backend services(部署与扩展webapp、数据库和后台服务)
 
由于其基于LXC的轻量级虚拟化的特点,docker相比KVM之类最明显的特点就是启动快,资源占用小。因此对于构建隔离的标准化的运行环境,轻量级的PaaS(如dokku),构建自动化测试和持续集成环境,以及一切可以横向扩展的应用(尤其是需要快速启停来应对峰谷的web应用)。
- 构建标准化的运行环境,现有的方案大多是在一个baseOS上运行一套puppet/chef,或者一个image文件,其缺点是前者需要base OS许多前提条件,后者几乎不可以修改(因为copy on write 的文件格式在运行时rootfs是read only的)。并且后者文件体积大,环境管理和版本控制本身也是一个问题。
 - PaaS环境是不言而喻的,其设计之初和dotcloud的案例都是将其作为PaaS产品的环境基础
 - 因为其标准化构建方法(buildfile)和良好的REST API,自动化测试和持续集成/部署能够很好的集成进来
 - 因为LXC轻量级的特点,其启动快,而且docker能够只加载每个container变化的部分,这样资源占用小,能够在单机环境下与KVM之类的虚拟化方案相比能够更加快速和占用更少资源
 
局限
Docker并不是全能的,设计之初也不是KVM之类虚拟化手段的替代品,简单总结几点:
- Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用
 - LXC是基于cgroup等linux kernel功能的,因此container的guest系统只能是linux base的
 - 隔离性相比KVM之类的虚拟化方案还是有些欠缺,所有container公用一部分的运行库
 - 网络管理相对简单,主要是基于namespace隔离
 - cgroup的cpu和cpuset提供的cpu功能相比KVM的等虚拟化方案相比难以度量(所以dotcloud主要是按内存收费)
 - Docker对disk的管理比较有限
 - container随着用户进程的停止而销毁,container中的log等用户数据不便收集
 
名称空间隔离
- UTS 主机名和域
 - IPC 信号量、消息队列和共享内存
 - PID 进程编
 - Network 网络设备、网络栈、端口等
 - Mount 挂载点(文件想系统)
 - User 用户和用户组
 
| namespace | 系统调用参数 | 隔离内容 | 内核版本 | |
|---|---|---|---|---|
| UTS | CLONE_NEWUTS | 主机名和域名 | 2.6.19 | |
| IPC | CLONE_NEWIPC | 信号量、消息队列和共享内存 | 2.6.19 | |
| PID | CLONE_NEWPID | 进程编号 | 2.6.24 | |
| Network | CLONE_NEWNET | 网络设备、网络栈、端口等 | 2.6.29 | |
| Mount | CLONE_NEWNS | 挂载点(文件想系统) | 2.4.19 | |
| User | CLONE_NEWUSER | 用户和用户组 | 3.8 | 
原理
Docker核心解决的问题是利用LXC来实现类似VM的功能,从而利用更加节省的硬件资源提供给用户更多的计算资源。同VM的方式不同,LXC其并不是一套硬件虚拟化方法-无法归属到全虚拟化、部分虚拟化和半虚拟化中的任意一个,而是一个操作系统级虚拟化方法, 理解起来可能并不像VM那样直观。所以我们从虚拟化到docker要解决的问题出发,看看他是怎么满足用户虚拟化需求的。
用户需要考虑虚拟化方法,尤其是硬件虚拟化方法,需要借助其解决的主要是以下4个问题:
- 隔离性 - 每个用户实例之间相互隔离, 互不影响。 硬件虚拟化方法给出的方法是VM, LXC给出的方法是container,更细一点是kernel namespace
 - 可配额/可度量 - 每个用户实例可以按需提供其计算资源,所使用的资源可以被计量。硬件虚拟化方法因为虚拟了CPU, memory可以方便实现, LXC则主要是利用cgroups来控制资源
 - 移动性 - 用户的实例可以很方便地复制、移动和重建。硬件虚拟化方法提供snapshot和image来实现,docker(主要)利用AUFS实现
 - 安全性 - 这个话题比较大,这里强调是host主机的角度尽量保护container。硬件虚拟化的方法因为虚拟化的水平比较高,用户进程都是在KVM等虚拟机容器中翻译运行的, 然而对于LXC, 用户的进程是lxc-start进程的子进程, 只是在Kernel的namespace中隔离的, 因此需要一些kernel的patch来保证用户的运行环境不会受到来自host主机的恶意入侵, dotcloud(主要是)利用kernel grsec patch解决的.
 
Control Groups (cgroups)
- blkio: 块设备IO
 - cpu: CPU
 - cpuacct: CPU 资源使用报告
 - cpuset: 多处理器平台上的CPU集合
 - devices: 设备访问
 - freezer: 挂起或恢复任务
 - memory: 内存用量及报告
 - perf_event: 对cgroup中的任务进行同一性能测试
 - net_cls: cgroup中的任务创建的数据报告的类型标识符
 
Docker
组成:
- Docker Client
 - Docker Server
 
组件:
- 镜像(Image)
 - 容器(Container)
 - 仓库(Repository)
 
Docker 与 OpenStack 对比:
| 类别 | Docker | OpenStack | 
|---|---|---|
| 部署难度 | 非常简单 | 组件多,部署复杂 | 
| 启动速度 | 秒级 | 分钟级 | 
| 执行性能 | 和物理系统几乎一致 | VM会占用一些资源 | 
| 镜像体积 | 镜像是MB级别 | 虚拟机镜像GB级别 | 
| 管理效率 | 管理简单 | 组件相互依赖,管理复杂 | 
| 隔离性 | 隔离性高 | 彻底隔离 | 
| 客观理性 | 但仅此鞥、不建议启动SSH | 完全的系统管理 | 
| 网络连接 | 毕竟弱 | 借助Neutron可以灵活组件各类架构 | 
Docker 能做什么:
- 简化配置
 - 提高开发效率,减少构建开发环境的时间
 - 服务器资源的整合,提高服务器的利用率
 - 多租户的环境下进行使用,给每个用户使用不同的容器使用
 - 快速部署,以此构建,到处运行
 - 代码流水线管理
 - 开发调试调试工作
 
1、Docker 简介的更多相关文章
- 进击的docker 一 : Docker 简介
		
Docker简介 1.什么是docker 1.1.docker 起源 开源项目 诞生2013年初 GO语言开发实现 遵从了Apache2.0协议 项目代码在GitHub维护 1.2.docker目标 ...
 - Docker简介
		
Docker简介 1.容器虚拟化,比传统的虚拟化轻量 2.2013年出现,发展非常迅猛 3.Redhat在6.5版本开始支持docker 4.使用go语言开发,基于apache2.0协议 5.开源原件 ...
 - Docker 简介及安装
		
Docker简介: 什么是Docker?将应用程序自动部署到容器 go语言开源引擎 Github地址:https://github.com/docker/docker 2013年初 dotCloud ...
 - 【转】Docker简介与入门
		
转自:https://segmentfault.com/a/1190000000448808 Docker是个新生的事物,概念类似虚拟化.网上关于Docker入门的东西已经很多了.不过本文探讨了Doc ...
 - Docker简介以及操作
		
Docker 简介 Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目.它基于 Google 公司推出的 Go 语言实现. 项目后来加入了 Linu ...
 - Docker简介以及安装
		
Docker简介以及安装 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是容器 1.一种虚拟化方案 与传统的虚拟机不同,传统的虚拟机是通过中间层将一台或多台独立的机器虚拟运 ...
 - Docker 简介与shell操作使用
		
一.Docker概述 1.Docker简介 Docker是一个开源的应用容器引擎:是一个轻量级容器技术:Docker支持将软件编译成一个镜像:然后在镜像中各种软件做好配置,将镜像发布出去 ...
 - Docker简介与安装配置
		
目录 Docker简介 什么是Docker 为啥要用容器 Docker Engine Docker架构说明 Docker安装 Docker版本介绍 Ubuntu安装docker-ce CentOS7安 ...
 - Docker简介和安装(一)
		
Docker简介 Docker 是 Docker.Inc 公司开源的一个基于 LXC技术之上构建的Container容器引擎, 源代码托管在 GitHub 上, 基于Go语言并遵从Apache2.0协 ...
 - Docker简介与安装(一)
		
Docker简介 Docker 是 Docker.Inc 公司开源的一个基于 LXC技术之上构建的Container容器引擎, 源代码托管在 GitHub 上, 基于Go语言并遵从Apache2.0协 ...
 
随机推荐
- FTP上传、下载文件Demo
			
前言:最近在做一个app,负责写后台接口,客户那边给了一个FTP的账号密码过来,服务器上面放了一堆的PDF文件,让我们这边自己从上面拿,项目是spriongboot的,做个记录供以后参考. 一.app ...
 - 如何将excel文件导入testlink
			
Step 1 按照excel模板设计测试用例,其中优先级的定义为: 数值 定义 1 LOW 2 MEDIUM 3 HIGH Step 2 执行脚本,将excel转换成xml: 脚本 备注 包含:exc ...
 - CSPS_105
			
不想多说... T1 是$1$还是$26^n-1$ T2 是$f[getf(u)]=getf(v)$还是$f[u]=v$ T3 是$if(condition1\&\&condition ...
 - Kubernetes3-kubectl管理Kubernetes容器平台-2
			
一.kubectl管理集群中deployment资源与service服务 1.相关参数 kubectl edit 编辑服务器侧资源 kubectl replace 替换,使用 yaml 配置文件来替换 ...
 - 聚类——密度聚类DBSCAN
			
Clustering 聚类 密度聚类——DBSCAN 前面我们已经介绍了两种聚类算法:k-means和谱聚类.今天,我们来介绍一种基于密度的聚类算法——DBSCAN,它是最经典的密度聚类算法,是很多算 ...
 - 2019年10月11号  王庆超  linux
			
1.计算机操作系统简介 (1)掌握操作系统的定义:操作系统是一个用来协调.管理和控制计算机硬件和软件资源的系统 程序,它位于硬件和应用程序之间. (2)掌握操作系统的内核的定义:操作系统的内核是一个管 ...
 - Linux下mysql的主从复制配置
			
1.准备两台数据库环境,或者单台多实例环境,能正常启动和登录. 数据库的安装和多实例配置请参考https://www.cnblogs.com/qiuhom-1874/p/9757061.html. 2 ...
 - [error]The command could not be located because '/usr/bin' is not included
			
配置HBase环境变量的时候写错了,写成了如下: 之后便报错 解决: 系统命令找不到时,通常是路径不对,直接在命令行用全路径即可,配置环境变量时,加入自己的环境变量,还要附带上之前的变量.如最后加上: ...
 - Mssql 查询某记录前后N条
			
Sqlserver 查询指定记录前后N条,包括当前数据 条件 [ID] 查询 [N]条 select * from [Table] where ID in (select top ([N]+1) ID ...
 - pat 1136 A Delayed Palindrome(20 分)
			
1136 A Delayed Palindrome(20 分) Consider a positive integer N written in standard notation with k+1 ...