Docker入门|第1章 容器生态系统完整解析
摘要:本文系统讲解 Docker 容器生态全景与实战入门。内容涵盖容器核心技术(OCI 规范、runtime、管理工具、定义工具、镜像仓库、容器 OS)、容器平台技术(编排引擎、管理平台、容器 PaaS)与容器支持技术(网络、服务发现、监控、数据管理、日志、安全)三大板块;随后在 CentOS Stream 8 上完成 Docker 安装、镜像加速器配置,并运行 hello-world 与 httpd 容器验证环境;最后演示 Docker C/S 客户端-服务端分离部署,实现客户端远程操作远端 Docker 服务。
一、了解容器技术
容器技术是继大数据和云计算之后炙手可热的技术,未来很长一段时间都会保持很高的热度。 对于IT行业,容器拥有极高业务价值;对于IT从业者,掌握容器既是市场需求,也是提升个人自身价值的重要途径。
从Google趋势数据可以看到Docker搜索热度持续上涨,关注度远超OpenStack、Apache Hadoop。 学习容器技术特点:系统讲解完整容器生态,由整体到细节;重实践同时兼顾理论,先建立认知再动手做实验,运行第一个容器来直观感受容器。
二、容器生态系统
提到容器,大家第一反应就是Docker。Docker确实将容器技术发扬光大,但Docker不等于全部容器。Docker只是容器生态的基石,一套完善的生态系统,才是容器技术能够健康落地发展的关键。
容器生态系统整体划分为三大类别:
- 容器核心技术
- 容器平台技术
- 容器支持技术
2.1 容器核心技术
容器核心技术,指可以让container在host os宿主机操作系统上能够运行起来的底层相关技术,包含6个子模块:容器规范、容器runtime、容器管理工具、容器定义工具、Registries、容器OS。
2.1.1 容器规范
容器不只有Docker,还有CoreOS rkt、红帽podman、containerd等多种容器实现。 为保障容器生态健康,实现不同容器产品之间兼容互操作,Docker、CoreOS、Google等多家公司联合成立 OCI(Open Container Initiative)开放容器倡议组织。
OCI一共发布两套规范:
- runtime spec 容器运行时规范
- image format spec 容器镜像格式规范
通过这两套规范,不同厂商开发的容器,可以运行在不同runtime之上,保障容器的可移植性和互操作性。
2.1.2 容器 runtime
runtime是容器真正运行的载体。runtime需要和操作系统内核紧密协同,为容器提供完整运行环境。 类比Java:容器相当于Java应用程序,runtime就等价于JVM;Java程序依赖JVM运行,容器依赖runtime运行。
主流三种容器runtime:
- lxc:Linux老牌容器runtime,Docker早期版本底层就是使用lxc;
- runc:Docker自研开发,完全符合OCI规范,是当前Docker默认runtime;
- rkt:CoreOS开发,兼容OCI规范,可以直接运行Docker容器。
2.1.3 容器管理工具
仅有runtime还不够,用户需要工具来管理容器。
容器管理工具对内和runtime交互,对外向用户提供CLI等交互接口。类比Java:除JVM以外,还需要java命令让用户可以启动程序。
runtime与管理工具对应关系:
- lxc → lxd 管理工具
- runc → docker engine(包含后台deamon守护进程、cli命令两部分,日常所说Docker,大多指docker engine)
- rkt → rkt cli
2.1.4 容器定义工具
容器定义工具的作用:定义容器内部的内容与属性,让容器可以保存、共享、重建。
- docker image:Docker容器模板,runtime依据image创建容器实例
- dockerfile:包含多条指令的文本文件,通过指令构建docker image镜像
- ACI(App Container Image):CoreOS rkt容器使用的镜像格式,作用类似docker image。
2.1.5 Registries(镜像仓库)
容器是基于镜像创建,Registry就是统一存放镜像的仓库。
- Docker Registry:开源仓库组件,企业可以用来搭建私有镜像仓库;
- Docker Hub:Docker官方提供公共托管Registry,拥有大量现成公开镜像;
- Quay.io:另一款公共托管镜像仓库,功能与Docker Hub类似。
2.1.6 容器OS
几乎所有Linux、Mac OS、Windows操作系统都可以运行容器,但是业界依然发展出专门面向容器的操作系统,叫做容器OS。
容器OS专门用来运行容器,对比普通操作系统,体积更小、启动更快,运行容器效率更高。
代表产品:CoreOS、atomic、ubuntu core。
三、容器生态系统
容器核心技术解决单台主机上运行容器 的问题; 容器平台技术解决:让容器作为集群,在分布式多节点环境运行。
容器平台技术分为三类:容器编排引擎、容器管理平台、基于容器的PaaS。
3.1 容器编排引擎
现代业务大量使用微服务架构:应用拆分为多个组件,每个组件以服务形式运行在独立容器,对外提供API。为保障高可用,每个组件会运行多个容器副本。 这些容器组成集群,业务变化时需要动态创建、迁移、销毁容器。我们需要高效手段批量管理集群内大量容器,这就是容器编排引擎的工作。
编排(orchestration)包含能力:容器生命周期管理、调度、集群定义、服务发现。通过编排引擎,将大量容器有机组合成完整微服务业务系统。
主流编排引擎:
- docker swarm:Docker官方开发的容器编排引擎
- kubernetes:Google主导开源,支持Docker、CoreOS多种容器,业界主流
- mesos+marathon:mesos是通用集群资源调度平台,搭配marathon共同实现容器编排能力。
3.2 容器管理平台
容器管理平台构建在编排引擎之上,属于更上层通用平台。 支持对接多种编排引擎,屏蔽底层实现细节,给用户提供更友好能力,例如应用目录catalog、一键应用部署。 典型产品:Rancher、ContainerShip。
3.3 基于容器的PaaS
面向微服务开发人员,提供应用开发、部署、管理整套平台。开发人员无需关心底层基础设施,只聚焦业务代码开发。 开源代表项目:Deis、Flynn、Dokku。
3.4 容器支持技术
容器支持技术,用于支撑整套容器基础设施稳定运行。包含:容器网络、服务发现、监控、数据管理、日志管理、安全性。
3.4.1 容器网络
容器实例会动态扩缩容,网络拓扑变得动态复杂。需要专门方案处理容器与容器、容器和外部实体之间连通性、网络隔离。
- docker network:Docker原生网络解决方案
- 第三方开源方案:flannel、weave、calico,不同方案实现各有优劣,按需选型。
3.4.2 服务发现
微服务显著特点就是动态变化:负载升高自动新建容器;负载降低销毁容器;容器还会因为资源调度在不同主机之间迁移,容器IP、端口随之改变。 客户端不能写死IP访问业务,需要服务发现组件保存集群内所有微服务最新IP、端口信息,对外提供查询API。 主流服务发现组件:etcd、consul、zookeeper。
3.4.3 监控
容器的动态特性对监控提出更高的要求,现在已经有大量针对容器的监控工具:
- Docker原生:
docker ps/docker top/docker stats命令;docker stats API,可以通过HTTP接口获取容器状态; - 开源工具:sysdig、cAdvisor/Heapster、Weave Scope。
3.4.4 数据管理
容器支持跨主机迁移,数据管理工具解决持久化数据跟随容器动态迁移的需求,典型工具Flocker。
3.4.5 日志管理
日志是问题排查、事件管理重要依据。
- docker logs:Docker原生日志工具
- logspout:实现日志路由,收集各个容器日志转发至其他系统做后续处理。
3.4.6 安全性
容器安全一直是行业重点讨论话题。Open SCAP工具,能够对容器镜像扫描,发现镜像内部潜在安全漏洞。
四、安装docker
了解容器生态之后,进入实操环节,在Linux主机上完成Docker安装。
4.1 环境选择
- 管理工具:Docker Engine
- runtime:runc(Docker默认runtime)
- 操作系统:CentOS Stream 8
4.2 克隆准备虚拟机
基于CentOS‑Stream‑8模板克隆虚拟机,虚拟机命名为docker,配置静态IP:192.168.108.30,修改主机名。
bash
hostnamectl set-hostname docker
nmcli connection modify ens160 ipv4.method manual ipv4.addresses 192.168.108.30/24 ipv4.gateway 192.168.108.2 ipv4.dns 192.168.108.2 autoconnect yes
nmcli con up ens160
4.3 Docker安装步骤
bash
# 卸载旧版本(可选)
yum remove docker-ce
# 安装依赖工具
yum install -y yum-utils device-mapper-persistent-data lvm2 vim
# 添加阿里docker-ce源
yum-config-manager --add-repo [https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo](https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo)
yum makecache
# 安装docker‑ce
yum install -y docker-ce
# 设置开机自启并立即启动服务
systemctl enable docker.service --now
4.4 验证docker安装
bash
# 查看docker版本
docker --version
# 查看服务状态
systemctl status docker
4.5 配置镜像加速器
4.5.1 阿里云镜像加速器配置
bash
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["[https://spcqvmfn.mirror.aliyuncs.com](https://spcqvmfn.mirror.aliyuncs.com)"]
}
EOF
systemctl daemon-reload
systemctl restart docker
# 校验配置
docker info
4.5.2 华为云镜像加速器配置
修改/etc/docker/daemon.json写入华为云镜像加速地址
bash
{
"registry-mirrors": ["[https://054b8ac70e8010d90f2ac00ef29e6580.mirror.swr.myhuaweicloud.com](https://054b8ac70e8010d90f2ac00ef29e6580.mirror.swr.myhuaweicloud.com)"]
}
systemctl daemon-reload
systemctl restart docker
docker info
4.6 运行第一个容器 hello‑world
bash
docker run hello-world
执行成功输出Hello from Docker!,代表Docker环境正常。
4.7 清理实验环境,拍摄快照
bash
# 删除全部容器
docker rm -f $(docker ps -aq)
# 删除hello‑world镜像
docker rmi -f hello-world
关机虚拟机,拍摄快照命名为docker ok。
4.8 运行第二个容器 httpd
bash
docker run -d -p 80:80 httpd
# 访问验证
curl 192.168.108.30
输出<html><body><h1>It works!</h1></body></html>代表web容器运行成功。
五、docker C/S分离部署
Docker是C/S客户端‑服务端架构,可以将客户端、服务端部署在两台不同虚拟机。
5.1 虚拟机规划
- docker_server:服务端,IP:
192.168.108.30 - docker_client:客户端,IP:
192.168.108.31
5.2 docker‑server服务端配置
- 设置主机名、静态IP
bash
hostnamectl set-hostname docker_server
nmcli connection modify ens160 ipv4.method manual ipv4.addresses 192.168.108.30/24 ipv4.gateway 192.168.108.2 ipv4.dns 192.168.108.2 autoconnect yes
nmcli con up ens160
- 安装docker‑ce全套软件包,配置镜像加速器
- 修改
docker.service开启2375远程监听端口 修改/usr/lib/systemd/system/docker.service,在ExecStart末尾增加参数:‑H tcp://0.0.0.0:2375 - 重载配置重启docker
bash
systemctl daemon-reload
systemctl restart docker.service
# 关闭防火墙
systemctl stop firewalld
# 验证2375端口监听
yum install lsof
lsof -i :2375
5.3 docker‑client客户端配置
- 设置主机名、静态IP
bash
hostnamectl set-hostname docker_client
nmcli connection modify ens160 ipv4.method manual ipv4.addresses 192.168.108.31/24 ipv4.gateway 192.168.108.2 ipv4.dns 192.168.108.2 autoconnect yes
nmcli con up ens160
- 只安装docker客户端工具
docker‑ce‑cli
bash
yum install -y yum-utils device-mapper-persistent-data lvm2 vim
yum-config-manager --add-repo [https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo](https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo)
yum makecache
yum install -y docker-ce-cli
- 远程调用服务端docker执行命令
bash
# 远程连接server执行hello‑world
docker -H 192.168.108.30 run hello-world
# 查看远端镜像列表
docker -H 192.168.108.30 images
说明:client只负责发送管理指令,镜像、容器全部存储在docker‑server服务端主机。
六、第1章小结
- 容器不等于Docker,Docker只是容器生态中一个知名实现;完整生态分为核心技术、平台技术、支持技术三大板块。
- 容器核心技术负责单机运行容器:OCI规范、runtime运行时、管理工具、定义工具、镜像仓库、容器OS。
- 容器平台技术面向分布式集群:编排引擎、管理平台、容器PaaS,解决大规模容器集群调度管理。
- 容器支持技术属于配套基础设施:网络、服务发现、监控、数据管理、日志、安全,保障生产环境稳定运行。
- 实操部分:虚拟机环境准备、Docker完整安装、服务状态验证、国内镜像加速器配置(阿里云、华为云),运行hello‑world与httpd测试容器。
- 理解Docker C/S客户端‑服务端架构,完成C/S分离部署实验,客户端远程操作远端Docker服务。
- 学习路径:先理解容器生态全景,再动手搭建Docker环境,掌握基础环境配置,之后学习Docker命令与容器操作。