容器生态系统及 Docker 核心概念

《每天5分钟玩转Docker容器技术》
《每天5分钟玩转Docker容器技术》

目录

第 1 章 容器生态系统

大致看来,容器生态系统包含核心技术平台技术支持技术

1.1 容器核心技术

容器核心技术是指能够让 Container 在 host 上运行的那些技术:

  • 容器规范
  • 容器 runtime
  • 容器管理工具
  • Registry
  • 容器 OS

容器规范

容器不光是 Docker,还有其他容器,比如 CoreOS 的 rkt。为了保证容器生态的健康发展,保证不同容器之间能够兼容,包含 Docker、CoreOS、Google在内的若干公司共同成立了一个叫 Open Container Initiative(OCI) 的组织,其目的是制定开放的容器规范

目前 OCI 发布了两个规范:

  • runtime spec
  • image format spec

容器 runtime

runtime 是容器真正运行的地方。runtime 需要跟操作系统 kernel 紧密协作,为容器提供运行环境

目前主流的三种容器 runtime:

  • LXCLinux 上老牌的容器 runtime。Docker 最初也是用 lxc 作为 runtime。
  • runCDocker 自己开发的容器 runtime,符合 OCI 规范,也是现在 Docker 的默认 runtime
  • rktCoreOS 开发的容器 runtime,符合 OCI 规范,因而能够运行 Docker 的容器。

容器管理工具

光有 runtime 还不够,用户得有工具来管理容器。容器管理工具对内与 runtime 交互,对外为用户提供 interface,比如 CLI。这就好比除了 JVM,还得提供 java 命令让用户能够启停应用。

  • LXDLXC 对应的管理工具
  • Docker EnginerunC 的管理工具。Docker Engine 包含后台 Deamon 和 Cli 两个部分。我们通常提到 Docker,一般就是指的 Docker Engine。
  • rkt CLI 是 rkt 的管理工具

容器定义工具

容器定义工具允许用户定义容器的内容和属性,这样容器就能够被保存、共享和创建

  • Docker imageDocker 容器的模板,runtime 依据 Docker image 创建容器。
  • Dockerfile包含若干命令的文本文件,可以通过这些命令创建出 Docker image。
  • ACI (App Container Image) 与 Docker image 类似,只不过它是由 CoreOS 开发的 rkt 容器的 image 格式。

Registry

容器是通过 image 创建的,需要有一个仓库来统一存放 image,这个仓库就叫做 Registry。

  • Docker Hub 是 Docker 为公众提供的托管 Registry,上面有很多现成的 image,为 Docker 用户提供了极大的便利。
  • Quay.io 是另一个公共托管 Registry,提供与 Docker Hub 类似的服务。

容器 OS

容器 OS 是专门运行容器的操作系统。与常规 OS 相比,容器 OS 通常体积更小,启动更快。因为是为容器定制的 OS,通常它们运行容器的效率会更高。

目前已经存在不少容器 OS:

1.2 容器平台技术

容器核心技术使得容器能够在单个 Host 上运行。而容器平台技术能够让容器作为集群在分布式环境中运行。

容器平台技术包括容器编排引擎容器管理平台基于容器的 PaaS

容器编排引擎

基于容器的应用一般会采用微服务架构。在这种架构下,应用被划分为不同的组件,并以服务的形式运行在各自的容器中,通过 API 对外提供服务。为了保证应用的高可用,每个组件都可能会运行多个相同的容器。这些容器会组成集群,集群中的容器会根据业务需要被动态地创建、迁移和销毁

所谓编排(orchestration),通常包括容器管理、调度、集群定义和服务发现等。通过容器编排引擎,容器被有机的组合成微服务应用,实现业务需求。

  • Docker Swarm 是 Docker 开发的容器编排引擎。
  • kubernetes 是 Google 领导开发的开源容器编排引擎,同时支持 Docker 和 CoreOS 容器。
  • Apache Mesos 是一个通用的集群资源调度平台,MesosMarathon 一起提供容器编排引擎功能。

以上三者是当前主流的容器编排引擎。

容器管理平台

容器管理平台是架构在容器编排引擎之上的一个更为通用的平台。通常容器管理平台能够支持多种编排引擎,抽象了编排引擎的底层实现细节,为用户提供更方便的功能,比如 application catalog 和一键应用部署等。

基于容器的 PaaS

基于容器的 PaaS 为微服务应用开发人员和公司提供了开发、部署和管理应用的平台,使用户不必关心底层基础设施而专注于应用的开发。以下是开源容器 PaaS 的代表:

  • Deis(注:已被微软收购)
  • Flynn
  • Dokku

1.3 容器支持技术

下面这些技术被用于支持基于容器的基础设施

  • 容器网络
  • 服务发现
  • 监控
  • 数据管理
  • 日志管理
  • 安全性

容器网络

容器的出现使网络拓扑变得更加动态和复杂。用户需要专门的解决方案来管理容器与容器,容器与其他实体之间的连通性和隔离性。

docker network 是 Docker 原生的网络解决方案。除此之外,我们还可以采用第三方开源解决方案,例如 flannel、weave 和 calico。

  • docker network
  • flannel
  • weave
  • calico

服务发现

动态变化是微服务应用的一大特点。当负载增加时,集群会自动创建新的容器;负载减小,多余的容器会被销毁。容器也会根据 host 的资源使用情况在不同 host 中迁移,容器的 IP 和端口也会随之发生变化

在这种动态的环境下,必须要有一种机制让 client 能够知道如何访问容器提供的服务。这就是服务发现技术要完成的工作。

