您的位置:首页 > 运维架构 > Docker

docker技术简介

2017-07-28 00:00 260 查看
摘要: Docker三个重要概念:Docker镜像;Docker容器;Docker仓库。 Docker是一个开放源代码软件项目,让应用程序布署在软件容器下的工作可以自动化进行,借此在Linux操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制。

[TOC]

Docker 简介

Docker是一个开放源代码软件项目,让应用程序布署在软件容器下的工作可以自动化进行,借此在Linux操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制。Docker利用Linux核心中的资源分离机制,例如cgroups,以及Linux核心命名空间(name space),来建立独立的软件容器(containers)。这可以在单一Linux实体下运作,避免启动一个虚拟机器造成的额外负担。 --摘自维基百科

「Docker」的字面意思是「码头工人」,这个名字本身应该是官方深思熟虑之后的结果,这个词汇本身就带有很强的隐喻性质,它借用了一个在真实世界中已经成熟的体系:全球物流系统,来映射Docker在软件领域中起到的作用。

在全球物流系统中,一个非常重要的发明就是集装箱。

Docker就像往集装箱里装货物的码头工人那样,它把应用打包成具有某种标准规格的集装箱,用计算机领域的语言来说,这种按照一定规格封装的集装箱叫「镜像」。其实就是将你原来的代码添加点额外的内容,格式之类的,生产出来的一个符合某种标准的东西。

下面请看Docker三个重要概念:Docker镜像;Docker容器;Docker仓库。

Docker 镜像

是一个构建容器的只读模板,是一个包含了应用程序和其运行时依赖环境的只读文件。它包含了容器启动所需的所有信息,包括运行程序和配置数据。每一个镜像由一系列的层 (layers) 组成。

Docker 使用 UnionFS 来将这些层联合到单独的镜像中。UnionFS 允许独立文件系统中的文件和文件夹(称之为分支)被透明覆盖,形成一个单独连贯的文件系统。

正因为有了这些层的存在,Docker 是如此的轻量。当你改变了一个 Docker 镜像,比如升级到某个程序到新的版本,一个新的层会被创建。因此,不用替换整个原先的镜像或者重新建立(在使用虚拟机的时候你可能会这么做),只是一个新的层被添加或升级了。现在你不用重新发布整个镜像,只需要升级,层使得分发 Docker 镜像变得简单和快速。

Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

分层存储

因为镜像包含操作系统完整的 root 文件系统,其体积往往是庞大的,因此在 Docker 设计时,就充分利用 Union FS 的技术,将其设计为分层存储的架构。所以严格来说,镜像并非是像一个 ISO 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。

镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。

Docker 容器

容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。Docker 利用容器来运行应用。一个 Docker 容器都是独立和安全的应用平台,Docker 容器是 Docker 的运行部分。可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

注:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。

运行容器实例有两种方式:

交互型容器
前台运行,可以通过控制台与容器交互。如果创建该容器的终端被关闭,则容器就变为停止状态。此外,在容器控制台中输入exit或者通过docker stop或docker kill也能终止容器。

后台型容器
后台运行,创建启动之后就与终端无关了,需要用 docker stop 或 docker kill 来终止,或者 docker logs 查看运行中的输出。

Docker 仓库

Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。同样的,Docker 仓库也有公有和私有的概念。公有的 Docker 仓库名字是 Docker Hub。Docker Hub 提供了庞大的镜像集合供使用。这些镜像可以是自己创建,或者在别人的镜像基础上创建。Docker 仓库是 Docker 的分发部分。

Docker 仓库的概念与 Git 版本控制工具有些类似,注册服务器可以理解为 GitHub 这样的托管服务。

Docker 优点

简单

使用简单

标准的交付件

说到Docker最像集装箱的地方,关键就是理解它是软件领域的一种「标准化」,这种标准化的具体产物,简单来说就是「镜像(image)」。

简化产品持续交付的复杂工序

Steve Francia(Docker开源项目运维主管)说:“我觉得Docker做得最好的事情就是让开发者、用户和大家能够在任何地方非常容易地运行一个应用程序。它几乎就是开发者的圣杯,因为你既可以在你的桌面上运行一个应用程序,而且不需要任何修改,你就可以在服务器上毫无差异地运行这个相同的应用程序。这在之前是从来没有出现过的。”

应用隔离

集装箱可以有效做到货物之间的隔离,使化学物品和食品可以堆砌在一起运输。Docker可以隔离不同应用程序之间的相互影响,但是比虚拟机开销更小。

节约时间,快速部署和启动

VM启动一般是分钟级,Docker容器启动是秒级;

传统的部署模式是:安装(包管理工具或者源码包编译)->配置->运行;

