Docker的介绍


一、Docker介绍

Docker 是一个开源的应用容器引擎,允许开发者将应用程序及其依赖项打包到一个轻量级、可移植的容器中,然后发布到任何支持 Docker 的机器上,确保应用在不同环境中的运行一致性。

Docker 的核心思想是通过容器化技术实现应用的快速部署、扩展和管理。

docker.jpeg

Docker 诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。

Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc。Redhat 已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用。

Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。

Docker 的主要特点和功能:

  1. 容器化:Docker 使用容器技术将应用程序及其依赖项打包在一个独立的运行环境中,这使得应用在不同的计算环境(如开发、测试、生产)中具有一致性。

  2. 轻量级:相比于传统的虚拟机,Docker 容器更加轻量级,因为它们共享宿主机的操作系统内核,而不是像虚拟机那样运行独立的完整操作系统。

  3. 可移植性:Docker 容器可以在任何安装了 Docker 的机器上运行,无论是个人电脑、云服务器还是数据中心,保证了应用的可移植性。

  4. 版本控制和组件复用:Docker 允许开发者使用 Dockerfile 来定义应用的环境,并通过 Docker Hub 等平台共享和复用容器镜像,简化了应用的构建和管理过程。

  5. 隔离性:每个 Docker 容器都是相互隔离的,确保不同应用之间的资源和依赖不会互相干扰。

  6. 易于扩展:Docker 容器可以快速创建和销毁,非常适合需要弹性扩展的应用场景,如微服务架构。

Docker 的核心组件:

  1. Docker 引擎(Docker Engine):负责创建和管理 Docker 容器的核心组件。

  2. Docker 镜像(Docker Image):包含了应用运行所需的所有内容,如代码、运行时、库、环境变量和配置文件等。

  3. Docker 容器(Docker Container):Docker 镜像的运行实例,可以启动、停止、移动和删除。

  4. Docker 仓库(Docker Registry):用于存储和分发 Docker 镜像,最常见的公共仓库是 Docker Hub。

  5. Docker Compose:一个工具,允许开发者通过 YAML 文件定义和运行多容器 Docker 应用。

  6. Docker Swarm:Docker 自带的本地集群管理工具,支持多节点容器编排。

Docker 的应用场景:

  1. 微服务架构:Docker 非常适合微服务架构,每个微服务可以作为独立的容器运行,便于扩展和管理。

  2. 持续集成和持续部署(CI/CD):通过 Docker,可以实现快速、一致的环境切换,简化 CI/CD 流程。

  3. 多环境部署:Docker 容器可以在开发、测试、生产等多环境中保持一致的运行环境,减少“在我的机器上可以运行”的问题。

  4. 资源优化:由于 Docker 容器的轻量级特性,可以更高效地利用硬件资源。

  5. DevOps 实践:Docker 通过标准化应用环境和依赖管理,支持 DevOps 文化,促进开发和运维团队之间的协作。

为什么要用 Docker

作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。

首先,Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。 其次,Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。

容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。

具体说来,Docker 在如下几个方面具有较大的优势。

1.更快速的交付和部署

对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。

2.更高效的虚拟化

Docker 容器的运行不需要额外的虚拟机支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。

3.更轻松的迁移和扩展

Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。

4.更简单的管理

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

对比传统虚拟机总结

特性 容器 虚拟机
启动 秒级 分钟级
硬盘使用 一般为 MB 一般为 GB
性能 接近原生 弱于
系统支持量 单机支持上千个容器 一般几十个

Docker基本架构

Docker 采用了 C/S架构,包括客户端和服务端。 Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。 客户端和服务端既可以运行在一个机器上,也可通过 socket 或者 RESTful API 来进行通信。

docker基本架构.png

docker daemon 一般在宿主主机后台运行,等待接收来自客户端的消息。 Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟 Docker daemon 交互。

容器 — 镜像 — 仓库 — daemon — client 之间的关系

clientdaemon.jpg

Docker版本介绍

Docker CE (Community Edition)

Docker CE 是面向社区的免费版本,适用于个人开发者和小型团队。它提供了大部分的核心功能,适合学习和开发用途。

主要版本:

  • Docker CE 17.03:引入了多阶段构建(Multi-stage Builds),简化了 Dockerfile 的编写和管理。
  • Docker CE 17.06:增加了对 Swarm 模式的改进和支持。
  • Docker CE 18.09:引入了 BuildKit,提升了构建速度和资源利用率。
  • Docker CE 19.03:支持 GPU 和 Windows 容器的改进。

Docker EE (Enterprise Edition)

Docker EE 是面向企业的付费版本,提供了更多的高级功能和商业支持,适合生产环境。

主要版本:

  • Docker EE 17.06:增强了安全性和集群管理功能。
  • Docker EE 18.09:支持多架构(Multi-arch)镜像,提升了跨平台兼容性。
  • Docker EE 19.03:引入了 Kubernetes 集成,增强了与 Kubernetes 的兼容性。

