码迷,mamicode.com
首页 > 其他好文 > 详细

Docker

时间:2018-04-08 15:57:58      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:linux

一、Docker 简介

Docker 是什么?

Docker 的英文本意是“搬运工”,在程序员的世界里,Docker 搬运的是集装箱Container),集装箱里装的是任意类型的 App,开发者通过 Docker 可以将 App 变成一种标准化的、可移植的、自管理的组件,可以在任何主流系统中开发、调试和运行。

 

说白了,docker 是一种用了新颖方式实现的轻量级虚拟机,类似于 VM,但是在原理和应用上和

VM 的差别还是很大的.并且 docker 的专业叫法是应用容器(Application Container)

 

为啥要用容器?

应用容器是个啥样子呢,一个做好的应用容器长得就像一个装好了一组特定应用的虚拟机一,比如我现在想用 mysql,那我就找个装好了 mysql 的容器就可以了,然后运行起来,我就能使 mysql 了。

 

为啥不能直接安装一个 mysql?安装一个 SQL Server 也可以啊,可是有的时候根据每个人电脑的不同,在安装的时候可能会报出各种各样的错误,万一你的机器中毒了,你的电脑挂了,你所有的服务都需要重新安装.但是有了docker,或者说有了容器就不同了,你就相当于有了一个可以运行起来的虚拟机,只要你能运行容器,mysql 的配置就省了.而且如果你想换个电脑,直接把容器端过来就可以使用容器里面的服务.

 

 

Docker 基于 Go 语言开发,代码托管在 Github 上,并遵循 Apache 2.0 开源协议。Docker  器可以封装任何有效负载,几乎可以在任何服务器之间进行一致性运行。换句话说,开发者构建的应用只需一次构建即可多平台运行。运营人员只需配置他们的服务,即可运行所有的应用。

 

若是利用容器的话,那么开发直接在容器里开发,测试的时候把整个容器给测试,测好了把测试后容器再上线就好了.通过容器,整个开发,测试和生产环境可以保持高度一致。

 

此外容器也 VM 一样具有一定得隔离性,各个容器之间的数据和内存空间相互隔离,可以保证一定的安全性。

 

技术分享图片技术分享图片

Docker 可以解决虚拟机能够解决的问题,同时也能够解决虚拟机由于资源要求过高而无法解决的问题。

 

为什么要使用 docker

、快速交付应用程序

?开发者使用一个标准的 image 来构建开发容器,开发完成之后,系统管理员就可以使用这个容器来部署代码

docker 可以快速创建容器,快速迭代应用程序,并让整个过程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。


docker 容器很轻!很快!容器的启动时间是次秒级的,节约开发、测试、部署的时间

、更容易部署和扩展

docker 容器可以在几乎所有的环境中运行,物理机、虚拟机、公有云、私有云、个人电脑、服务器等等。

docker 容器兼容很多平台,这样就可以把一个应用程序从一个平台迁移到另外一个。

、效率更高

docker 容器不需要 hypervisor ,他是内核级的虚拟化。

、快速部署也意味着更简单的管理

?通常只需要小小的改变就可以替代以往巨型和大量的更新工作。

 

技术分享图片Docker 的常用案例包括: 自动打包和部署应用

创建轻量、私有的 PaaS 环境自动化测试和持续集成/部署

部署并扩展 Web 应用、数据库和后端服务器

 

那么为啥不用VM?

那么既然容器和VM 这么类似为啥不用VM?docker 容器相对于 VM 还是有很多优点的:

1. 启动速度快,容器通常在一秒内可以启动. VM 要很久.

2. 资源利用率高,一台普通服务器可以跑上千个容器,而跑 VM 就。。。。。。

3. 性能开销小,VM 需要额外的 CPU 和内存来完成 OS 的功能,这一部分占据了额外的资源. 为啥相似的功能在性能上会有如此巨大的差距呢?看一下他们的设计图,先看 VM :

 


下面的图片比较了
Docker 和传统虚拟化方式的不同之处,


技术分享图片

可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。

 

Docker 优势和劣势

作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。首先,Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。

其次,Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而 Docker 只需要启动 10 个隔离的应用即可。

 

具体说来,Docker 在如下几个方面具有较大的优势。更快速的交付和部署

对开发和运维devop人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。

更高效的虚拟化

Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。

更轻松的迁移和扩展

Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。更简单的管理

使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。

对比传统虚拟机总结

特性

容器

虚拟机

启动

秒级

分钟级

硬盘使用

一般为 MB

一般为 GB

性能

接近原生

弱于

系统支持量

单机支持上千个容器


 

二、Docker 的体系结构

docker 使用 C/S 架构,docker daemon 作为 server 端接受 client 的请求,并处理(创建、行、分发容器,他们可以运行在一个机器上,也通过 socket 或者 RESTful API  通信


技术分享图片

Docker daemon 一般在宿主主机后台运行。

Docker client 以系统命令的形式存在,用户用 docker 命令来跟 docker daemon 交互。

 

Docker 守护进程(Docker daemon

如上图所示,Docker 守护进程运行在一台主机上。用户并不直接和守护进程进行交互,而是通过 Docker 客户端间接和其通信。

Docker 客户端(Docker client

Docker 客户端,实际上是 docker 的二进制程序,是用户与 Docker 交互方式。它接收用户指令并且与背后的 Docker 守护进程通信。


技术分享图片

Docker 内部:

要理解 Docker 内部构建,需要理解以下三种部件:

Docker 镜像 - Docker images

Docker  仓库 - Docker registeries

Docker  容器 - Docker containers

 

Docker 镜像  

 

Docker 镜像是 Docker 容器运行时的只读模板,镜像可以用来创建 Docker 容器。每一个镜


像由一系列的层 (layers) 组成。Docker 使用 UnionFS联合文件系统来将这些层联合到单独的镜像中。UnionFS 允许独立文件系统中的文件和文件夹(称之为分支)被透明覆盖,形成一个单独连贯的文件系统。正因为有了这些层的存在,Docker 是如此的轻量。当你改变了一个 Docker 镜像,比如升级到某个程序到新的版本,一个新的层会被创建。因此,不用替换整个原先的镜像或者重新建立(在使用虚拟机的时候你可能会这么做),只是一个新的层被添加或升级了。现在你不用重新发布整个镜像,只需要升级,层使得分发 Docker 镜像变得简单和快速。

每个 docker 都有很多层次构成,docker 使用  union file systems  将这些不同的层结合到一个 image 中去。



例如:
centos 镜像中安装 nginx,就成了 nginx 镜像,其实在此时 Docker 镜像的层级概念就体现出来了。底层一个 centos 操作系统镜像,上面叠加一个 ngnx 层,就完成了一个 nginx 镜像的构建。层级概念就不难理解,此时我们一般 centos 操作系统镜像称为 nginx 镜像层的父镜像。

技术分享图片

Docker 仓库  

 

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

 

仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器Registry混为一谈, 并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签tag)。

 

仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括Docker Pool 等,可以提供大陆用户更稳定快速的访问。

 

当然,用户也可以在本地网络内创建一个私有仓库。

当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。

*注:Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。

 




Docker

标签:linux

原文地址:http://blog.51cto.com/13573413/2095642

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!