docker 如日中天,这不是单纯的炒概念,docker 确确实实解决了开发与运维的痛点,所以在企业开发中获得了很是普遍的使用,本文对于 docker 的这些基本知识点再作一些简单回顾。mysql
根据 wikipedia 中的介绍:linux
Docker 是一个开放源代码软件项目,让应用程序布署在软件容器下的工做能够自动化进行,借此在 Linux 操做系统上,提供一个额外的软件抽象层,以及操做系统层虚拟化的自动管理机制。
Docker 利用 Linux 核心中的资源分脱机制,例如 cgroups ,以及 Linux 核心名字空间(name space),来建立独立的软件容器(containers)。这能够在单一 Linux 实体下运做,避免启动一个虚拟机形成的额外负担。Linux 核心对名字空间的支持彻底隔离了工做环境中应用程序的视野,包括进程树、网络、用户 ID 与挂载文件系统,而核心的 cgroup 提供资源隔离,包括 CPU 、存储器、block I/O 与网络。从 0.9 版本起,Dockers 在使用抽象虚拟是经由 libvirt 的 LXC 与 systemd - nspawn 提供界面的基础上,开始包括 libcontainer 库作为以本身的方式开始直接使用由 Linux 核心提供的虚拟化的设施。
依据行业分析公司“451研究”:“Dockers 是有能力打包应用程序及其虚拟容器,能够在任何 Linux 服务器上运行的依赖性工具,这有助于实现灵活性和便携性,应用程序在任何地方均可以运行,不管是公有云、私有云、单机等。” 。nginx
这里的介绍有点绕口,让我来介绍下 docker 解决了哪些痛点:sql
简化环境管理docker
传统的软件开发与发布环境复杂,配置繁琐,常常有读者在微信上问:个人代码开发环境能够运行,一旦部署到服务器上就运行不了了。这个问题很常见,也确实很烦人,可是问题总要解决,开发环境、测试环境、生产环境,每一个环节都有可能出现这样那样的问题,若是可以在各个环境中实现一键部署,就会方便不少,例如一键安装 linux 、一键安装 mysql、一键安装 nginx 等,docker 完全解决了这个问题。shell
虚拟化更加轻量级数据库
说到容器,说到虚拟化,不少人总会想到虚拟机,想到 VMware、VirtualBox 等工具,不一样于这些虚拟技术,docker 虚拟化更加轻量级,传统的虚拟机都是先虚拟出一个操做系统,而后在操做系统上完成各类各样的配置,这样并不能充分的利用物理机的性能,docker 则是一种操做系统级别的虚拟技术,它运行在操做系统之上的用户空间,全部的容器都共用一个系统内核甚至公共库,容器引擎提供了进程级别的隔离,让每一个容器都像运行在单独的系统之上,可是又可以共享不少底层资源。所以 docker 更为轻量、快速和易于管理。后端
程序可移植安全
有了前面介绍的两个特色,程序可移植就是瓜熟蒂落的事情了。服务器
前面介绍了 docker 与传统虚拟机的差别,经过下表再来详细了解下这种差别:
docker | 虚拟机 | |
---|---|---|
相同点 | 1. 均可在不一样的主机之间迁移 2. 都具有 root 权限 3. 均可以远程控制 4. 都有备份、回滚操做 |
|
操做系统 | 在性能上有优点,能够轻易的运行多个操做系统 | 能够安装任何系统,可是性能不及容器 |
原理 | 和宿主机共享内核,全部容器运行在容器引擎之上,容器并不是一个完整的操做系统,全部容器共享操做系统,在进程级进行隔离 | 每个虚拟机都创建在虚拟的硬件之上,提供指令级的虚拟,具有一个完整的操做系统 |
优势 | 高效、集中。一个硬件节点能够运行数以百计的的容器,很是节省资源,QoS 会尽可能知足,但不保证必定知足。内核由提供者升级,服务由服务提供者管理 | 对操做系统具备绝对权限,对系统版本和系统升级具备彻底的管理权限。具备一整套的的资源:CPU、RAM 和磁盘。QoS 是有保证的,每个虚拟机就像一个真实的物理机同样,能够实现不一样的操做系统运行在同一物理节点上。 |
资源管理 | 弹性资源分配:资源能够在没有关闭容器的状况下添加,数据卷也无需从新分配大小 | 虚拟机须要重启,虚拟机里边的操做系统须要处理新加入的资源,如磁盘等,都须要从新分区。 |
远程管理 | 根据操做系统的不一样,能够经过 shell 或者远程桌面进行 | 远程控制由虚拟化平台提供,能够在虚拟机启动以前链接 |
缺点 | 对内核没有控制权限,只有容器的提供者具有升级权限。只有一个内核运行在物理节点上,几乎不能实现不一样的操做系统混合。容器提供者通常仅提供少数的几个操做系统 | 每一台虚拟机都具备更大的负载,耗费更多的资源,用户须要全权维护和管理。一台物理机上可以运行的虚拟机很是有限 |
配置 | 快速,基本上是一键配置 | 配置时间长 |
启动时间 | 秒级 | 分钟级 |
硬盘使用 | MB | GB |
性能 | 接近原生态 | 弱于原生态 |
系统支持数量 | 单机支持上千个 | 通常很少于几十个 |
不一样与传统容器,docker 早起基于 LXC,后来基于自研的 libContainer,docker 对于传统容器作了许多优化,以下:
docker 中有三大核心组件:
镜像是一个只读的静态模版,它保存了容器须要的环境和应用的执行代码,能够将镜像当作是容器的代码,当代码运行起来以后,就成了容器,镜像和容器的关系也相似于程序和进程的关系。
容器是一个运行时环境,是镜像的一个运行状态,它是镜像执行的动态表现。
库是一个特定的用户存储镜像的目录,一个用户能够创建多个库来保存本身的镜像。
相对而言,Linux 上安装 Docker 是最容易的,其次是 Mac ,最后是 Windows ,Windows 所以要装的东西比较多,官方也提供了两个不一样的安装包,支持不一样的 Windows 的不一样版本,一个是针对 Win10 的安装引导程序,还有一个是兼容性较好的 Toolbox ,可是在 Windows 上运行 Docker ,后期在虚拟目录等方面还会遇到各类问题,因此这里松哥是很是不建议你们在 Windows 中安装 Docker ,有 Mac 的上 Mac (Mac 上安装 Docker 就像安装普通软件同样),没有 Mac 的装 Linux 虚拟机,再装 Docker 便可,这里我就先以 CentOS 上安装 Docker 为例,来讲说 Docker 安装。
分别执行以下安装命令:
# 首先安装 Docker yum -y install docker # 而后启动 Docker 服务 service docker start # 测试安装是否成功 docker -v
安装完成后,看到以下页面,表示安装成功:
本文主要向你们介绍了 Docker 的基本概念以及 Docker 的安装 ,下篇文章咱们向你们介绍 Docker 中基本的容器操做。有问题欢迎留言讨论。
参考资料:
[1] 曾金龙,肖新华,刘清.Docker开发实践[M].北京:人民邮电出版社,2015.
关注公众号牧码小子,专一于 Spring Boot+微服务以及先后端分离等全栈技术,按期视频教程分享,关注后回复 Java ,领取松哥为你精心准备的 Java 干货!