写在前面
公司项目后续规划中, 可能会使用到 Docker, 但是对于 Docker 还只停留在听说过和看过几篇博客的阶段。 没办法,学呗 !谁让只有光头,才能变强呢。现在把自己学习过程中的总结记录如下:
Docker 是什么?
Docker 是世界领先的软件容器平台。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用 Docker 可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用 Docker 可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为 Linux 和 Windows Server 应用发布新功能。
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
为啥使用 Docker?
相比较于传统的虚拟机技术来说,容器除了运行其中的应用以外, 基本不消耗额外的系统资源, 所以性能很高, 同样的配置下,容器可以比虚拟机部署得更多。总的来说, Docker在如下几个方面具有很大的优势。
1. 更加快速的交付和部署
对于每一个开发人员来说,自己的程序可以一次编写到处运行是一件很爽的事情,这也是 JAVA语言的设计思想。
对于 Docker,开发者可以使用一个标准的基础镜像来构建自己的开发镜像,开发完成之后,测试人员可以直接使用这个镜像来进行测试, 如果测试有问题,开发人员可以直接在原有镜像基础上进行修改,这样保证不会出现为啥在自己的环境上运行的好好的,但是一到测试环境就跪的问题。
Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。这一点让笔者羡慕不已, 因为笔者做的是服务器管理软件,经常出现一种情况是,可能只改了不到100行代码,但是为了验证这些代码,搭环境要花费多半天。有了 Docker 之后,这个问题就能得到很大的缓解。
2. 更高效的虚拟化
Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。
3. 更轻松的迁移和扩展
Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户可以把一个应用程序像拷贝文件一样,轻松的从一个平台直接迁移到另外一个。
4. 更简单的管理
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
Docker 中的相关概念
Docker是基于CS的架构, 所以主要有两个基本组成:
- Docker 守护进程
Docker 守护进程运行在宿主机上, 用户通过 Docker Client 与 Docker 守护进程进行交互,进而操作 Docker镜像,这一点很像 Linux 中的系统内核。 -
Docker Client
Docker 命令行工具,是用户使用 Docker 的主要方式,Docker Client 与Docker 守护进程通信并将结果返回给用户,Docker Client 也可以通过 socket 或者 RESTful api 访问远程的Docker 守护进程。这个相当于 Linux中的 Shell。
Docker 中的三个主要概念:
-
镜像:
在 Docker 中,镜像是容器的基石。容器基于镜像构建和运行,这一点类似于JAVA中的类。镜像实质上是一个层叠的文件系统,结构如下图所示。在最底层是一个引导文件系统,当一个容器被启动后,它会被加载到内存,而引导文件系统则会被卸载。第二层是 root文件系统,可以是多种的文件系统,构成了整个镜像的基础。在 root文件系统之上,可以叠加多层的只读文件系统。Docker 通过联合加载技术,将这些文件系统同时加载进来, 在外界看来,只有一个文件系统。这一系列只读文件系统,在 Docke r中统称为镜像。
- 容器
容器基于镜像创建和启动,当容器第一次启动的时候,Docker 会在镜像的只读文件系统最上层创建一个可写文件系统,容器中的应用的所有操作都在这一层完成。
当在 Docker 容器中想要修改一个文件时,这个文件会从最下层的只读文件系统中复制一份到可写文件系统中,该文件的只读版本依然存在,但是会被可写层中的副本所隐藏。这就是 Docker 中一个重要的技术-写时复制。 - 仓库
Docker 使用仓库来存储用户创建的镜像。类似于Java中的Maven仓库,Docker 仓库分为公有仓库和私有仓库,Docker官方的仓库是 Docker Hub。
Docker 完整的架构如下图所示:
Docker 与 传统 VM 的对比
从下图可以看出,VM是一个运行在宿主机之上的完整的操作系统,VM运行自身操作系统会占用较多的CPU、内存、硬盘资源。Docker不同于VM,只包含应用程序以及依赖库,基于libcontainer运行在宿主机上,并处于一个隔离的环境中,这使得Docker更加轻量高效,启动容器只需几秒钟之内完成。由于Docker轻量、资源占用少,使得Docker可以轻易的应用到构建标准化的应用中。但Docker目前还不够完善,比如隔离效果不如VM,共享宿主机操作系统的一些基础库等;网络配置功能相对简单,主要以桥接方式为主;查看日志也不够方便灵活。
Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。
作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多;Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。
本篇博客参考博主“纯洁的微笑"的Docker(一):Docker入门教程所写,欢迎大家前往阅读。