Docker Desktop Docker Desktop 是一个桌面应用程序,适用于 Windows 和 macOS 系统,简化了 Docker 的安装和使用。

主要版本:

  • Docker Desktop 2.0:支持 Windows 的 Kubernetes 集群。
  • Docker Desktop 2.1:改进了对 Windows 容器的支持。
  • Docker Desktop 3.0:引入了 Docker Hub 集成和改进的性能监控。

二、虚拟化和容器

虚拟化介绍

操作系统层虚拟化是指通过划分一个宿主操作系统的特定部分,产生一个个隔离的操作执行环境。操作系统层的虚拟化是操作系统内核直接提供的虚拟化,虚拟出的操作系统之间共享底层宿主操作系统内核和底层的硬件资源。操作系统虚拟化的关键点在于将操作系统与上层应用隔离开,将对操作系统资源的访问进行虚报化,使上层应用觉得自己独占操作系统。

操作系统虚拟化的好处是实现了虚拟操作系统与物理操作系统的隔离并且有效避免物理操作系统的重复安装。比较有名的操作系统虚报化解决方案有Virtual Server、Zone、Virtuozzo 及虚拟专用服务器(Vital Pnvate Sever,VPS)。VPS是利用虚拟服务器软件在一台物理机上创建多个相互隔离的小服务器。这些小服务器本身就有自己的操作系统,其运行和管理与独立主机完全相。其可以保证用户独享资源,且可以节约成本。

虚拟化分类

  1. 仿真虚拟化:对系统硬件没有要求,性能最低。例如: VMware

  2. 半虚拟化:虚拟机可以使用真机物理硬件,性能高,需要改内核。例如:Xen

  3. 硬件辅助虚拟化。例如: vmware kvm

    • 需要硬件支持 【cpu 主板】
    • 不需要改内核
    • 可以直接使用真机硬件,性能最贴近宿主机
  4. 容器虚拟化。例如:lxc docker

主机虚拟化和容器虚拟化特点

主机虚拟化

vmachines.png

  • 应用程序运行环境强隔离
  • 虚拟机操作系统与底层操作系统无关化
  • 虚拟机内部操作不会影响到物理机
  • 拥有操作系统会占用部署资源及存储
  • 网络传输效率低
  • 当应用程序需要调用硬件响应用户访问时间延迟大

容器虚拟化

container_virtual.png

  • 可以实现应用程序的隔离
  • 直接使用物理机的操作系统可以快速响应用户请求
  • 不占用部署时间
  • 占用少量磁盘空间

容器虚拟化缺点:学习成本增加、操作控制麻烦、网络控制与主机虚拟化有所区别、服务治理。

容器的原理

容器技术通过利用操作系统内核的特性,提供了轻量级、隔离的运行环境。以下是容器的基本原理和工作机制:

1. 操作系统级虚拟化

容器利用操作系统内核提供的隔离机制,在单一操作系统实例中创建多个隔离的运行环境。这些隔离机制主要包括:

1.1 Namespaces

Linux Namespaces 提供了进程隔离的机制,确保每个容器都有自己的命名空间,从而实现以下隔离:

  • PID Namespace:隔离进程 ID,每个容器有自己独立的进程树。
  • Mount Namespace:隔离文件系统,每个容器有自己的文件系统视图。
  • Network Namespace:隔离网络接口,每个容器有自己的网络栈。
  • UTS Namespace:隔离主机名和域名,每个容器有独立的主机名。
  • IPC Namespace:隔离进程间通信(IPC)资源。
  • User Namespace:隔离用户和组 ID,用户可以在容器中具有与主机不同的权限。

1.2 cgroups (Control Groups)

cgroups 是 Linux 内核的一个功能,用于限制、记录和隔离进程的资源使用(如 CPU、内存、磁盘 I/O 等)。通过 cgroups,可以确保每个容器不会占用过多资源,影响其他容器的运行。

2. 容器镜像

容器镜像是一个轻量级、独立的软件包,包含运行应用程序所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

2.1 分层文件系统

容器镜像通常采用分层文件系统(如 OverlayFS),每一层对应一个镜像的修改。这种分层结构允许镜像在不同层之间共享和重用,节省存储空间并提高构建和分发的效率。

2.2 Dockerfile

Dockerfile 是一个文本文件,包含一系列命令和指令,用于自动化构建容器镜像。通过 Dockerfile,可以定义镜像的基础层、安装依赖项、复制文件、设置环境变量等。

3. 容器运行时

容器运行时负责创建、启动和停止容器。现代容器运行时包括:

3.1 Docker Engine

Docker Engine 是最常用的容器运行时之一。它提供了 CLI 工具和 API,用于管理容器、镜像和卷等资源。

3.2 containerd

containerd 是从 Docker Engine 中剥离出来的独立容器运行时,它提供了一个更底层的 API,用于管理容器的生命周期。

