1.我本地代码运行没问题啊,但是别人机器运行不了,从而导致环境不一致的问题
2.那个兄弟又写死循环了,怎么这么卡,在多用户的操作系统下,会相互影响。
Docker 是一个开源项目,诞生于 2013 年初,最初是dotCloud
公司内部的一个业余项目。它基于 Google
公 司推出的 Go 语言实现。2013年3月,dotCloud
公司的创始人之一,Docker之父,28岁的Solomon Hykes
正式决定,将Docker项目开源。
遵从了 Apache 2.0 协议,项目代码在 GitHub
上进行 维护。Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud
公司后来都改名为 Docker Inc。Redhat
已经 在其 RHEL6.5
中集中支持 Docker;Google 也在其 PaaS
产品中广泛应用。Docker 项目的目标是实现轻量级的 操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC
)等技术。在 LXC
的基础上 Docker 进行了进一 步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然 后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口 (类似iPhone
的 app
),更重要的是容器性能开销极低。
先说docker是干啥用的。因为现在物理服务器是很强大的,我们如果在一台物理机上只跑一个服务就浪费了。而同时跑很多服务他们之间又互相影响,比如一个服务出了内存泄漏把整个服务器的内存都占满了,其他服务跟着倒霉。所以要把每个服务都必须隔离起来,让它们只使用自己那部分有限的CPU、内存、硬盘以及自己所依赖的软件包。在容器技术之前,这个最早是用的是虚拟机--------业界的网红。虚拟机技术的代表,是VMWare
和OpenStack
。所以,早先每个服务之间是用虚拟机来实现隔离的,但是对资源有点浪费,于是就有了docker,一个机器上可以装十几个到几十个docker
,他们共享操作系统核心,占用资源少,启动速度快,但又能提供资源(CPU、内存、磁盘等)的一定程度的隔离。
简单来说就是,不同的应用程序所依赖的环境不一样,如果把他们依赖的软件都安装在一个服务器上,不仅需要调试很久,而且可能会有冲突。
如果想把两个应用程序隔离起来,可以在服务器上创建不同的虚拟机,不同的虚拟机放不同的应用,但是虚拟机的开销比较高。docker
作为轻量级的虚拟机,是一个很好的工具。
##
引入:我们知道,软件的依赖环境大致包括配置文件、代码、tomcat(web轻量应用服务器)、JDK
(软件开发工具包)、操作系统
“Docker”
,是指容器虚拟化技术,docker本身并不是容器,而是用于支持创建和使用 Linux 容器的工具。
“build——ship——run”
,这样在自己的电脑上怎么运行,在服务器上也会怎么运行。
去仓库把镜像拉到本地,然后用一条命令把镜像运行起来,变成容器。
REST
的API
:衍生出了很多的图形化界面,Rancher等
REST API
是一组关于如何构建Web
应用程序API
的架构规则、标准或指导,REST API
遵循API
原则的架构风格。REST
是专门针对Web
应用程序而设计的,其目的在于降低开发的复杂度,提高系统的可伸缩性。
linux
的内核中单独的开辟一片空间,这片空间不会影响到其他程序
定义:Docker 镜像可以看作是一个特殊的文件系统(模板),除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)
作用:类似于虚拟机的快照,用来创建新的容器
特点:镜像不包含任何动态数据,其内容在构建之后也不会被改变。
用来保存镜像的仓库,控制版本,类似于git。当我们构建好自己的镜像之后,需要存放在仓库中,当我们需要启动一个镜像时,可以在仓库中下载下来。
cpu
使用内存硬盘,这样就起到了隔离的作用,避免产生“一块代码产生死循环,把磁盘占满了,其它程序也挂了”的情况。
docker
的标准化让快速扩展,弹性伸缩变得简单
每次发布一个程序,都要走一遍以下的流程:
迁移的时候,只需要在新的服务器上启动需要的容器就可以了,
无论新旧服务器是否是同一类别的平台。这无疑帮助我们节约了大量的宝贵时间,并降低部署过程出现问题的风险。
作为一个作为一种轻量级的虚拟化方式,Docker 在运行应用上跟传统的虚拟机的方式相比具有如下显著优势:
Dockerfile
支持灵活的自动化创建和部署机制,可以提高工作效率,并标准化流程。
特性 | 容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
隔离级别 | 进程级 | 操作系统级别 |
隔离策略 | CGroups | Hypervisor |
性能 | 接近原生 | 较好 |
内存 | MB级 | GB级 |
系统资源 | 0~5% | 5~15% |
镜像储存 | KB-MB | GB-TB |
硬盘适应 | MB级 | GB级 |
集群规模 | 上万 | 上百 |
运行密度 | 单台主机支持上千个 | 单台主机支持几个 |
隔离性 | 安全隔离 | 完全隔离 |
迁移 | 优秀 | 一般 |
高可用策略 | 弹性、负载、动态 | 备份、容灾、迁移 |
docker
比VM
快的原因:Hypervisor
实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源 因此在CPU、内存利用率上docker将会在效率上有明显优势
docker
利用的是宿主机的内核,而不需要Centos
Centos
这个新建过程是"分钟级别的"
Docker 以及其他容器技术,都属于操作系统虚拟化范畴,操作系统细腻化最大的特点就是不需要额外的 supervisor 支持。Docker 虚拟化方式之所以有众多优势,跟操作系统虚拟化技术自身的设计和实现分不开。
传统方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层。Docker 容器时在操作系统层面实现虚拟化,直接复用本地主机的操作系统,因此更加轻量级。
docker pull
的时候,Docker damemon
先在本地仓库中找,如果没有,再去中央仓库中拉取,拉取到本地仓库就好了。
docker run
的时候,也是先在本地仓库中找,如果有,直接放到容器里用。否则,去中央仓库中拉取。
docker的理念:一次构建处处运行
对于开发和运维人员来说,最梦寐以求的效果可能就是一次创建和配置,之后可以在任意地方、任意时间让应用正常运行,而 Docker 恰恰可以实现这一中级目标。具体来说,在开发和运维过程中,Docker 具有以下几个方面的优势:
Hypervisor
支持,所以在一台物理机上"可以运行很多个容器实例",可大大"提升物理服务器的CPU和内存的利用率"
https://www.zhihu.com/question/28300645
http://blog.51cto.com/ganbing/2085769?from=timeline&isappinstalled=0
http://c.biancheng.net/view/3118.html