01.容器生态系统
第一章:《深入探索容器生态系统:从基础到 Docker 实践》
文章目录
- 第一章:《深入探索容器生态系统:从基础到 Docker 实践》
- 了解容器生态系统
- 容器的基本介绍
- 容器技术
- 容器生态系统
- Docker 技术
- Docker Hub
- Centos-stream-8安装Docker
- 环境选择
- Centos8操作系统安装
- 安装流程
- 操作示例
- docker安装
- 实验流程
- 配置实例
- 阿里云方式配置镜像加速器
- 华为云方式配置加速器
- Docker基本项目实战---C/S架构分离部署
在云计算与微服务架构飞速发展的今天,容器技术已成为软件开发与部署的核心驱动力。它彻底改变了传统应用的交付模式,让 “一次构建,到处运行” 从口号变为现实。本文将系统解析容器生态系统的构成,深入探讨 Docker 技术的核心原理与实践应用,为技术从业者提供全面的容器知识框架。
了解容器生态系统
容器技术的诞生并非偶然,而是软件开发领域长期追求环境一致性、资源高效利用的必然结果。从早期的 chroot 技术到如今的容器编排平台,容器生态经历了数十年的演进,形成了完整的技术体系。
容器的基本介绍
容器本质上是一种轻量级的虚拟化技术,它通过操作系统层面的虚拟化实现资源隔离,让应用程序及其依赖能够在独立的环境中运行。与传统虚拟机相比,容器不需要模拟完整的硬件环境,而是直接共享宿主操作系统的内核,因此具有启动速度快(秒级启动)、资源占用低(仅占用应用运行所需资源)、可移植性强(不受底层基础设施限制)等显著优势。
从技术角度看,容器包含应用程序代码、运行时环境、库文件、环境变量等所有依赖组件,形成了一个 “自成一体” 的运行单元。这种特性确保了应用在开发、测试、生产等不同环境中的行为一致性,有效解决了 “在我电脑上能运行” 的经典难题。在云原生架构中,容器更是实现弹性伸缩、持续部署的基础载体。
容器技术
现代容器技术的实现基于 Linux 内核的三大核心机制:
-
Namespace(命名空间):通过对进程、网络、挂载点等资源进行隔离,使容器内的进程认为自己拥有独立的系统资源。例如 PID Namespace 让容器内的进程看到独立的进程 ID 序列。
-
Cgroups(控制组):负责对容器的资源使用进行限制和监控,包括 CPU、内存、磁盘 I/O、网络带宽等,防止单个容器过度消耗宿主资源。
-
UnionFS(联合文件系统):允许将多个目录(称为层)挂载到同一个目录下,形成统一的文件系统视图,支持写时复制(Copy-on-Write)机制,为容器镜像的分层构建提供了技术基础。
随着容器技术的发展,除了基于 Linux 内核的实现外,还出现了适用于 Windows 系统的容器技术,以及支持硬件虚拟化的轻量级虚拟机方案(如 KVM-based containers),进一步丰富了容器技术的应用场景。
容器生态系统
容器生态系统是一个由多种工具、平台和标准组成的复杂体系,可大致划分为以下几个核心层面:
-
容器引擎:负责容器的创建、运行和管理,是与用户交互的直接接口,典型代表包括 Docker Engine、containerd、CRI-O 等。
-
容器镜像仓库:用于存储和分发容器镜像,分为公共仓库(如 Docker Hub、Google Container Registry)和私有仓库(如 Harbor、Nexus)。
-
容器编排平台:解决大规模容器集群的部署、调度、扩展、负载均衡等问题,主流方案有 Kubernetes、Docker Swarm、Apache Mesos 等,其中 Kubernetes 已成为事实上的行业标准。
-
监控与日志:提供容器运行状态的监控、日志收集与分析功能,关键工具包括 Prometheus、Grafana、ELK Stack(Elasticsearch、Logstash、Kibana)、Fluentd 等。
-
网络与存储:为容器提供网络连接和数据持久化方案,网络插件有 Calico、Flannel、Weave Net 等,存储方案包括 Docker Volume、Persistent Volume(K8s)、Ceph 等。
-
安全工具:保障容器全生命周期的安全性,涵盖镜像扫描(Trivy、Clair)、运行时防护(Falco)、密钥管理(Vault)等领域。
这些组件相互协作,共同构成了容器从开发、构建、分发到运行、监控、维护的完整生态闭环,支撑着容器技术在企业级应用中的规模化落地。
Docker 技术
在容器技术的发展历程中,Docker 的出现具有里程碑意义。它通过简化容器的创建和管理流程,极大降低了容器技术的使用门槛,推动了容器生态的普及和繁荣。
Docker 技术含义
Docker 是一套开源的容器化平台,它基于 Linux 容器(LXC)技术发展而来,通过封装底层复杂的容器操作,提供了简单易用的命令行工具和 API 接口,让开发者能够轻松创建、分发和运行容器。Docker 的核心设计理念是 “Build, Ship, Run”(构建、分发、运行),旨在实现应用程序的跨环境无缝迁移。
Docker 采用客户端 - 服务器(C/S)架构,主要由以下组件构成:
-
Docker Client:用户交互界面,接收命令并发送给 Docker Daemon。
-
Docker Daemon:运行在宿主机器上的后台进程,负责管理容器、镜像、网络等资源。
-
Docker Image:容器的只读模板,包含运行应用所需的代码、库、环境变量等,采用分层结构存储。
-
Docker Container:镜像的可运行实例,是动态的、可写的实体,容器间相互隔离。
-
Docker Registry:用于存储和分发 Docker 镜像的仓库服务。
通过这种架构设计,Docker 实现了镜像与容器的分离,使得镜像可以作为应用的 “交付品” 在不同环境中一致运行,彻底消除了环境差异带来的部署问题。
生产环境中 Docker 的作用
在生产环境中,Docker 扮演着至关重要的角色,为企业应用部署带来了多方面的价值:
-
环境标准化:Docker 镜像包含应用运行所需的完整依赖,确保开发、测试、生产环境的一致性,减少因环境差异导致的部署故障,据统计可使应用部署问题减少 60% 以上。
-
资源高效利用:相比传统虚拟机,Docker 容器的资源占用率显著降低,相同硬件配置下可运行更多应用实例,通常能提高服务器资源利用率 30%-50%。
-
快速部署与扩展:容器的秒级启动特性使应用部署时间从小时级缩短至分钟甚至秒级,配合编排工具可实现基于负载的自动扩缩容,满足业务高峰期的弹性需求。
-
微服务架构支撑:Docker 天然适合微服务架构的部署模式,每个微服务可以独立打包为容器,实现单独的开发、测试、部署和扩展,简化了微服务架构的管理复杂度。
-
持续集成 / 持续部署(CI/CD):Docker 与 CI/CD 工具(如 Jenkins、GitLab CI)无缝集成,可将代码构建、测试、打包为镜像、部署到生产环境的全过程自动化,缩短软件迭代周期,提高发布频率。
-
简化运维:容器化应用的部署和管理通过统一的命令和 API 实现,减少了人工操作,降低了运维复杂度。同时,容器的隔离性使应用间的相互影响减小,提高了系统的稳定性。
Docker Hub
Docker Hub 是 Docker 官方提供的公共镜像仓库,也是全球最大的容器镜像存储库之一,截至 2025 年,已托管超过 1000 万个容器镜像,月活跃用户数突破 1000 万。它为开发者提供了便捷的镜像存储、分发和协作平台,是 Docker 生态系统的重要组成部分。
Docker Hub 的核心功能包括:
-
公共镜像仓库:提供大量官方认证的基础镜像(如 Ubuntu、CentOS、Node.js、Python 等),以及社区贡献的各类应用镜像,开发者可直接拉取使用,避免重复构建。
-
私有镜像仓库:支持用户创建私有仓库,用于存储企业内部或个人的敏感镜像,保障镜像的安全性和私密性,私有仓库的访问权限可通过用户组和角色进行精细控制。
-
自动构建:与代码仓库(如 GitHub、GitLab)集成,当代码发生变更时,可自动触发镜像构建过程,并将构建好的镜像推送至 Docker Hub,实现开发流程与镜像构建的自动化联动。
-
镜像扫描:内置安全扫描功能,可对镜像中的漏洞进行检测,并生成安全报告,帮助用户识别和修复潜在的安全风险,提高容器应用的安全性。
-
组织与团队管理:支持创建组织和团队,便于团队协作管理镜像资源,通过角色分配实现权限的精细化管控,适合企业级团队使用。
使用 Docker Hub 非常简单,只需通过docker login命令登录后,即可使用docker pull拉取镜像,docker push推送镜像,极大简化了容器镜像的分发流程。
Docker 镜像的获取方式
获取 Docker 镜像的方式多种多样,开发者可根据实际需求选择合适的方法:
-
从公共镜像仓库拉取:这是最常用的方式,通过docker pull [镜像名]:[标签]命令从 Docker Hub 等公共仓库直接拉取镜像。例如docker pull nginx:latest拉取最新版本的 Nginx 镜像,docker pull mysql:8.0拉取 8.0 版本的 MySQL 镜像。公共仓库提供的镜像通常经过优化和验证,适合快速搭建开发环境或原型系统。
-
本地构建镜像:通过编写 Dockerfile 定义镜像的构建过程,然后使用docker build命令在本地构建镜像。Dockerfile 是一个文本文件,包含一系列指令(如 FROM、RUN、COPY、CMD 等),用于描述如何从基础镜像开始,添加应用代码、安装依赖、配置环境等。本地构建的优势在于可以根据具体需求定制镜像,确保镜像内容的可控性,例如:
# 基于官方Python镜像构建
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 复制依赖文件
COPY requirements.txt .
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY . .
# 定义启动命令
CMD ["python", "app.py"]
执行docker build -t myapp:1.0 .
即可构建名为myapp
、标签为 1.0 的镜像。
- 从私有仓库获取:企业通常会搭建内部私有仓库存储定制化镜像,使用方法与公共仓库类似,只需在拉取或推送时指定私有仓库的地址,如docker pull registry.company.com/myproject/app:latest。私有仓库保障了镜像的安全性和访问可控性,适合企业内部应用的分发。
其他 Docker 镜像服务平台
除了 Docker Hub,还有许多知名的公共镜像服务平台,满足不同场景的需求:
-
Google Container Registry (GCR):谷歌提供的容器镜像仓库,与 Google Cloud Platform(GCP)深度集成,适合部署在 GCP 上的应用使用,提供高可用性和全球分发能力。
-
Amazon Elastic Container Registry (ECR):亚马逊 AWS 提供的托管容器镜像仓库,与 ECS、EKS 等 AWS 容器服务无缝对接,支持镜像扫描和生命周期管理。
-
Microsoft Azure Container Registry (ACR):微软 Azure 云平台的容器镜像仓库,支持与 Azure Kubernetes Service(AKS)等服务集成,提供企业级安全特性。
-
Quay.io:由 Red Hat 维护的容器镜像仓库,以强大的安全功能和自动化构建能力著称,支持镜像漏洞扫描和签名验证。
这些平台通常提供与 Docker Hub 兼容的 API,用户可以通过标准的 Docker 命令进行镜像的拉取和推送,同时还提供额外的企业级功能,如高可用性、安全控制、集成服务等。
线下分发
在某些网络环境受限或安全性要求极高的场景中,通过网络拉取镜像的方式可能不适用,此时需要采用线下分发的方式传递 Docker 镜像:
-
镜像导出与导入:使用docker save命令将本地镜像导出为 tar 文件,例如docker save -o nginx.tar nginx:latest,然后通过 U 盘、移动硬盘等物理介质将 tar 文件传输到目标机器,再使用docker load -i nginx.tar命令导入镜像。这种方式简单直接,适合单个或少量镜像的分发。
-
离线仓库:对于需要分发大量镜像或频繁更新的场景,可以搭建离线仓库(如 Harbor、Docker Registry)。先在联网环境中同步所需镜像到离线仓库,然后将整个仓库环境(包括数据和配置)迁移到离线环境,用户可从本地离线仓库拉取镜像,实现类似在线仓库的使用体验。
-
镜像打包工具:一些第三方工具(如 Docker Distroless、OpenVZ 模板)提供了更高效的镜像打包方案,可将多个相关镜像打包为一个整体,减少传输体积,提高分发效率。
线下分发虽然增加了操作步骤,但在无网络环境、严格隔离的内网环境或对网络传输有严格限制的场景中,是保障容器镜像可用的重要手段。在实际应用中,常结合线上仓库和线下分发两种方式,构建灵活可靠的镜像分发体系。
容器生态系统正处于持续发展之中,从技术工具到行业标准,从单机部署到云原生架构,容器技术不断推动着软件开发和运维模式的革新。对于技术从业者而言,深入理解容器生态的构成和 Docker 技术的实践应用,不仅能提高日常工作效率,更能把握云原生时代的技术趋势,为企业数字化转型提供有力支撑。无论是初创公司的快速迭代需求,还是大型企业的规模化部署挑战,容器技术都展现出了强大的适应性和生命力,成为现代软件架构不可或缺的核心组件。
Centos-stream-8安装Docker
环境选择
容器需要管理工具、 runtime 和操作系统,我们的选择如下:
- 管理工具 - Docker Engine, Docker 最流行使用最广泛。
- runtime - runc, Docker 的默认 runtime
- 操作系统 - CentOS Stream8
Centos8操作系统安装
安装流程
- 安装Centos8-Stream模板文档制作的模板虚拟机
- 克隆操作系统
- 将操作系统命名为docker
- 设置ip地址为192.168.108.30/24,主机名为docker,
操作示例