3.3 CRI-O

CRI-O 是一个轻量级的容器运行时,专门为 Kubernetes 设计,符合 Kubernetes 的容器运行时接口(CRI)。

4. 容器编排

容器编排工具用于自动化部署、扩展和管理容器化应用程序。

4.1 Kubernetes

Kubernetes 是最流行的容器编排平台之一。它提供了集群管理、容器调度、服务发现、负载均衡等功能。

4.2 Docker Swarm

Docker Swarm 是 Docker 的原生集群工具,允许用户将多个 Docker 主机组成一个集群,简化容器编排和调度。

5. 网络和存储

5.1 网络

容器网络通常通过虚拟网络接口和 NAT(网络地址转换)实现容器之间的通信。Kubernetes 等编排工具提供了多种网络插件,支持容器间的高效通信。

5.2 存储

容器存储通常通过卷(Volumes)或绑定挂载(Bind Mounts)实现。卷可以持久化存储数据,绑定挂载允许容器访问主机的文件系统。

总结

容器的原理基于操作系统级虚拟化技术(如 Namespaces 和 cgroups),通过容器镜像提供一致的运行环境,利用不同的容器运行时管理容器的生命周期,并通过容器编排工具自动化部署和管理。这些技术共同构成了现代容器生态系统,使得应用程序的开发、部署和运维更加高效和灵活。

容器的发展史

容器技术的发展史可以追溯到早期的操作系统级虚拟化概念,经过多年的演进,最终形成了现代的容器生态系统。以下是容器发展史的主要里程碑:

早期阶段

  1. chroot (1979)

    • 最早的容器化概念可以追溯到 UNIX 系统中的 chroot 命令,它允许改变进程的根目录,从而限制了进程对文件系统的访问。这是容器隔离的早期尝试。
  2. BSD Jails (1999)

    • 由 FreeBSD 引入的 BSD Jails 是第一个真正意义上的操作系统级虚拟化技术,它允许在一个操作系统实例中创建多个隔离的“监狱”环境。
  3. LXC (Linux Containers, 2008)

    • LXC 是 Linux 容器的前身,它利用 Linux 内核的 cgroup 和 namespace 功能来实现进程级别的隔离。LXC 提供了一个用户空间接口,用于创建和管理容器。

Docker 的崛起

  1. Docker (2013)

    • Docker 的推出彻底改变了容器技术的应用方式。Docker 简化了容器的创建、部署和运行,提供了易于使用的命令行工具和 API。Docker 还引入了镜像的概念,使得应用程序及其依赖项可以以一致的方式在任何地方运行。
  2. Docker Swarm (2014)

    • Docker Swarm 是 Docker 的本地集群工具,它允许用户将多个 Docker 主机组成一个集群,简化容器编排和调度。虽然后来被 Kubernetes 超越,但它为容器编排提供了一个起点。

容器编排与生态系统

  1. Kubernetes (2014)

    • Google 开源的 Kubernetes(k8s)成为了容器编排的事实标准。Kubernetes 提供了一整套工具和 API,用于自动化部署、扩展和管理容器化应用程序。
  2. Cloud Native Computing Foundation (CNCF) (2015)

    • CNCF 的成立推动了云原生应用和容器技术的发展。CNCF 托管了 Kubernetes 和其他多个开源项目,促进了容器生态系统的成熟。

容器技术的进一步发展

  1. Containerd (2017)

    • 作为 Docker 的一部分,Containerd 被剥离为一个独立的容器运行时项目,它提供了一个更底层的容器管理接口,支持多种容器运行时。
  2. CRI-O (2016)

    • 由 Red Hat 主导的 CRI-O 是一个轻量级的容器运行时,专门为 Kubernetes 设计,符合 Kubernetes 的容器运行时接口(CRI)。
  3. OCI (Open Container Initiative) (2015)

    • OCI 制定了一系列标准,包括容器镜像格式和运行时规范,推动了容器技术的标准化和互操作性。

现代容器生态系统

  1. Podman (2018)

    • Podman 是一个无守护进程的容器管理工具,它提供了与 Docker 类似的命令行接口,但不需要 Docker 守护进程,更适合安全敏感的环境。
  2. BuildKit (2018)

    • Docker 引入的 BuildKit 提升了容器镜像构建的性能和资源利用率,支持并行构建和缓存。
  3. Rootless Containers (2019)

    • Docker 和其他容器运行时开始支持 Rootless 模式,允许非特权用户运行容器,提升了安全性。

总结

容器技术从早期的 chroot 和 BSD Jails 发展到现代的 Docker 和 Kubernetes,经历了多次重要变革。现代容器生态系统不仅提供了强大的开发和部署工具,还推动了云原生应用的标准化和互操作性。

通过这些发展,容器技术已经成为现代软件开发和运维中不可或缺的一部分。

在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。