走进Docker的世界

走进Docker的世界

Docker是什么

Docker 是一个开源的应用容器引擎,它允许开发人员将应用程序及其依赖项打包到一个轻量级的、可移植的容器中,从而简化了应用程序的部署和管理。

Docker 最初是由 dotCloud 公司开发的,现在已经成为了开源社区的一部分,并被广泛使用于企业应用的部署和管理。除了 Docker 本身,还有许多基于 Docker 的工具和库,如 Docker CE、Docker for Mac 和 Docker Swarm。

Docker的构想是要实现“Build, Ship and Run Any App, Anywhere”,即通过对应用的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)生命周期进行管理,达到应用组件级别的“一次封装,到处运行”。这里的应用组件,既可以是一个Web应用、一个编译环境,也可以是一套数据库平台服务,甚至是一个操作系统或集群。

Docker的用途

Docker的用途主要包含如下:

  1. 可移植性:Docker 允许应用程序在不同的操作系统平台上运行,从而使得应用程序具有更高的可移植性。
  2. 容器化:Docker 将应用程序及其依赖项打包到一个轻量级的、可移植的容器中,使得应用程序可以像包一样分发和部署,从而降低了应用程序的打包和部署成本。
  3. 热部署:Docker 的快速部署能力使得开发人员可以快速地启动和停止应用程序,从而实现快速的应用程序发布。
  4. 安全性:Docker 提供了隔离容器的能力,可以减少容器内应用程序的交互,从而提高了应用程序的安全性。
  5. 可扩展性:Docker 可以轻松地扩展容器的数量,从而实现应用程序的可扩展性。
  6. 管理性:Docker 提供了丰富的管理工具,包括 Docker API、Docker CLI 和 Docker守护进程,可以帮助开发人员更容易地管理和监控应用程序。

举个简单的例子,假设用户试图基于SpringBoot+Nginx+Redis+Mysql组合来构建网站。按照传统的做法,首先需要安装Nginx、Mysql、Redis以及它们各自运行所依赖的环境;之后分别对它们进行配置(包括创建合适的用户、配置参数等);经过大量的操作后,还需要进行功能测试,看是否工作正常;如果不正常,则进行调试追踪,意味着更多的时间代价和不可控的风险。可以想象,如果应用数目变多,事情会变得更加难以处理。

更为可怕的是,一旦需要服务器迁移(例如从亚马逊云迁移到其他云),往往需要对每个应用都进行重新部署和调试。这些琐碎而无趣的“体力活”,极大地降低了用户的工作效率。究其根源,是这些应用直接运行在底层操作系统上,无法保证同一份应用在不同的环境中行为一致。

而Docker提供了一种更为聪明的方式,通过容器来打包应用、解耦应用和运行平台。这意味着迁移的时候,只需要在新的服务器上启动需要的容器就可以了,无论新旧服务器是否是同一类型的平台。这无疑将帮助我们节约大量的宝贵时间,并降低部署过程出现问题的风险。

Docker与虚拟机比较

作为一种轻量级的虚拟化方式,Docker在运行应用上跟传统的虚拟机方式相比具有如下显著优势:

  • Docker容器很快,启动和停止可以在秒级实现,这相比传统的虚拟机方式(数分钟)要快得多;
  • Docker容器对系统资源需求很少,一台主机上可以同时运行数千个Docker容器(在IBM服务器上已经实现了同时运行10K量级的容器实例);
  • Docker通过类似Git设计理念的操作来方便用户获取、分发和更新应用镜像,存储复用,增量更新;
  • Docker通过Dockerfile支持灵活的自动化创建和部署机制,以提高工作效率,并标准化流程。

Docker容器除了运行其中的应用外,基本不消耗额外的系统资源,在保证应用性能的同时,尽量减小系统开销。传统虚拟机方式运行N个不同的应用就要启用N个虚拟机(每个虚拟机需要单独分配独占的内存、磁盘等资源),而Docker只需要启动N个隔离得“很薄的”容器,并将应用放进容器内即可。应用获得的是接近原生的运行性能。

image

image

Docker架构

Docker 使用客户端-服务器架构。Docker客户端与 Docker守护进程进行交互,后者负责构建、运行和分发 Docker 容器的繁重工作。Docker 客户端和守护进程可以部署在一起或者分开部署。Docker 客户端和守护进程使用 REST API 通过 UNIX 套接字或网络接口进行通信。架构图如下:

image

  • Client(Docker客户端)

Docker 客户端 ( docker) 是许多 Docker 用户与 Docker 交互的主要方式。可以使用诸如docker run之类的命令,客户端会将这些命令发送到Docker守护进程,由后者执行。该docker命令使用 Docker API。Docker 客户端可以与多个守护进程通信。

  • Docker daemon(Docker守护进程)

Docker 守护进程 ( dockerd) 侦听 Docker API 请求并管理 Docker 对象,例如图像、容器、网络和卷。守护进程还可以与其他守护进程通信以管理 Docker 服务。

  • Images(镜像)

Docker 镜像是用于创建 Docker 容器的模板。是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。

  • Containers(容器)

Docker容器类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。容器是从镜像创建的应用运行实例。它可以启动、开始、停止、删除,而这些容器都是彼此相互隔离、互不可见的。可以把容器看作一个简易版的Linux系统环境(包括root用户权限、进程空间、用户空间和网络空间等)以及运行在其中的应用程序打包而成的盒子。

  • Registry(镜像中心)

Docker 的镜像中心中存放着很多由官方、其他机构或个人创建的 Docker 仓库,而Docker仓库类似于代码仓库,是Docker集中存放镜像文件的场所。

Docker 用户可以直接从这些仓库中 pull 需要的镜像,也可以将自己制作的镜像 push 到 Docker 镜像 中心相应的仓库中。最常用的镜像中心是 Docker 官方的 Docker Hub(https://hub.docker.com)。

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    qzxdp.cn

    暂无评论内容