Docker 是什么?
Docker 是一个用于构建、发布和运行程序的开源项目。 它是一个命令行程序、一个后台进程和一组远程服务。和物流运输物品的过程很相似,可以将 Docker 视为一家软件物流提供商,主要用于解决软件常见的问题,简化安装、运行、发布和删除软件的过程。 它通过使用称为容器(Containers)的技术来实现这一点。
Containers
任何使用 Docker 运行的软件都在容器内运行。 Docker 使用现有的容器引擎来提供根据最佳实践构建的一致容器。和虚拟机很像,软件都是在互相隔离的环境内运行,但是容器不是虚拟机。
容器不是虚拟机
虚拟机是在操作系统中模拟硬件设备,然后运行另一个操作系统,这需要很长时间才能创建,并且需要大量的资源开销,因为除了要使用的软件外还运行整个操作系统。比如在 Windows 系统里面运行 Ubuntu 系统,这样就可以运行任意的 Ubuntu 应用了。而 Docker 仅仅是封装软件需要的一些库,并没有模拟完整的操作系统。
虚拟机提供硬件抽象,以便可以运行操作系统。 而容器仅仅是操作系统的一项功能。 所以,如果虚拟机运行的是现代 Linux 内核的操作系统,那么就可以在虚拟机中运行 Docker。所以,Docker 就是一个系统进程,它们是互补的技术。
在容器中运行软件
Docker 是一个CS架构的程序,由两部分组成:
- 服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器等
- 客户端(client):这是与用户交互的 Docker 程序,启动、停止或安装软件,就需要通过命令向Docker服务端发送指令。
如图:
图上显示了三个正在运行的容器。 每个进程都作为 Docker 引擎的子进程运行,用容器包装,并且各自对应的进程在用户空间的自己的内存子空间中运行。 在容器内运行的程序只能访问容器范围内自己的内存和资源。
集装箱
可以把 Docker 容器想象成一个物理运输集装箱。但是,它存储的不是货物,而是一个存储和运行应用程序及其所有依赖项(不包括正在运行的操作系统内核)的集装箱。正如起重机、卡车、火车和船舶可以轻松地运输这些箱子一样,Docker也可以轻松地运行、复制和分发容器。
Docker解决了什么问题?
大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题:
- 依赖关系复杂,容易出现兼容性问题
- 开发、测试、生产环境有差异,
必须考虑正在使用的操作系统、软件所需的资源、已经安装的其他软件以及它依赖的其他软件。需要决定安装在哪里,以及如何安装。如果想确保多台机器随着时间的推移使用一组一致的软件,那么这些问题只会变得更糟。当应用程序共享依赖项时,事情只会变得更加复杂,比如一个应用程序需要升级依赖项,但另一个应用程序不需要,等等,如图:
而 Docker 巧妙的解决了这些问题,Docker 将应用的函数库、依赖、配置与应用一起打包,将每个应用放到一个隔离容器去运行,避免互相干扰,这样打包好的应用包中,既包含应用本身,也保护应用所需要的函数库、依赖,无需再操作系统上安装这些,自然就不存在不同应用之间的兼容问题了,即便更换操作系统,也可由直接基于打包的函数库,借助于操作系统的Linux内核来运行。如图:
可以看到,Docker 通过使用容器和镜像隔离所有内容来保持事物井井有条。