第 1 章 容器生态系统

1.1 容器技术简介

容器是继大数据、云计算之后热门的 IT 技术,Docker 推动容器技术大规模普及。学习容器应当先建立全局视图,理清生态分层,区分核心、平台、辅助技术,避免学习迷失。 容器生态分为三大板块:容器核心技术、容器平台技术、容器支持技术

与传统服务器和虚拟化的区别

传统服务器:基于物理服务器,一台服务器装一个系统,运行一个业务系统(多为重要核心业务)

虚拟化:基于服务器装KVM或者XEN等虚拟化,用于创建数量有线的虚机,实现物理资源复用

容器:基于应用,一个容器是一个应用,共用底层的操作系统,开关秒级,数量成百上千

① 容器核心技术(实现容器在单台宿主机运行)
  1. 容器规范 OCI Open Container Initiative 开放容器倡议,由 Docker、CoreOS、Google 等公司联合成立。包含两份规范:runtime spec运行时规范、image format spec镜像格式规范。作用:保证不同容器产品之间镜像可移植、可互操作,代表产品:docker、rkt、podman、containerd。
  2. 容器 runtime 运行时 是容器真正执行运行的底层环境,类比 Java 的 JVM。
  • lxc:Linux 老牌 runtime,Docker 最早版本底层使用;
  • runc:Docker 自研,符合 OCI 规范,Docker 默认 runtime
  • rkt:CoreOS 开发,兼容 Docker 镜像。
  1. 容器管理工具:对接 runtime,对外提供 CLI 命令行交互。docker engine(dockerd)就是 Docker 的管理工具,包含后台守护进程 daemon 和客户端 CLI。
  2. 容器定义工具:定义容器内容,实现镜像保存、共享重建;docker image镜像模板、Dockerfile构建脚本、ACI(rkt 镜像格式)。
  3. Registries 镜像仓库:专门存放镜像。
    • Docker Registry:用于搭建企业自建私有仓库;
    • Docker Hub:Docker 官方公共镜像仓库;
    • Quay.io:第三方公共镜像仓库。
  4. 容器 OS:专为运行容器裁剪的操作系统,体积小、启动快。代表:CoreOS、atomic、ubuntu core。
② 容器平台技术(实现容器集群、分布式运行)

解决微服务架构下大量容器集群调度、编排问题。

  1. 容器编排引擎:负责容器集群调度、管理、服务发现、扩缩容。主流:docker swarmkubernetes(k8s)mesos+marathon
  2. 容器管理平台:封装编排引擎,提供 web 界面、一键部署,如 Rancher、ContainerShip。
  3. 基于容器的 PaaS:屏蔽底层基础设施,开发者专注业务代码。Deis、Flynn、Dokku。
③ 容器支持技术(配套基础设施组件)

为容器集群提供配套能力:

  • 容器网络:docker network、flannel、weave、calico;
  • 服务发现:etcd、consul、zookeeper,解决容器 IP 动态变化,服务访问寻址;
  • 监控:docker ps/top/stats、sysdig、cAdvisor、Weave Scope;
  • 数据管理、日志管理、安全扫描(OpenSCAP 做镜像漏洞扫描)。

1.2 Docker 单机安装实验 CentOS Stream8

  1. 准备虚拟机:从模板克隆虚拟机,设置静态 IP,修改主机名。
  2. 安装流程
    1. 安装工具包,配置阿里云 Docker CE yum 源
    2. yum install -y docker‑ce安装 Docker 社区版;
    3. systemctl enable docker.service --now启动服务并设置开机自启。
  3. 配置镜像加速器 修改配置文件/etc/docker/daemon.json,配置阿里云 / 华为云镜像加速地址;执行systemctl daemon‑reload && systemctl restart docker重载重启;使用docker info查看Registry Mirrors字段验证加速器是否生效。
  4. 基础验证实验
    • docker run hello‑world:最小测试镜像,验证 Docker 整套环境;
    • docker run -d -p 80:80 httpd:后台启动 httpd 网页容器,端口映射 80 端口,浏览器访问宿主机 IP 可以看到It works!页面。
  5. 实验清理:docker rm -f $(docker ps -aq)删除全部容器;docker rmi 镜像名删除镜像;关机拍摄快照保存干净实验环境。

1.3 Docker C/S 分离部署实验

Docker 是客户端 / 服务端 C/S 架构,客户端 CLI 和服务端 dockerd 守护进程可以部署在两台不同机器。

  1. docker_server 服务端(192.168.108.30)
    • 完整安装 docker‑ce;
    • 修改/usr/lib/systemd/system/docker.service,在 ExecStart 参数增加‑H tcp://0.0.0.0:2375开启远程 API 监听;
    • systemctl daemon‑reload && systemctl restart docker;关闭防火墙;lsof -i:2375验证端口监听。
  2. docker_client 客户端(192.168.108.31)
    • 只安装客户端工具:docker‑ce‑cli,不安装完整 docker‑ce,没有 dockerd 后台服务
  3. 验证:客户端执行命令docker -H 192.168.108.30 run hello‑world

