Docker 简介
Docker 是什么
Docker 是一种运行于 Linux 和 Windows 上的软件,用于创建、管理和编排容器。
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux 或 Windows 操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker 容器与虚拟机类似,但二者在原理上不同。容器是将操作系统层虚拟化,虚拟机则是虚拟化硬件,因此容器更具有便携性、高效地利用服务器。 容器更多的用于表示软件的一个标准化单元。由于容器的标准化,因此它可以无视基础设施(Infrastructure)的差异,部署到任何一个地方。另外,Docker 也为容器提供更强的业界的隔离兼容。
Docker 平台就是一个软件集装箱化平台,这就意味着我们自己可以构建应用程序,将其依赖关系一起打包到一个容器中,然后这容器就很容易运送到其他的机器上进行运行,而且非常易于装载、复制、移除,非常适合软件弹性架构。
Docker 的底层运行原理,如下图:
Docker 服务启动 -> 下载镜像 -> 启动该镜像得到一个容器 -> 容器里运行着我们想要的程序;
主机(Host)
: 一个物理机或虚拟机, 用于运行Docker服务进程和容器, 也成为宿主机, node 节点;客户端(Client)
:客户端使用 docker 命令或其他工具调用 docker API;镜像(image)
:Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。 就好似 Python 中的类和对象,镜像就是类,容器就是对象。容器(container)
:Docker 利用容器(Container)独立运行的一个或一组应用。容器是用镜像创建的运行实例。 它可以被启动、开始、停止、删除。每个容器都是相互隔离的,保证安全的平台。 可以把容器看做是一个简易版的 Linux 环境(包括 root 用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的仓库(repository)
:仓库(Repository)是集中存放镜像文件的场所。 仓库(Repository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。 仓库分为公开仓库(Public)和私有仓库(Private)两种形式。 最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。 国内的公开仓库包括阿里云、腾讯云等,也可以搭建私有仓库 Harbor;
需要正确的理解镜像、容器、仓库的概念
有人会误以为,Docker 就是容器,但 Docker 不是容器,而是管理容器的引擎。
我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是 image 镜像文件。只有通过这个镜像文件才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。image 文件生成的容器实例,本身也是一个文件,称为镜像文件。
一个容器运行一种服务,当我们需要的时候,就可以通过 docker 客户端创建一个对应的运行实例,也就是我们的容器。
仓库,就是放了一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候从仓库中拉下来就可以了。
Docker 容器通过 Docker 镜像来创建。镜像与容器的关系类似于面向对象编程中的类与对象的关系。
Docker | 面向对象 |
---|---|
镜像 | 类 |
容器 | 对象 |
为什么要使用 Docker?
作为一种新兴的虚拟化方式, Docker 跟传统的虚拟化方式相比具有众多的优势。
首先, Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。
其次, Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。
容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。
传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而 Docker 只需要启动 10 个隔离的应用即可。
具体说来, Docker 在如下几个方面具有较大的优势。
更快速的交付和部署
:对开发和运维( devops )人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。Docker 容器很轻很快。容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。更高效的虚拟化
:Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。更轻松的迁移和扩展
:Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。更简单的管理
:使用 Docker ,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发 和更新,从而实现自动化并且高效的管理。
对比传统虚拟机
特性 | 普通虚拟机 | Docker |
---|---|---|
跨平台 | 通常只能在桌面级系统运行,例如 Windows、Mac,无法在不带图形界面的服务器上运行 | 支持的系统多,各种 Windows、Linux 都支持 |
性能 | 性能损耗大,内存占用高,因为是把整个完整系统都虚拟出来 | 性能好,只虚拟软件所需运行环境,最大化减少没用的配置 |
自动化 | 需要手动安装所有东西 | 一个命令、或者一个文件就可以自动部署好所需环境 |
稳定性 | 稳定性不高,不同系统差异大 | 稳定性好,不同系统都一样部署方式 |
当然 Docker 也是存在缺点的,就是隔离性差,多个容器共用宿主机的内核, 各应用之间的隔离不如虚拟机彻底
Docker 通常用来做什么
- 应用分发、部署,方便传播给他人安装。特别是开源软件和提供私有部署的应用;
- 快速安装测试/学习软件,用完就丢(类似小程序),不把时间浪费在安装软件上。例如 Redis / MongoDB / ElasticSearch / ELK;
- 多个版本软件共存,不污染系统,例如 Python2、Python3,MySQL 5.7,MYSQL 8;
- Windows 上体验/学习各种 Linux 系统。