docker初识之五分钟认识docker_docker

什么是docker?

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

把他想象成一个用了一种新颖方式实现的超轻量虚拟机,在大概效果上也是正确的。当然在实现的原理和应用上还是和VM有巨大差别的,并且专业的叫法是应用容器(Application Container)。

为啥要用docker?

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

那么我直接装个 MySQL不就好了,何必还需要这个容器这么诡异的概念?话是这么说,可是你要真装MySQL的话可能要再装一堆依赖库,根据你的操作系统平台和版本进行设置,有时候还要从源代码编译报出一堆莫名其妙的错误,可不是这么好装。而且万一你机器挂了,所有的东西都要重新来,可能还要把配置在重新弄一遍。但是有了容器,你就相当于有了一个可以运行起来的虚拟机,只要你能运行容器,MySQL的配置就全省了。而且一旦你想换台机器,直接把这个容器端起来,再放到另一个机器就好了。硬件,操作系统,运行环境什么的都不需要考虑了。

在公司中的一个很大的用途就是可以保证线下的开发环境、测试环境和线上的生产环境一致。当年在***经常碰到这样的事情,开发把东西做好了给测试去测,一般会给一坨代码和一个介绍上线步骤的上线单。结果代码在测试机跑不起来,开发就跑来跑去看问题,一会儿啊这个配置文件忘了提交了,一会儿啊这个上线命令写错了。找到了一个 bug 提上去,开发一看,啊我怎么又忘了把这个命令写在上线单上了。类似的事情在上线的时候还会发生,变成啊你这个软件的版本和我机器上的不一样……在 ***的时候,由于一个开发直接担任上述三个职位,而且有一套自动化部署的机制所以问题会少一点,但是上线的时候大家还是胆战心惊。

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

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

docker在很大程度上可以解决的问题

软件更新发布低效

业务无法敏捷

环境一致性,难于保证

不同环境之间迁移成本太高

软件开发商,交付实施周期长—-成本高

那为啥不用VM?

那么既然容器和 VM 这么类似为啥不直接用 VM 还要整出个容器这么个概念来呢?Docker 容器相对于 VM 有以下几个优点:

启动速度快,容器通常在一秒内可以启动,而 VM 通常要更久
资源利用率高,一台普通 PC 可以跑上千个容器,你跑上千个 VM 试试
性能开销小, VM 通常需要额外的 CPU 和内存来完成 OS 的功能,这一部分占据了额外的资源
为啥相似的功能在性能上会有如此巨大的差距呢,其实这和他们的设计的理念是相关的。 VM 的设计图如下:

VM 的 Hypervisor 需要实现对硬件的虚拟化,并且还要搭载自己的操作系统,自然在启动速度和资源利用率以及性能上有比较大的开销。而 Docker 的设计图是这样的:

Docker 几乎就没有什么虚拟化的东西,并且直接复用了 Host 主机的 OS,在 Docker Engine 层面实现了调度和隔离重量一下子就降低了好几个档次。 Docker 的容器利用了 lxc,管理利用了 namespaces 来做权限的控制和隔离, cgroups 来进行资源的配置,并且还通过 aufs 来进一步提高文件系统的资源利用率。

其中的 aufs 是个很有意思的东西,是 UnionFS 的一种。他的思想和 git 有些类似,可以把对文件系统的改动当成一次 commit 一层层的叠加。这样的话多个容器之间就可以共享他们的文件系统层次,每个容器下面都是共享的文件系统层次,上面再是各自对文件系统改动的层次,这样的话极大的节省了对存储的需求,并且也能加速容器的启动。

时间: 2024-10-02 18:47:00

docker初识之五分钟认识docker_docker的相关文章

docker初识

