[toc]

Docker基本含义

Docker包括一个命令行程序、一个后台守护进程,以及一组远程服务。它解决了常见的软件问题,并简化了安装、运行、发布和删除软件。这一切能够实现是通过使用一项UNIX技术,称为容器。

什么是容器?

Docker 是Docker.Inc公司开源的,一个基于LXC技术之上构建的Container容器引擎,源码托管在
GitHub上,基于Go语言,并基于Apache2.0协议开源
Docker是通过内核虚拟化技术(namespace及cgroup等)来提供容器的资源隔离与安全保障等。
由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的
操作系统开销,提高资源利用率。

Docker在开发和运维中的优势

对于开发和运维人员来说,最梦寐以求的效果可能就是一次创建和配置,之后可以在任意地方、任意时间让应用正常运行,而Docker恰恰可以实现这一中级目标。具体来说,在开发和运维过程中,Docker具有以下几个方面的优势:

1.更快的交付和部署:
使用Docker,开发人员可以使用镜像来快速构建一套标准的开发环境;开发完之后,测试和运维人员可以直接使用完全相同的环境来部署代码。只要是开发测试过的代码,就可以确保在生产环境无缝运行。Docker可以快速创建和删除容器,实现快速迭代,节约开发、测试及部署的时间。

2.更高效的利用资源:
运行Docker容器不需要额外的虚拟化管理程序的支持,Docker是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低,与传统的虚拟机方式相比,Docker的性能要提高1 ~ 2个数量级。

3.更轻松的迁移和扩展:
Docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑等等,同时支持主流的操作系统发行版本。这种兼容性能让用户可以在不同的平台之间轻松的迁移应用。

4.更轻松的管理和更新:
使用Dockerfile,只需要小小的配置修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的容器管理。

Docker和虚拟化

Docker和KVM虚拟化的区别

在没有Docker 的时代,商家通常使用硬件虚拟化(也称为虚拟机),以提供隔离。虚拟机提供虚拟的硬件,可安装一个操作系统和其他程序。它们需要很长的时间(通常以分钟计)来创建,也需要显著的资源开销,因为它们除了要执行你需要的软件,还得运行整个操作系统的副本。

不同于虚拟机,Docker容器不使用硬件虚拟化。运行在Docker容器中的程序接口和主机的 Linux内核直接打交道。因为容器中运行的程序和计算机的操作系统之间没有额外的中间层,没有资源被冗余软件的运行或虚拟硬件的模拟而浪费掉。这是一个很重要的区别。Docker不是一个虚拟化技术。相反,它可以帮助使用已经内置到操作系统中的容器技术。

Docker以及其他容器技术,都属于操作系统虚拟化范畴,操作系统细腻化最大的特点就是不需要额外的supervisor支持。Docker虚拟化方式之所以有众多优势,跟操作系统虚拟化技术自身的设计和实现分不开。

  • docker是容器
  • KVM是Linux虚拟服务
  • VMware是Windows虚拟服务
1
2
3
4
5
6
7
8
9
10
--virt-type kvm \
--name CentOS-7-x86_64 \
--ram 1024 \
--cdrom=/tmp/CentOS-7-x86_64-DVD-1511.iso \
--disk path=/opt/CentOS-7-x86_64.raw \
--disk /tmp/CentOS-7-x86_64.qcow2,format=qcow2 \
--network network=default \
--network bridge=br0 \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole

image-20230530160247317

传统方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层。Docker容器时在操作系统层面实现虚拟化,直接复用本地主机的操作系统,因此更加轻量级。

Docker与虚拟机的比较

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

Docker容器启动很快,启动和停止可以实现秒级,相比传统的虚拟机方式(分钟级)要快速很多。

Docker容器对系统资源需求很少,一台主机上可以同时运行数千个Docker容器。

Docker通过类似git设计理念的操作来方便用户获取、分发和更新应用镜像,存储复用,增量更新。

Docker通过Dockerfile支持灵活的自动化创建和部署机制,可以提高工作效率,并标准化流程。

特性 容器 虚拟机
启动速度 秒级 分钟级
性能 接近原生 较好
内存 MB级 GB级
硬盘适应 MB级 GB级
运行密度 单台主机支持上千个 单台主机支持几个
隔离性 安全隔离 完全隔离
迁移 优秀 一般

Namespace 和 cgroup

Namespace 资源隔离

内核提供了namespace的机制用来隔离相关资源,namespace设计之初就是为了实现轻量级的系统资
源隔离,可以让容器中的进程仿佛置身于一个独立的系统环境中。

Namespace 系统调用参数 隔离内容
UTC CLONE_NEWUTC 主机名和域名
IPC CLONE_NEWIPC 信号量,消息队列,共享内存
PID CLONE_NEWPID 进程号
Network CLONE_NEWNET 网络设备,网络栈,端口
Mount CLONE_NEWNS 文件系统
User CLONE_NEWUSER 用户和用户组

cgroup 资源隔离

cgroups 限制一个进程能够使用的资源,cpu、内存、硬盘io等

cgroup的四大作用:

  • 资源限制:
    • 例如设定任务指定内存
  • 优先级分配:
    • 比如跟任务分配的CPU时间,片数,磁盘IO,带宽大小来控制任务的优先级
  • 资源统计:
    • 统计CPU,内存,IO等资源使用时长,该功能比较适合用于计费
  • 任务控制:
    • cgroup可以对任务进行 运行,挂起,恢复等操作

Docker三个重要的概念

Docker中有三个核心概念:镜像、容器和仓库。准确把握这三大概念对于掌握Docker技术尤为重要。

  • 镜像(Image)

    • Docker 镜像(Image),可以看做是一个特殊的文件系统,除了提供容器运行时所需要的程序、库、资源、配置文件以外,还包含了一些为运行时,准备的配置参数(匿名卷,环境变量,用户等),镜像是不可更改的
  • 容器(Container)

    • 镜像(Image)和容器(Container),容器的定义和镜像,几乎是一模一样,唯一区别在于容器的最上面那一层是可读可写的。
    • 容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository)

    • dockerhub(公有仓库)

    • harbor(私有仓库)

      1
      2
      3
      仓库是Docker用来存放镜像的地方,类似于我们之前常用的代码仓库。
      通常一个仓库会包含,同一个软件,不同版本的镜像
      我们可以通过<仓库名>:<标签>格式来指定具体使用哪个版本的镜像,如果不给标签,那么默认以Latest作为默认标签

image-20230530161132139

docker组成部分

image-20230530171641480

  • Docker是传统的C/S架构,分为 docker client 和 docker server
  • Docker客户端是Docker用户与Docker交互的主要方式
  • 当使用Docker命令行运行命令时,Docker客户端将这些命令发送给服务端,服务端执行这些命令
  • Docker命令使用Docker API
  • Docker客户端可以与多个服务端进行通讯

Docker总结

  • 操作系统的趋势
    1. 系统越来越多,也越来越复杂
    2. 系统之间的兼容性得不到保证
  • 容器带来的优势
    1. 解决了一个相对隔离的环境(容器与容器,容器与主机之间互不影响)
    2. 解决了系统不兼容的问题(重点)
    3. 容器解决了稳定部署的问题
  • 容器软件:docker
    1. 基于golang语言开发
    2. Linux 基金会
      1. 增加知名度
      2. 全世界的开发者共同维护软件的生态系统
  • docker与虚拟机的区别
    1. 虚拟机之间的系统级别的隔离
    2. docker容器之间的进程级别的隔离