关键点:命令在 client 输入,镜像、容器全部存储运行在 server 服务端机器,client 只负责发送指令。

第 2 章 容器架构

2.1 容器 3W 模型 What / Why / How

容器发展史

Chroot Jail (1979) → FreeBSD Jail → Linux VServer → Solaris Containers → cgroups(2007 并入内核)→ LXC(2008)→ Docker(2013 诞生,基于 LXC,后续替换为 libcontainer/runc)。

What:什么是容器

容器是轻量级、可移植、自包含的软件打包技术,把应用程序 + 全部依赖库打包。容器运行在宿主机用户空间,共享宿主机操作系统内核

容器 VS 虚拟机对比
对比项虚拟机容器
内核拥有独立完整内核,依赖 Hypervisor 虚拟化层共享宿主机内核,只有用户态文件系统 rootfs
启动速度分钟级秒级甚至毫秒级
隔离级别硬件资源完全隔离进程级隔离(Namespace+Cgroups 内核技术)
资源开销开销大,占用内存磁盘高开销极小,容器本质宿主机普通进程
单机运行数量一台服务器几十台虚拟机单机可运行上千个容器
镜像体积GB 级别完整操作系统镜像MB 级别分层镜像
Why:为什么使用容器

解决传统软件开发的痛点:开发、测试、生产环境不一致。 类比海运集装箱思想:把软件以及依赖打包成标准化 “软件集装箱”,一处构建,到处运行。

  • 开发人员:Build Once,Run Anywhere,构建一次,任意环境运行;
  • 运维人员:Configure Once,Run Anything,配置一次环境,跑任意容器应用。

注意:容器不能修改 / 升级内核,如果业务对内核版本有强依赖,适合选择虚拟机。

How:容器如何实现

底层依赖 Linux 两大内核技术:

  1. Namespace:提供隔离,实现 PID、网络、挂载、用户等资源隔离;
  2. Cgroups:资源控制,限制容器 CPU、内存、磁盘 IO 资源。

2.2 Docker 完整 C/S 架构

Docker 组件:Client 客户端、Docker Daemon (dockerd) 服务端、Image 镜像、Container 容器、Registry 镜像仓库。

  1. Client 客户端docker命令行工具,发送 REST API 请求;可以本地访问,也可以远程访问 2375 端口连接远端 dockerd。
  2. Docker Daemon 服务端 dockerd:后台守护进程,是 Docker 的核心,负责管理镜像、容器、网络、存储卷,处理客户端所有请求。
  3. Image 镜像只读模板,用来创建容器。
  4. Container 容器:镜像的运行实例;在只读镜像之上增加一层可读写层。
  5. Registry 镜像仓库:存放镜像,Docker Hub、自建私有仓库 Harbor。
执行流程示例 docker run httpd
  1. 用户在 client 执行docker run httpd
  2. dockerd 在本地查找 httpd 镜像,本地不存在;
  3. daemon 去 Registry(Docker Hub)下载镜像;
  4. 镜像保存本地;
  5. daemon 基于镜像创建并启动容器。

第 3 章 镜像

3.1 镜像内部结构

  1. 最小镜像 hello‑world 基于FROM scratch构建。scratch 代表空白,没有任何系统文件。镜像大小仅 13.3KB,里面只有一个可执行程序,仅用于验证 Docker。
FROM scratch
COPY hello /
CMD ["/hello"]
  1. Base 基础镜像 两层含义:①从 scratch 从零构建;②作为其他镜像的底层基础镜像。CentOS、Ubuntu 都是 base 镜像。

重要知识点:base 镜像只提供 rootfs(用户空间文件系统 /bin/etc /usr),内核 kernel 直接复用宿主机的内核。 容器内部执行uname -r,显示的是宿主机内核版本,容器无法升级内核。

  1. 镜像分层结构 & Copy‑On‑Write 写时复制
  • 镜像由多层只读层叠加,每一条 Dockerfile 指令生成一层镜像;
  • 分层最大优势:镜像层共享,节省磁盘与内存,多个镜像共用相同基础层;
  • 容器启动时,会在所有只读镜像层最顶层,增加一层可读写容器层。 ✅所有增删改操作全部发生在读写容器层,下层镜像层永远只读;多个容器共享底层镜像,容器之间修改互不影响。 ❌容器删除,顶层读写层数据全部丢失,持久化数据必须使用数据卷 volume。

3.2 构建镜像的两种方式

方式 1:docker commit(不推荐,仅用于理解原理)

