Docker概念与传统虚拟化技术的差异

  • Docker 实现的是基于进程级别的虚拟化实现,其与传统虚拟化技术最大的区别在于:传统虚拟化技术运行于一套完整的虚拟化硬件基础之上,而Docker容器则直接运行于宿主机硬件之上。
  • 基于以上概念的不同,Docker相较于传统虚拟化技术有更高的资源利用率;
    传统虚拟化技术:客户机只能利用所分配的硬件资源;而且当前客户机资源空闲时,其他客户机或者宿主机也无法利用空闲资源,当客户机资源不足时,客户机可能出现宕机的风险。
    Docker:客户机直接使用宿主机硬件资源,意味着Docker客户机和宿主机之间的资源是共享的,不会造成资源浪费,在宿主机硬件资源充足的情况下Docker客户机也不存在资源不足的情况。

Docker架构

图片网上扒的,看看就行了0.0;从图中可以看到,Docker整体是C/S的结构,开发者可以使用Docker CLI 通过调用 Docker 的 API 接口,与Docker 服务器交互。

下面大致介绍一下几个主要的角色

docker 与 宿主机 的系统 docker和宿主机 操作系统不同_docker 与 宿主机 的系统

  • 镜像(Images)
    镜像在仓库中的存储方式与Maven中的jar包类似,可以对比理解。
    Maven中,开发者要定位某个jar包,需要使用 GAV坐标来指定:
    一个指定的组,组下面指定的包名,同一个包指定的版本;
    镜像也是类似的:
    【仓库名/软件名:标签(版本号) 】这样的格式来指定一个Docker镜像
  • 容器(Container)
    镜像和容器是密切相关的,简单来说,镜像是静态的,容器是运行时的镜像,在镜像的基础之前添加了容器运行时的存储层。有点类似于,Java里面的 类和对象的关系。Docker借用了面向对象的思想,它的镜像可以继承,实现镜像复用。
  • 仓库
    Docker仓库的概念有点类似于 Maven,是用来管理Docker镜像的。所以开发者也有必要创建私服,用来管理自己项目的Docker镜像(这个后面再说)。
  • 网络(network)和数据卷(data volumes)
    前面也说了 Docker 是一种虚拟技术,所以内部是有完整的操作系统结构的,其中就包含了网络通信这一块;至于数据卷,我们知道,容器运行一旦结束并销毁后,容器内的任何东西都是会被销毁的(这一点可以类比Java的对象,对象被GC回收后,对象所承载的数据都随着对象销毁),数据卷就是独立于容器的数据存储的这样一个概念。所以,开发者在构建自己应用程序的镜像时,不要在容器内部存储任何数据,可以将数据存储在数据卷或者将存储路径映射到宿主机的指定路径
    数据卷挂载主要分为:
    1. 具名挂载
    -v 卷名称:容器目录
    具名卷为空时,默认会将容器内数据先挂载到具名卷中
    2. 匿名挂载
    匿名挂载可以分为主动挂载和被动挂载
    主动挂载: -v 容器目录
    被动挂载:在构建镜像时 VOLUME [“/volume01”,“/volume02”] 绝对路径
    3. 目录挂载
    -v 宿主目录:容器目录
    宿主机目录为空时,默认会将容器内的目录覆盖为空
    数据卷还有一个类似继承的概念:如果一个容器定义一系列数据卷挂载关系;在启动另一个容器时 可以使用命令 --volumes-from 容器(id/名称)的方式将,挂载关系继承过来,此时两个容器共享继承的这一部分挂载关系;无论是宿主目录变动还是任何一个容器目录变动,其余两方都会同步变化。
    挂载数据卷时还可以指定容器内操作数据卷的权限 -v [宿主目录:]容器目录(:ro 只读/rw读写),默认rw即容器内可以读写数据卷
    具名挂载/匿名挂载时,宿主机目录在 /var/lib/docker/volumes/卷名/_data;