5.《Docker 从入门到实践》Docker 拓展项目

1 Docker BuildKit

BuildKit 是下一代的镜像构建的开源组件(仅支持 Docker版本>1=8.09)

  • 更高效:支持并行的多阶段构建、更好的缓存管理;
  • 更安全:支持 secret mount,无需 root priviliege;
  • 更易于扩展:使用自定义中间语言 LLB,完全兼容 Dockerfile,也可支持第三方语言(目前仅有 Buildpacks),后台目前可支持 runC 和 containerd 两种 worker

设置 COMPOSE_DOCKER_CLI_BUILD=1 环境变量即可使用Buildkit

Buildkit 官方文档

2 Docker Compose

<code>Compose</code> 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排

  • 项目定位:定义和运行(Defining and running)多个 Docker 容器的应用
  • Compose 允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)
  • Compose 的默认管理对象是项目(project):由一组关联的应用容器组成的一个完整业务单元
  • Compose 通过子命令对项目中的一组容器(service)进行便捷地生命周期管理

初版Compose 项目由 Python 编写,目前 Docker 官方用 GO 语言 重写 了 Docker Compose,并将其作为了 docker cli 的子命令,称为 Compose V2

Compose 快速入门:

3 Swarm mode

Swarm mode 是使用 <code>SwarmKit</code> 构建的 Docker 的集群管理和编排工具

Swarm mode 从 Docker 1.12 开始内嵌入 Docker 引擎,其主要特性为:具有容错能力的去中心化设计、内置服务发现、负载均衡、路由网格、动态伸缩、滚动更新、安全传输等

Swarm 集群的基础概念:

  • 任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器
  • 服务 (Services) 是指一组任务的集合,服务定义了任务的属性
  • 管理节点用于 Swarm 集群的管理,docker swarm 命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave 可以在工作节点执行)。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为 leaderleader 通过 raft 协议实现
  • 工作 (worker) 节点是任务执行节点,管理节点将服务 (service) 下发至工作节点执行。管理节点默认也作为工作节点,也可以通过配置让服务只运行在管理节点

Swarm 集群的常见命令:

# 初始化集群, 可使用`--advertise-addr` 指定 IP
docker swarm init --advertise-addr 192.168.99.100

docker swarm join # 增加工作节点
docker node ls # 在管理节点查看集群

docker service create # 新建服务
docker service ls # 查看服务列表
docker service ps # 查看单个服务详情

docker service logs # 查看单个服务日志
docker service scale # 对一个服务运行的容器数量进行伸缩
docker service rm nginx # 从Swarm集群移除某个服务

Swarm 集群中也可以使用模板文件 (docker-compose.yml) 来配置、启动多个服务

Swarm 集群中使用 docker-compose.yml 需要用 docker stack 命令:

docker stack deploy -c docker-compose.yml wordpress # 部署服务
docker stack ls # 查看服务列表
docker stack down wordpress # 移除服务(不能移除数据卷)
docker volume rm # 单独移除数据卷的命令

其他集群操作命令:

  • 使用 docker secret 命令来管理敏感信息(密码、密钥证书等)
  • 使用docker config 子命令来管理集群中的配置信息(Docker 版本>17.06)
  • 使用 docker service update 命令实现服务的滚动升级(支持回滚)

4 Etcd 项目

<code>etcd</code> CoreOS 团队发起的一个管理配置信息和服务发现(Service Discovery)的项目;etcd 的目标是构建一个高可用的分布式键值(key-value)数据库

etcd 基于 Go 语言实现,并重点考虑了下面四个要素:

  • 简单:具有定义良好、面向用户的 API (gRPC)
  • 安全:支持 HTTPS 方式的访问
  • 快速:支持并发 10 k/s 的写操作
  • 可靠:支持分布式结构,基于 Raft 的一致性算法

一般情况下,用户使用 etcd 可以在多个节点上启动多个实例,并添加它们为一个集群。同一个集群中的 etcd 实例将会保持彼此信息的一致性

etcd 快速入门:

  • 安装:编译源码,下载二进制文件,使用现成的镜像quay.io/coreos/etcd
  • 数据库操作(CRUD):etcdctl put,etcdctl get,etcdctl del
  • 非数据库操作:etcdctl watch(监测更新), etcdctl member( etcd实例管理)

5 Fedora CoreOS

Fedora CoreOS 是一个自动更新的,最小的,整体的,以容器为中心的操作系统

目的:提供最佳的容器主机,以安全,大规模地运行容器化的工作负载

官方文档

6 Kubernetes

Kubernetes 是 Google 团队发起的开源项目,它的目标是管理跨多个主机的容器,提供基本的部署,维护以及应用伸缩,主要实现语言为 Go 语言。Kubernetes 是:

  • 易学:轻量级,简单,容易理解
  • 便携:支持公有云,私有云,混合云,以及多种云平台
  • 可拓展:模块化,可插拔,支持钩子,可任意组合
  • 自修复:自动重调度,自动重启,自动复制

基本概念架构设计部署实践

kubectl 是 Kubernetes 自带的客户端,可以用它来直接操作 Kubernetes

7 podman

<code>podman</code> 是一个无守护程序与 docker 命令兼容的下一代 Linux 容器工具

  • Podman 提供更高的安全选项。其无守护程序架构允许您运行无 root 容器;专注于运行、部署和管理容器,并为您提供对这些流程的细粒度控制
  • Docker 和 Podman 都符合 OCI 标准;可以在开发环境中使用 Docker,在其中创建应用程序镜像(此时安全性不太重要)。然后使用 Podman 在生产环境中运行和维护这些镜像

往年同期文章