Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。 Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc。Redhat 已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用。 Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。
Docker核心解决的问题是利用LXC来实现类似VM的功能,从而利用更加节省的硬件资源提供给用户更多的计算资源。同VM的方式不同, LXC 其并不是一套硬件虚拟化方法 - 无法归属到全虚拟化、部分虚拟化和半虚拟化中的任意一个,而是一个操作系统级虚拟化方法, 理解起来可能并不像VM那样直观。所以我们从虚拟化到docker要解决的问题出发,看看他是怎么满足用户虚拟化需求的。
用户需要考虑虚拟化方法,尤其是硬件虚拟化方法,需要借助其解决的主要是以下4个问题:
虚拟机的最大好处是能在你的硬件设施上运行各种配置不一样的平台(软件, 系统), Docker在降低额外开销的情况下提供了同样的功能. 它能让你将运行环境和配置放在代码汇总然后部署, 同一个Docker的配置可以在不同的环境环境中使用, 这样就降低了硬件要求和应用环境之间耦合度.
代码从开发者的机器到最终在生产环境上的部署, 需要经过很多的中坚环境. 而每一个中间环境都有自己微小的差别, Docker给应用提供了一个从开发到上线均一致的环境, 让代码的流水线变得简单不少。
不同环境中, 开发者的共同目标:
开发时会在一个台机器上运行不同的应用.
1)为了降低成本, 进行服务器整合
2) 将一个整体式的应用拆分成低耦合的单个服务(微服务架构)
Docker隔离应用的能力使得Docker可以整合多个服务器以降低成本. 由于没有多个操作系统的内存占用, 以及能在多个实例之间共享没有使用的内存, Docker可以比虚拟机提供更好的服务器整合解决方案.
Docker提供了很多的工具, 这些工具不一定只是针对容器, 但是却适用于容器. 他们提供了很多功能, 包括可以为容器设置检查点, 设置版本, 查看两个容器之间的差别, 这些特性可以帮助调试Bug.
多租户环境的应用中, 它可以避免关键应用的重写.我们一个特别的关于这个场景的例子是为loT(物联网)的应用开发一个快速, 易用的多租户环境. 这种多租户的基本代码非常复杂, 很难处理, 重新规划以应用不但消耗时间, 也浪费金钱.使用Docker, 可以为每一个租户的应用层的多个实例创建隔离的环境, 这不仅简单而且成本低廉, 因为Docker环境启动的速度快, diff命令很高效.
Docker为进程创建一个容器, 不需要启动一个操作系统, 时间缩短为秒级别.可以在数据中心创建销毁资源而无须担心重新启动带来的开销. 通常数据中心的资源利用率只有30% , 通过使用Docker并进行有效的资源分配可以提高资源的利用率.
docker引擎是一个c/s结构的应用,主要组件见下图:
Server是一个常驻进程
• REST API 实现了client和server间的交互协议
• CLI 实现容器和镜像的管理,为用户提供统一的操作界面
Docker使用C/S架构,Client 通过接口与Server进程通信实现容器的构建,运行和发布。client和server可以运行在同一台集群,也可以通过跨主机实现远程通信。
1)Docker镜像就是一个只读的模板.
例如:一个镜像可以包含一个完整的CentOS操作系统环境,里面仅安装了Apache或用户需要的其他应用程序
2)镜像可以用来创建Docker容器.
Docker提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用
3)因为镜像包含完整的root文件系统,体积是非常庞大的,因此docker在设计时按照Union FS的技术,将其设计为分层存储的架构.
4)镜像不是ISO那种完整的打包文件,镜像只是一个虚拟的概念,他不是一个完整的文件,而是由一组文件组成,或者多组文件系统联合组成.
1)image和container的关系,就像面向对象程序设计中的类和实例一样,镜像是静态的定义(class),容器是镜像运行时的实体(object).
2)容器可以被创建、启动、停止、删除、暂停
3)Docker利用容器来运行应用.
4)容器是从镜像创建的运行实例.它可以被启动、开始、停止、删除。每个容器都是相互隔离的,保证安全的平台.
5)可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序.
注意:镜像是只读的,容器在启动的时候创建一层可写层作为最上层.
1)仓库是集中存放镜像文件的场所.有时候把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分.实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag).
2)仓库分为公开仓库(Public)和私有仓库(Private)两种形式.
最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载.国内的公开仓库包括Docker Pool等,可以提供大陆用户更稳定快读的访问.
3)当用户创建了自己的镜像之后就可以使用push命令将它上传到公有或者私有仓库,这样下载在另外一台机器上使用这个镜像时候,只需需要从仓库上pull下来就可以了.
注意:Docker仓库的概念跟Git类似,注册服务器可以理解为GitHub这样的托管服务.
4) Docker Registry
Docker Registry公开服务是开放给用户使用、允许用户管理镜像的Registry服务.一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像.最常使用的Registry公开服务是官方的Docker Hub,这也是默认的Registry,并拥有大量的高质量的官方镜像.除此以外,还有CoreOS的Quay.io,CoreOS相关的镜像存储在这里;Google的Google Container Registry,Kubernetes的镜像使用的就是这个服务.由于某些原因,在国内访问这些服务可能会比较慢.国内的一些云服务商提供了针对Docker Hub的镜像服务(Registry Mirror),这些镜像服务被称为加速器.常见的有阿里云加速器、DaoCloud 加速器、灵雀云加速器等.使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从官方网站下载速度会提高很多.国内也有一些云服务商提供类似于Docker Hub的公开服务.比如时速云镜像仓库、网易云镜像服务、DaoCloud镜像市场、阿里云镜像库等.
接下来我们来解释一下这张图。现在我们要造一间厨房,在造之前我们首先要干的一件事,就是先列举出我们造厨房需要的东西。我们可能需要一个通了水电煤的房子以及一些必需的厨房用具诸如锅碗瓢勺、煤气灶、冰箱、水槽等等这些东西。现在我们知道需要了什么东西之后,我们就去找这些东西。首先我们先去京东购买一些厨房用具,这些用具就好比我们的Docker镜像,我们厨房的用具到了之后得找个地方把它们放在,不可能随处丢吧,不然后面用的时候就找不到它了,那么我们Docker镜像也是这样,需要一个Docker仓库去存储这些镜像。现在我们有了这些厨房用具之后就可以做饭了吗?答案当然是不能,没水没电没火啊!这时候我们得把厨房用具给装到一个通了水电煤的房子才行,那么Docker镜像也是这样,单纯的Docker镜像是不能用的,它得装到Docker容器中通了水电煤才能使用。等我们装好了厨房用具之后我们就可以开始做饭,那么我们的Docker镜像装到Docker容器之后,我们应用就可以跑起来了。
7.1.1更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而Docker容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间.大>大的节约了开发、测试、部署的时间.
7.1.2一致的运行环境
开发过程中一个常见的问题是环境一致性问题.由于开发环境、测试环境、生产环境不一致,导致有些bug并未在开发过程中被发现.
而Docker的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现这段代码在我机器上没问题啊这类问题.
7.1.3持续交付和部署
云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,Docker 改变了高性能必然高价格的思维定势。Docker 与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。
对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行.
使用Docker可以通过定制应用镜像来实现持续集成、持续交付、部署.开发人员可以通过Dockerfile来进行镜像构建,并结合持续集成(Continuous Integration)系统进行集成测试,
而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合持续部署(Continuous Delivery/Deployment)系统进行自动部署.
而且使用Dockerfile使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像.
7.1.4更轻松的迁移
由于Docker确保了执行环境的一致性,使得应用的迁移更加容易.Docker可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的.
因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况.
1)Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用
2)LXC是基于cgroup等linux kernel功能的,因此container的guest系统只能是linux base的
3)隔离性相比KVM之类的虚拟化方案还是有些欠缺,所有container公用一部分的运行库
4)网络管理相对简单,主要是基于namespace隔离
5)cgroup的cpu和cpuset提供的cpu功能相比KVM的等虚拟化方案相比难以度量(所以dotcloud主要是按内存收费)
6)Docker对disk的管理比较有限
7)container随着用户进程的停止而销毁,container中的log等用户数据不便收集
1、Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。
通过 uname -r 命令查看你当前的内核版本
2、使用 root 权限登录 Centos。确保 yum 包更新到最新。
$ sudo yum update
3、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
4、设置yum源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
5、可以查看所有仓库中所有docker版本,并选择特定版本安装
yum list docker-ce --showduplicates | sort –r
6、安装docker
yum install docker-ce-17.12.1.ce
7、查看是否安装成功
yum list installed | grep docker
8、查看docker版本号
Docker version
9、启动 Docker 进程。
sudo systemctl start docker
证明docker安装并启动成功