转:作者@oilbeater 官网的介绍是这样的: Docker is an open platform for developers and sysadmins to build, ship, and run distributed applications.... 其实看完这句话还是不明白究竟是啥的,下面就慢慢解释.不过长话短说的话,把他想象成一个用了一种新颖方式实现的超轻量虚拟机,在大概效果上也是正确的.当然在实现的原理和应用上还是和VM有巨大差别的,并且专业的叫法是应用容器(Applic

Docker基础之五: 使用Docker容器

使用Docker容器 (对Docker感兴趣的朋友可以加我的微信ghostcloud2016,然后我把你加到我们的一个Docker爱好者群组里面.) 这一节我们将从运行一个简单的Hello world入手,来讲解如何使用容器. 1 运行Hello World root@shev:~# docker run ubuntu:14.04 echo hello-world hello-world root@shev:~# docker ps -a CONTAINER ID IMAGE COMMAND C

【技术干货】Docker精华学习资料集锦,老司机快上车

Docker是一个开源的应用容器引擎,提供了一种在安全.可重复的环境中自动部署软件的方式,允许开发者将他们的应用和依赖包打包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化.容器完全使用沙箱机制,相互之间不会有任何接口.几乎没有性能开销,可以很容易地在机器和数据中心中运行.重要的是,它不依赖于任何语言.框架或包装系统. 正如Docker的logo一样,Docker的思想就是源于集装箱,集装箱解决了各种型号.规格的货物在各种运输工具上进行运输的问题,而集装箱和集装箱之间

【软妹带你学技术】十一份Docker福利包疯狂砸来,看官们还请轻戳呦

如果你是冲着软妹来的话,sorry恐怕你注定是要失望啦.不过,为了广大男同胞的身心健康,还是鼓起勇气决定爆照一张!!!   哈哈哈哈哈哈是不是卡哇伊内!口水收一收,再可爱也不是你家的(话说小编我Search的时候,那啥口水没收住,好丢脸......)毕竟想象是美好的,现实是骨感的,咱们还是回归当下,脚踏实地做人做事!Come on,回咱们的狗窝去T_T......   好了好了,思绪收一收,穿上我们的盔甲.执起我们的电脑,在泡面声声中进入今天的技术谈(妹纸再美看看就好!唯有手中的笔.脑中的知识会

Docker -- 系统整洁之道 -- 0

在我的小 rmbp 256G的硬盘里,实在是装不下100多个G的虚拟机了,所以想把一些东西迁移到这两年很火的Docker下,Docker以前也有过一两次,只是按着别人给的用法用的,具体的一些细节并没有深入,和git一样,这么牛掰的东西怎么能不好好学一些呢? Docker和虚拟机的区别 Docker是一种容器,虚拟机是一种管理程序虚拟机化(hypervisor virtualization,HV).管理程序虚拟化通过中间层将一台或者多台独立的机器虚拟运行在物理硬件之上,而容器(比如Docker)则

CoreOS集成Kubernetes核心组件Kubelet

本文讲的是CoreOS集成Kubernetes核心组件Kubelet,[编者的话]本文为CoreOS官方博客发布的新闻和说明,介绍了CoreOS中对Kubernetes的核心组件kubelet的集成和支持.通过在CoreOS中安装和使用Kubelet,演示了Kubelet的使用技巧,以及如何在Kubernetes中更好的管理和监控容器资源 . 这周我们在CoreOS Linux的alpha开发版中集成了kubelet--Kubernetes的一个核心内嵌组件.Kubelet负责维护pod(应用实

初识Docker,概念-架构-相关术语

介绍Docker概念与平台架构,相关术语 Docker的历史 诞生 Docker 是Docker.Inc 公司开源的一个基于 LXC技术之上构建的Container容器引擎,基于Google 公司推出的 Go语言实现的云开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目.项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护.而且居然只有 1W 行就完成了这些功能.如果想尝试一下的话可以看 官方介绍了.   D

初识docker—创建WEB应用容器1python+flask

初识docker-创建WEB应用容器1python+flask Docker 客户端 docker 客户端非常简单 ,我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项. runoob@runoob:~# docker 可以通过命令 docker command --help 更深入的了解指定的 Docker 命令使用方法. 例如我们要查看 docker stats 指令的具体使用方法: runoob@runoob:~# docker stats --help 运行

《自己动手写Docker》书摘之五: 增加容器资源限制

增加容器资源限制 上一节中,我们已经可以通过命令行mydocker run -ti的方式创建并启动容器,这一节我们将通过Cgroup对容器的资源进行控制. 这一节中我们将实现通过mydocker run -ti -m 100m -cpuset 1 -cpushare 512 /bin/sh的方式控制容器容器的内存和CPU配置. 定义Cgroups的数据结构 上一章中我们介绍了Cgroups包含的三个概念:  cgroup hierarchy中的节点,用于管理进程和subsystem的控制的关系.