Docker 是一个开源的应用容器(container)引擎(轻量级虚拟机),可以轻松的为任何应用创建一个轻量级的、可移植的、可隔离的、自给自足的容器。
超轻量的虚拟机:Docker 几乎就没有什么虚拟化的东西,并且直接复用了 Host 主机的 OS,提供类似虚拟机(KVM)之类的OS。
可移植:用户的实例可以很方便地,在Unix上进行复制、移动和重建,docker(主要)利用AUFS实现,别忘了,虚拟机(KVM)是可以迁移的。
可隔离:每个用户实例之间的数据和内存空间相互隔离,以保证一定的安全性。
自给自足的容器:每一个docker实例,包含了所有的环境依赖关系。
一个做好的应用容器,好像一个装好了一组特定应用的虚拟机一样。
简单理解:
1、应用环境:MySQL
2、方案:MySQL的容器(Docker)、MySQL的虚拟机(KVM)?
①、MySQL的容器(Docker):
有了容器,你就相当于有了一个可以运行起来的虚拟机,只要你能运行容器,MySQL的配置就全省了。而且想迁移到别的机器,直接把这个容器端起来(docker save),再放到另一个机器(docker load)就好了。硬件,操作系统,运行环境什么的都不需要考虑了,除了数据以外。
②、MySQL的虚拟机(KVM):
装MySQL的话可能要再装一堆依赖库,根据你的操作系统平台和版本进行设置,有时候还要从源代码编译报出一堆莫名其妙的错误,可不是这么好装。而且万一你机器挂了,所有的东西都要重新来,可能还要把配置在重新弄一遍。
3、测试与生产环境:
在公司中的一个很大的用途,就是可以保证线下的开发环境、测试环境和线上的生产环境一致。
Baidu 经常碰到这样的事情,开发把东西做好了给测试去测,一般会给一坨代码和一个介绍上线步骤的上线单。结果代码在测试机跑不起来,开发就跑来跑去看问题,一会儿啊这个配置文件忘了提交了,一会儿啊这个上线命令写错了。找到了一个 bug 提上去,开发一看,啊我怎么又忘了把这个命令写在上线单上了。
类似的事情在上线的时候还会发生,变成这个软件的版本和我机器上的不一样……在 Amazon 的时候,由于一个开发直接担任上述三个职位,而且有一套自动化部署的机制所以问题会少一点,但是上线的时候大家还是胆战心惊。
若利用容器的话,那么开发直接在容器里开发,提测的时候把整个容器给测试,测好了把改动改在容器里再上线就好了。通过容器,整个开发、测试和生产环境可以保持高度的一致。
Google 为全球用户提供互联网服务,需要在分布在全球各地的服务器上部署相关应用程序。
传统的部署模式下,Google 工程师需要在每一台服务器上进行相当复杂的操作才能够完成部署。
如果使用 Docker,工程师在全球各地服务器上部署应用的过程将变得非常简单,只需要将应用打包、复制、传送、导入,即可完成部署。