Docker的部署模式是:复制->运行。

节约成本

一个虚拟机至少需要几个G的磁盘空间,Docker容器可以减少到MB级;

容器技术对比虚拟化技术,容器比虚拟化更轻量级,对资源的消耗小很多。

容器操作也更快捷,启动和停止都要比虚拟机快。但Docker容器需要与主机共享操作系统内核,不能像虚拟机那样运行独立的内核。

统一的管理服务

举个例子,比如我一个服务器上部署了n多服务,有mysql,redis,rabbitmq,其他还有一堆应用。有一天我服务器突然断电重启了,那些没有设置自动重启的应用,那些重启出问题的应用,那些你甚至都不知道隐藏在某个角落里的重要应用没启动成功…

然而使用Docker,一眼就可以看出那些应用正常启动了,那些应用又出问题了。接下来只用有条不紊的处理就ok了。

一次构建,到处部署

没有使用Docker的服务器部署情况

简单说明一下我以前公司服务部署的情况:
公司搞p2p金融的,据说是为了数据安全,没用阿里云,自己买的服务器
一套环境有8个服务,11台虚拟机;
开发一套、测试一套、预发布一套、生产一套,共4套环境就需要44台虚拟机了;
每台虚拟机需要多少存储,磁盘空间,耗费多少CPU,当时没有计算过,

还记得,那时候我们的运维安装一个PHP环境花费了2天时间(源码安装的,几十个依赖);

Rest API v2; thinkphp3.2 php5.6 nignx11

Rest API v3; thinkphp3.2 php5.6 nignx11

API Service Yaf nignx11 (放一些公共服务,比如用户注册登录,获取用户信息的接口)

mysql5.6

redis3.0

admin 后台管理 thinkphp3.2 php5.6 nignx11

前端Web thinkphp3.2 php5.6 nignx11

RabbitMQ 3.5.6 集群(3个节点) + haproxy-1.5.15 (发送短信、发送邮件、消息推送等)

Docker在部署过程中,将安装,配置等重复的部分,由Docker自动化完成。只需要在第一次部署时,构建完可用的Docker镜像(装好集装箱),在以后使用中,短短的几行命令,就可以直接拉取镜像,根据这个镜像创建出一个容器,把服务跑起来了。所需要的仅仅是安装了Docker的服务器,一个Dockerfile文件,以及比较流畅的网络而已。真可谓『一次构建,到处部署』。

Docker 缺点

复杂

实现Docker是复杂的,它需要很多技术的支撑,比如说,容器管理、编排、应用打包、容器间的网络、数据快照等等;

不过,复杂也是相对而言的,只有花点儿心思、花点儿时间去做了,还是不难,甚至可以说是很简单的。

不方便故障排除和分析

在故障排除和分析中,复杂性也是一个问题。Markovich提到这就是Docker提供应用程序抽象的原因。“将运行在Docker上应用程序的性能问题和下层基础设施领域的性能关联起来几乎不可能。”他在邮件中说道,“IT团队将来需要可视化——一种新型的监控和分析工具,它能够将Docker生态圈中的所有东西,从应用程序到私有或者公有的基础设施关联起来。”

隔离性要比VM弱

Docker和VM相比,虚拟化层次不同,导致Docker的隔离性要比VM弱,在多租户环境中有安全隔离的问题,另外在单宿主机上,容器之间的资源竞争也可能导致业务会受到影响,需要对容器的资源隔离,特别是cgroup的隔离有较为精细的运维。

目前没有GUI

现在使用Docker,你必须习惯使用命令行。现在使用Docker还没有可视化界面,都是命令行指令。

Docker 安装

CentOS7 安装 Docker

CentOS7 系统 CentOS-Extras 库中已带 Docker,可以直接安装:

sudo yum update
sudo yum install docker

安装之后启动 Docker 服务,并让它随系统启动自动加载。

sudo service docker start
sudo chkconfig docker on

具体安装步骤可见官网文档

MacOS 安装 Docker

使用 Homebrew 安装

Homebrew 的 Cask 已经支持 Docker for Mac,因此可以很方便的使用 Homebrew Cask 来进行安装:

brew cask install docker

手动下载安装

如果需要手动下载,可以通过这个链接下载:https://download.docker.com/mac/stable/Docker.dmg

Windows 安装 Docker

参考 https://github.com/zhangpeihao/LearningDocker/blob/master/manuscript/01-DownloadAndInstall.md

参考资料:

https://yeasy.gitbooks.io/docker_practice/content/basic_concept/image.html

http://kuanghy.github.io/2016/11/05/docker-intro

http://dockone.io/article/260

https://www.zhihu.com/question/22871084
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Docker