步骤:运行容器 → 在容器内部修改环境 → commit 提交保存成新镜像。 缺点:手工操作,构建过程不可复现;镜像无法审计,不知道内部做了什么操作。

方式 2:Dockerfile(官方推荐生产使用)

Dockerfile 是文本文件,记录镜像每一步构建指令。

  1. Dockerfile 语法规则
  • 指令大写,从上向下顺序执行;# 代表注释;
  • 每一条指令生成一个新镜像层
  1. 构建命令
docker build -t 镜像名:tag -f Dockerfile 构建上下文目录

.代表当前目录作为构建上下文;上下文的全部文件会发送给 dockerd,不要把/根目录作为上下文。 3. 镜像缓存机制 构建镜像时 Docker 会复用已经存在的镜像层;只要某一层发生改动,该层上方所有镜像层缓存全部失效--no‑cache参数关闭缓存。 4. Dockerfile 调试:构建失败,前面步骤生成的中间镜像会保留,可以运行中间镜像定位报错。

3.3 Dockerfile 常用指令

指令功能说明
FROM指定基础 base 镜像,必须放在文件第一条
MAINTAINER设置镜像作者信息
COPY把构建上下文中的文件复制到镜像内部
ADD复制文件,自动识别并解压 tar 压缩归档包
ENV设置环境变量,后续指令可以引用
WORKDIR设置工作目录;目录不存在自动创建
RUN镜像构建阶段执行命令,生成镜像层,用于安装软件
EXPOSE声明容器暴露端口,仅文档说明,不会自动做端口映射
CMD容器启动运行阶段默认命令docker run后面参数可以直接覆盖 CMD,多个 CMD 仅最后一条生效
ENTRYPOINT容器启动执行主程序;run 传参不会覆盖,参数传给 ENTRYPOINT 作为入参

RUN / CMD / ENTRYPOINT 重点区分

  1. RUN:构建镜像的时候执行,产生新镜像层;
  2. CMD:容器运行默认命令,很容易被 docker run 参数覆盖;
  3. ENTRYPOINT:容器运行主程序;CMD 可以给 ENTRYPOINT 提供默认参数。

格式区分:shell 格式 (RUN apt install xxx) 底层调用/bin/sh -c,可以解析环境变量;exec 数组格式["/bin/echo","hello"]直接调用程序,不会经过 shell 解析变量;CMD 和 ENTRYPOINT 推荐使用 exec 格式。

教案附带 3 个完整实战 Dockerfile 案例:

  1. centos:ssh:制作内置 openssh‑server 的 centos 镜像;
  2. httpd:centos:基于 centos 构建 httpd 网页镜像;
  3. centosjava8:centos 内置 vim、net‑tools、jdk8 镜像。

3.4 镜像 Tag 标签最佳实践

完整镜像命名格式:仓库地址/命名空间/仓库名:tag标签

  1. latest仅仅是默认标签,不代表最新版本,生产环境禁止依赖 latest 标签!
  2. tag 版本规范:同一个镜像可以打多个 tag;如 v1.9.1 镜像打上1.9.11.91latest;新版本发布,移动大版本 tag 指向新版本,方便使用者选择版本。
  3. docker tag命令给镜像打标签。

3.5 镜像分发(Registry 镜像仓库)

1)公共仓库 Docker Hub
  1. 网页注册 Docker Hub 账号;服务器执行docker login登录;
  2. 使用 docker tag 重命名镜像,格式用户名/镜像名:tag
  3. docker push上传镜像;docker pull下载镜像。
2)华为云 SWR 公有镜像仓库
  1. 华为云控制台 SWR 容器镜像服务,创建组织,获取登录指令;
  2. docker 登录 SWR;镜像 tag 必须带上 SWR 仓库完整地址;
  3. push 上传镜像;控制台设置镜像公开 / 私有权限。
3)简易本地 registry(容器运行)
docker run -d -p 5000:5000 -v /myregistry:/var/lib/registry registry:2
  • 内网简易私有仓库,无 web 界面、无权限管理;
  • 镜像 tag 格式:localhost:5000/镜像名:v1;push 上传,curl 可以查询仓库镜像列表。
4)企业级私有仓库 Harbor

Harbor 是 registry 的企业级增强版,提供 webUI、用户管理、项目权限、操作审计。 部署步骤:

  1. 下载离线安装包,解压;复制模板配置文件harbor.yml;修改 hostname 内网 IP、admin 管理员密码;
  2. 执行./prepare预处理配置;./install.sh启动整套服务;
  3. docker 客户端配置daemon.jsoninsecure‑registries,允许 http 访问 Harbor;
  4. 业务流程:web 页面创建用户、创建项目,分配项目角色;docker login 登录 harbor;镜像打 tag 带上 harbor 地址,push 推送镜像到私有仓库。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