服务发现会保存容器集群中所有微服务最新的信息,比如 IP 和端口,并对外提供 API,提供服务查询功能

etcd、consul 和 zookeeper 是服务发现的典型解决方案。

监控

容器的动态特征对监控提出更多挑战。针对容器环境,已经涌现出很多监控工具和方案:

  • docker ps/top/stats
  • docker stats API
  • sysdig
  • cAdvisor/Heapster
  • Weave Scope

docker ps/top/stats 是 Docker 原生的命令行监控工具。除了命令行,Docker 也提供了 stats API,用户可以通过 HTTP 请求获取容器的状态信息。

sysdig、cAdvisor/Heapster 和 Weave Scope 是其他开源的容器监控方案。

数据管理

容器经常会在不同的 host 之间迁移,如何保证持久化数据也能够动态迁移,是 Rex-Ray 这类数据管理工具提供的能力。

日志管理

日志为问题排查和事件管理提供了重要依据。

  • docker logs:Docker 原生的日志工具
  • logspout:对日志提供了路由功能,它可以收集不同容器的日志转发给其他工具进行后续处理

安全性

OpenSCAP 能够对容器镜像进行扫描,发现潜在的漏洞。

第 2 章 容器核心知识概述

2.1 What-什么是容器

虚拟机 VS 容器
虚拟机 VS 容器

如图所示,由于所有的容器共享同一个 Host OS,这使得容器在体积上要比虚拟机小很多

另外,启动容器不需要启动整个操作系统,所以容器部署和启动速度更快,开销更小,也更容易迁移

2.2 Why-为什么需要容器

  • 对于开发人员Build Once, Run Anywhere
  • 对于运维人员Configure Once, Run Anything

2.3 How-容器是如何工作的

Docker 架构

Docker 的核心组件包括:

  • Docker 客户端 - Client
  • Docker 服务器 - Docker Daemon
  • Docker 镜像 - Image
  • 仓库 - Registry
  • Docker 容器 - Container
Docker 架构图
Docker 架构图

Docker 采用的是 C/S 架构客户端向服务器发送请求服务器负责构建、运行和分发容器

客户端和服务器可以运行在同一个 Host 上,客户端也可以通过 Socket 或 REST API 与远程的服务器通信。

Docker 客户端

最常用的 Docker 客户端是 docker 命令。通过 docker 我们可以方便地在 Host 上构建和运行容器。

除了 docker 命令行工具,用户也可以通过 REST API 与服务器通信。

Docker 服务器

Docker daemon服务器组件,以 Linux 后台服务的方式运行。

Docker daemon
Docker daemon

Docker daemon 运行在 Docker host 上,负责创建、运行、监控容器,构建、存储镜像

默认配置下,Docker daemon 只能响应来自本地 Host 的客户端请求。如果要允许远程客户端请求,需要在配置文件中打开 TCP 监听,步骤如下:

(1) 编辑配置文件 /etc/systemd/system/multi-user.target.wants/docker.service,在环境变量 ExecStart 后面添加 -H tcp://0.0.0.0,允许来自任意 IP 的客户端连接。

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0
ExecReload=/bin/kill -s HUP $MAINPID

注:以上配置文件 Ubuntu 18.04 为例,在其他操作系统中配置文件可能并不相同。

(2) 重启 Docker daemon

systemctl daemon-reload
systemctl restart docker.service

(3) 假设服务器 IP 为 192.168.56.102,客户端在命令行里加上 -H 参数,即可与远程服务器通信。

docker -H 192.168.56.102 info
Containers: 1
 Running: 0
 Paused: 0
 Stopped: 1
Images: 1
Server Version: 18.06.1-ce
...

Docker 镜像

可将 Docker 镜像看作只读模板,通过它可以创建 Docker 容器。

镜像有多种生成方法:

  • 可以从无到有开始创建镜像
  • 也可以下载并使用别人创建好的现成的镜像
  • 还可以在现有镜像上创建新的镜像

我们可以将镜像的内容和创建步骤描述在一个文本文件中,这个文件被称作 Dockerfile,通过执行 docker build <docker-file> 命令可以构建出 Docker 镜像。

Docker 容器

Docker 容器就是 Docker 镜像的运行实例。用户可以通过 CLI(docker)或是 API 启动、停止、移动或删除容器。

可以这么认为,对于应用软件,镜像是软件生命周期的构建和打包阶段,而容器则是启动和运行阶段

仓库 Registry

Registry存放 Docker 镜像的仓库,分私有公有两种。

Docker Hub 是默认的 Registry,由 Docker 公司维护,上面有数以万计的镜像,用户可以自由下载和使用。

出于对速度或安全的考虑,用户也可以创建自己的私有 Registry。

  • docker pull 命令可以从 Registry 下载镜像
  • docker run 命令则是先下载镜像(如果本地没有),然后再启动容器

2.4 Docker 组件是如何协作的

一个容器启动过程的示例如下:

容器启动过程示例
容器启动过程示例
  1. Docker 客户端执行 docker run 命令
  2. Docker daemon 发现本地没有 httpd 镜像
  3. daemon 从 Docker Hub 下载镜像
  4. 下载完成,镜像 httpd 被保存在本地
  5. Docker daemon 启动容器

另外,使用 docker images 命令可以查看本地已下载的镜像。

使用 docker psdocker container ls 命令显示正在运行的容器及相关信息。

参考文章

  1. 《每天5分钟玩转 Docker 容器技术》教程目录 | CloudMan
  2. Mesos+Marathon对比Kubernetes | CSDN