1. Docker 基础概念:镜像、容器、仓库、Docker 架构与核心组件
Docker 是目前最主流的容器化平台,它将应用及其依赖打包在轻量级、可移植的容器中,实现“一次构建,随处运行”。理解 Docker 的四个核心概念——镜像、容器、仓库以及整体架构——是搭建后端部署环境、管理连接池水位的前提。
1.1 核心概念速览
| 概念 | 类比 | 定义 | 关键特征 |
|---|---|---|---|
| 镜像 (Image) | 类 / 安装包 | 一个只读的、包含应用及其运行时依赖的模板文件 | 分层构建、不可变、可复用 |
| 容器 (Container) | 对象 / 运行实例 | 镜像的可运行实例,拥有独立的文件系统、网络和进程空间 | 轻量、可写层、生命周期短暂 |
| 仓库 (Registry) | 代码仓库 (Git) | 集中存储和分发 Docker 镜像的服务 | 公有/私有、标签管理、版本控制 |
| Docker 主机 | 操作系统 | 安装并运行 Docker 守护进程的物理机或虚拟机 | 管理镜像、容器、网络、存储卷 |
💡 连接池水位视角: 镜像定义了应用和连接池库(如 HikariCP)的版本;容器是连接池实际运行并消耗数据库连接的进程;仓库用于分发包含连接池配置的镜像版本。
1.2 Docker 架构与核心组件
Docker 采用 C/S (客户端-服务器) 架构。用户通过 Docker CLI 与后台守护进程通信,守护进程负责构建、运行和分发容器。
架构核心组件:
- Docker Client (客户端):用户交互入口,执行
docker build、docker run等命令。 - Docker Daemon (守护进程):后台常驻进程,管理镜像、容器、网络、存储卷。
- REST API:客户端与守护进程之间的通信接口。
- containerd:容器运行时管理组件,负责容器生命周期(创建、启动、停止)。
- runc:低层容器运行时,直接与 Linux 内核交互(cgroups、namespace)。
1.3 镜像分层与容器可写层
Docker 镜像由多个只读层叠加而成,每一层代表一个 Dockerfile 指令。容器启动时,在镜像层之上挂载一个可写层(容器层),所有运行时修改(如日志、临时文件)都写入该层。
⚠️ 连接池水位影响: 容器重启后,可写层数据默认丢失。连接池的实时状态(活跃连接数、等待队列)存储在容器内存中,重启即重置。生产环境应使用外部数据库或 Redis 持久化连接池指标。
1.4 仓库 (Registry) 与镜像分发
仓库是 Docker 生态的“镜像市场”。开发人员将构建好的镜像推送到仓库,部署时从仓库拉取。常见的仓库包括:
- Docker Hub:官方公有仓库,包含大量基础镜像(如
nginx、alpine)。 - 私有仓库 (Harbor / Nexus):企业自建,用于存储内部应用镜像,支持安全扫描和访问控制。
- 云厂商镜像服务:阿里云 ACR、AWS ECR、Azure ACR 等。
连接池水位部署流程:
- 开发阶段:在 Dockerfile 中配置连接池参数(
maximumPoolSize、connectionTimeout)。 - 构建阶段:
docker build -t myapp:1.0 .生成镜像。 - 推送阶段:
docker push myregistry.com/myapp:1.0上传至仓库。 - 部署阶段:从仓库拉取镜像并启动容器,连接池自动初始化。
1.5 常用 Docker 命令速查
| 命令 | 作用 | 连接池场景示例 |
|---|---|---|
docker pull |
从仓库拉取镜像 | docker pull openjdk:17 |
docker run |
创建并启动容器 | docker run -e DB_URL=jdbc:mysql://... myapp |
docker ps |
查看运行中的容器 | 检查连接池所在容器是否存活 |
docker logs |
查看容器日志 | 排查连接池初始化失败原因 |
docker exec |
进入容器内部 | docker exec -it myapp bash 查看连接池 JMX 指标 |
docker commit |
将容器保存为新镜像 | 调试后固化连接池配置 |