完成后会克隆出一个新的虚拟机,开机配置主机名和ip地址
[root@bq ~]# hostnamectl set-hostname docker[root@bq ~]# nmcli connection modify ens160 ipv4.method manual ipv4.address 192.168.108.30/24 ipv4.gateway 192.168.108.2 ipv4.dns 192.168.108.2
#注意,记得 查看一下自己的网卡名[root@bq ~]# nmcli connection up ens160
docker安装
实验流程
-
安装docker的前置条件搭建
- 删除旧版的docker(可选择)
- 安装相关的使用工具
-
all-in-one一体化部署
- 安装docker服务端软件
- 持久化启动docker
- 验证
-
配置阿里云镜像加速器
配置实例
安装docker的前置条件搭建:
# 删除旧版docker(可选择)
[root@docker ~]# yum remove docker-ce
No match for argument: docker-ce
No packages marked for removal.
Dependencies resolved.
Nothing to do.
Complete!#安装相关使用工具# devicemapper 存储驱动已经在 docker 18.09 版本中被废弃, 所以在后续的安Docker装中无需安装devicemapper支持。
[root@docker ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 vim#添加阿里云docker镜像仓库
[root@docker ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
Adding repo from: https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# 将软件源(repository)中的元数据(包括软件包列表、依赖关系、版本信息等)下载到本地并生成缓存。
[root@docker ~]# yum makecache
Docker CE Stable - x86_64 111 kB/s | 66 kB 00:00
CentOS Stream 8 - BaseOS 66 kB/s | 3.9 kB 00:00
CentOS Stream 8 - AppStream 61 kB/s | 4.4 kB 00:00
Metadata cache created.
all-in-one 一体化部署:
# 安装服务端docker-ce
[root@docker ~]# yum install -y docker-ce# 持久化启动
[root@docker ~]# systemctl start docker.service
[root@docker ~]# systemctl enable docker.service --now
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.#验证安装#查看docker版本
[root@docker ~]# docker --version
Docker version 26.1.3, build b72abbb#验证docker状态
[root@docker ~]# systemctl status docker
● docker.service - Docker Application Container EngineLoaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)Active: active (running) since Wed 2025-09-03 18:33:31 CST; 1min 41s agoDocs: https://docs.docker.comMain PID: 12814 (dockerd)Tasks: 10Memory: 34.0MCGroup: /system.slice/docker.service└─12814 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
......
阿里云方式配置镜像加速器
根据平台内容介绍相关配置:
[root@docker ~]# sudo mkdir -p /etc/docker
[root@docker ~]# sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://spcqvmfn.mirror.aliyuncs.com"]
} E
OF
[root@docker ~]# sudo systemctl daemon-reload
[root@docker ~]# sudo systemctl restart docker
#检查镜像加速器配置
[root@docker ~]# docker info
Client: Docker Engine - Community
Version: 26.1.3
Context: default
Debug Mode: false
Plugins:
......
Experimental: false
Insecure Registries:
127.0.0.0/8
Registry Mirrors:
`https://spcqvmfn.mirror.aliyuncs.com/ <---看这
Live Restore Enabled: false
华为云方式配置加速器
docker安装操作和一致
华为云官网
[root@docker ~]# cat /etc/docker/daemon.json
{"registry-mirrors": [ "https://3a7edcd8d97449198a7760bf5163e635.mirror.swr.myhuaweicloud.com" ]
}[root@docker ~]# systemctl restart docker
#确认配置结果
[root@docker ~]# docker info
Client: Docker Engine - CommunityVersion: 26.1.3Context: defaultDebug Mode: falsePlugins:buildx: Docker Buildx (Docker Inc.)Version: v0.14.0Path: /usr/libexec/docker/cli-plugins/docker-buildxcompose: Docker Compose (Docker Inc.)Version: v2.27.0Path: /usr/libexec/docker/cli-plugins/docker-composeServer:
......Registry Mirrors:https://3a7edcd8d97449198a7760bf5163e635.mirror.swr.myhuaweicloud.com/Live Restore Enabled: false
运行第一个容器验证
[root@docker ~]# docker run hello-world
过程简述:
- 从本地查找hello-wrold镜像,没找到
- 从 Docker Hub 下载hello-world镜像。
- 启动hello-world容器。
此时docker的环境已经没有问题了,可关机打快照
运行第二个容器
[root@docker ~]# docker run -d -p 80:80 httpd
Unable to find image 'httpd:latest' locally
latest: Pulling from library/httpd
396b1da7636e: Pull complete
40712a21826a: Pull complete
4f4fb700ef54: Pull complete
d2b1a5ae8cd3: Pull complete
7e8bbac53823: Pull complete
779ccd583397: Pull complete
Digest: sha256:3198c1839e1a875f8b83803083758a7635f1ae999f0601f30f2f3b8ce2ac99e3
Status: Downloaded newer image for httpd:latest
20366745aa7d03b5c4d159af2fe916bbbc1c47f3f762fb2d308a1dd2a1198de8
过程简述:
- 从 Docker Hub 下载 httpd 镜像。镜像中已经安装好了 Apache HTTP Server。
- 启动 httpd 容器,并将容器的 80 端口映射到 host 的 80 端口。
浏览器验证
输入IP地址 192.168.108.30
可访问http服务后,代表第一个容器运行成功,此时我们就成功拥有了一个WEB服务器
Docker基本项目实战—C/S架构分离部署
基本流程概述
基于 CentOS-Stream-8模板文档制作两个虚拟机命名为docker_client和docker_server
docker_server端配置
流程概述
- 配置IP地址:192.168.108.30
- 网关:192.168.108.2
- DNS:192.168.102.2
- 配置主机名 docker_server
- 安装相关软件包
- 配置服务
#基本网络配置
[root@localhost ~]# hostnamectl set-hostname docker_server
[root@localhost ~]# 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
[root@localhost ~]# nmcli con up ens160------
#安装相关软件包、仓库、加速器
[root@docker_server ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 vim
[root@localhost ~]# yum-config-manager --add-repo
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
Adding repo from: https://mirrors.aliyun.com/docker-ce/linux/centos/dockerce.repo
[root@docker_server ~]# yum makecache
[root@docker_server ~]# yum install -y docker-ce
[root@docker_server ~]# systemctl enable docker.service --now
[root@docker_server ~]# vi /etc/docker/daemon.json
{"registry-mirrors": [ "https://3a7edcd8d97449198a7760bf5163e635.mirror.swr.myhuaweicloud.com" ]
}
#按“Esc”, 输入:wq保存并退出。#重启容器引擎
[root@docker_server ~]# systemctl restart docker-----
# 配置服务
[root@docker_server ~]# vim /usr/lib/systemd/system/docker.service
# 在ExecStart参数中最后添加 -H tcp://0.0.0.0:2375, docker默认监听2375
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
-H tcp://0.0.0.0:2375
[root@docker_server ~]# systemctl daemon-reload
[root@docker_server ~]# systemctl retart docker.service
[root@docker_server ~]# systemctl stop firewalld# 验证
[root@docker_server ~]# yum install lsof
[root@docker_server ~]# lsof -i :2375
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
dockerd 5440 root 3u IPv6 44991 0t0 TCP *:docker (LISTEN)
docker_client端配置
流程概述
- 配置IP地址:192.168.108.31
- 网关:192.168.108.2
- DNS:192.168.102.2
- 配置主机名 docker_client
- 安装相关软件包
- 配置服务
[root@docker_client ~]# hostnamectl set-hostname docker_server
[root@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
[root@docker_client ~]# nmcli con up ens160-----
[root@docker_client ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 vim
[root@docker_client ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
Adding repo from: https://mirrors.aliyun.com/docker-ce/linux/centos/dockerce.repo
[root@docker_client ~]# yum makecache
[root@docker_client ~]# yum install -y docker-ce-cli-----
# 验证
[root@docker_client ~]# docker run hello-world #client直接执行报错, 没有装服务端
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is
the docker daemon running?.
See 'docker run --help'.# client端连接server端执行命令
[root@docker_client ~]# docker -H 192.168.108.30 run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.To generate this message, Docker took the following steps:1. The Docker client contacted the Docker daemon.2. The Docker daemon pulled the "hello-world" image from the Docker Hub.(amd64)3. The Docker daemon created a new container from that image which runs theexecutable that produces the output you are currently reading.4. The Docker daemon streamed that output to the Docker client, which sent itto your terminal.To try something more ambitious, you can run an Ubuntu container with:$ docker run -it ubuntu bashShare images, automate workflows, and more with a free Docker ID:https://hub.docker.com/For more examples and ideas, visit:https://docs.docker.com/get-started/[root@docker_client ~]# docker -H 192.168.108.30 images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 1b44b5a3e06a 3 weeks ago 10.1kB
httpd latest 199e3a035264 3 weeks ago 117MB
#也可以切换到server端查看现象
说明:client 只做管理,image和container存储在server端
ntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
[root@docker_client ~]# docker -H 192.168.108.30 images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 1b44b5a3e06a 3 weeks ago 10.1kB
httpd latest 199e3a035264 3 weeks ago 117MB
#也可以切换到server端查看现象
> 说明:client 只做管理,image和container存储在server端