Docker 完整理解
前言
之前我们有一篇博客讨论过docker,现在云服务器、GitLab、Redis、RocketMQ、MySQL、前端 Nginx 项目,企业 90% 都使用 Docker 部署。很多开发只知道敲docker run,但不懂底层原理、解决了什么传统部署痛点。 本文从传统部署痛点 → Docker 核心定义 → 八大核心作用 → 底层架构 → 镜像 / 容器 / 仓库详解 → Docker Compose 多服务编排 → 优缺点对比完整拆解,结合你之前部署 GitLab、Redis、MySQL、Nginx 的场景举例,通俗易懂、细节拉满。
一、先搞懂:没有 Docker 之前,软件部署有多痛苦?
传统物理机 / 虚拟机部署的四大致命痛点
1. 环境不一致:本地能跑,服务器线上报错
开发本地 JDK17、Maven3.8、Redis6;测试服务器 JDK8、Redis5;生产环境依赖缺失。 出现经典问题:“我本地没问题,线上崩了”,排查环境依赖耗时几小时。
2. 软件安装繁琐,依赖地狱
部署 GitLab 要装 Nginx、Redis、PostgreSQL;部署 Redis 要编译源码、配置系统内核; 每台机器重复安装、配置,版本不统一,人工操作极易出错。
3. 虚拟机资源开销巨大
传统 VMware、KVM 虚拟机需要完整独立操作系统,一台机器开 3 台虚拟机内存直接占满,资源利用率极低。
4. 迁移、扩容极其麻烦
项目换服务器,需要重新搭建全套环境、复制配置、安装依赖; 多机器集群扩容,每台机器手动重复部署,无法批量标准化。
5. 版本冲突,端口、依赖互相抢占
一台服务器部署多个服务:不同 Java 项目依赖不同 JDK、多个中间件抢占端口、库文件版本冲突,无法共存。
Docker 就是为一次性解决以上所有痛点诞生的容器化工具。
二、Docker 到底是什么?
Docker 是一款轻量级容器化引擎,基于 Linux 内核技术(Namespace 资源隔离 + Cgroups 资源限制 + UnionFS 分层镜像),可以把应用 + 所有依赖打包成一个标准化镜像,一次打包,到处运行。
核心一句话:把软件和它运行需要的全部环境打包隔离,脱离操作系统限制,标准化交付。
容器 vs 虚拟机 本质区别
表格
| 对比项 | 虚拟机 VM | Docker 容器 |
|---|---|---|
| 隔离层级 | 完整操作系统内核隔离 | 仅进程、文件、网络、用户隔离,共享宿主机内核 |
| 资源占用 | 高,每台虚拟机占用 G 级内存 | 极低,单个容器仅几十 MB |
| 启动速度 | 分钟级 | 秒级启动 |
| 镜像体积 | GB 级别 | MB 级别 |
| 内核 | 独立内核 | 共用宿主机 Linux 内核 |
| 部署效率 | 手动搭建环境,繁琐 | 镜像一键启动,无需配置 |
简单理解: 虚拟机 = 完整一台独立电脑; Docker 容器 = 一个隔离的独立程序沙盒。
三、Docker 八大核心作用(开发 / 运维必备)
1. 解决「环境不一致」,实现一次打包到处运行
打包时包含:程序代码、JDK/Python、配置文件、依赖库、环境变量。 镜像在 Windows、CentOS、Ubuntu、云服务器运行效果完全一致,彻底消灭 “本地正常线上报错”。 举例:你打包 SpringBoot 项目镜像,本地、测试、生产服务器直接运行,不用手动装 JDK。
2. 轻量隔离,多服务互不干扰,一台服务器跑百个服务
通过 Linux Namespace 实现六大隔离:
- PID 隔离:容器内进程独立,看不到宿主机其他程序
- 网络隔离:容器拥有独立网卡、IP、端口,端口冲突不再报错
- 文件系统隔离:容器内部文件独立,不会污染宿主机目录
- 用户权限隔离:容器 root 不等于宿主机 root,提升安全
- 挂载、主机名隔离 一台服务器同时部署 MySQL8、Redis、RocketMQ、GitLab、Nginx、Vue 前端,互相完全隔离,不会出现依赖冲突。
3. 资源限制,防止单个服务占满服务器资源
使用 Cgroups 限制容器 CPU、内存、磁盘 IO: 部署 GitLab 时限制内存 4G,防止 GitLab 内存溢出抢占 MySQL 资源; 限制 Java 服务最大 2 核 CPU,避免程序死循环打满服务器。
4. 标准化部署,一键启动,零人工配置
传统部署 GitLab 需要安装 Nginx、PostgreSQL、Redis、配置文件修改; Docker 只需要一条docker-compose up -d自动拉取镜像、初始化所有组件、自动配置,全程无需手动安装软件。
5. 迁移、扩容、集群极其简单
- 迁移:镜像导出压缩包,拷贝到新服务器导入直接运行;
- 扩容:新增节点只需要拉取同一镜像启动容器,环境完全统一;
- 集群:K8s 基于 Docker 镜像实现弹性伸缩,秒级扩容实例。
6. 快速销毁,不污染宿主机系统
容器是临时沙盒,测试环境用完直接docker rm删除,所有文件、依赖全部清除,不会在宿主机残留垃圾文件、软件。 测试中间件、新版本软件不用反复安装卸载。
7. 持续集成 CI/CD 完美适配(GitLab 流水线核心)
GitLab CI、Jenkins 流水线标准流程: 代码提交 → 构建 Docker 镜像 → 推送私有镜像仓库 → 服务器拉取镜像自动部署。 实现代码、环境、部署一体化自动化。
8. 版本回滚,快速故障恢复
镜像支持多版本标签:project:v1.0、project:v2.0; 新版本上线出现 bug,一键切换旧版本镜像启动,快速回滚业务,比传统替换 Jar 包稳定可靠。
四、Docker 三大核心核心概念(必须分清)
1. 镜像 Image(静态模板,只读)
镜像就是打包好的软件安装包,包含程序、依赖、环境,只读,不能修改。 类比:Windows 系统安装包、软件安装程序。 举例:gitlab/gitlab-ce镜像、mysql:8.0镜像、nginx:1.24镜像。
- 分层存储:Docker 镜像采用 UnionFS 分层,底层公共层复用,节省磁盘空间;
- 不可修改:想要修改内容必须基于原有镜像新建镜像。
2. 容器 Container(镜像运行实例,可读写)
镜像运行后产生的动态实例,拥有独立读写文件系统、网络、进程。 类比:安装包安装后打开运行的软件程序。
- 一个镜像可以同时启动 N 个独立容器;
- 容器删除后,容器内读写数据会丢失(必须挂载数据卷持久化);
- 生命周期:创建 → 启动 → 停止 → 删除。
3. 仓库 Registry(镜像存储中心)
存放镜像的服务器,分为三类:
- 官方公共仓库 Docker Hub:存放 MySQL、Redis、GitLab 官方镜像;
- 企业私有镜像仓库:Harbor,公司内部业务镜像私有存储,外网无法访问;
- 本地仓库:服务器本地存储镜像。
五、Docker 底层核心架构
Docker 采用C/S 客户端 - 服务端架构
- Client(客户端):我们输入
docker run/docker ps命令的工具; - Daemon(dockerd 守护进程):后台常驻服务,管理镜像、容器、网络、数据卷;
- REST API:客户端和守护进程通信接口;
- Registry 镜像仓库:拉取、推送镜像。
底层依赖 Linux 三大内核技术:
- Namespace:实现容器资源隔离(网络、进程、文件)
- Cgroups:限制容器 CPU、内存、磁盘 IO 资源上限
- UnionFS 联合文件系统:实现镜像分层读写,容器读写层单独分层,不修改原始镜像
六、Docker 核心组件详解
1. 数据卷 Volume(解决容器数据丢失问题)
容器删除,内部所有文件全部清空,数据库、GitLab 代码、日志会丢失。 数据卷把宿主机目录挂载到容器内部,数据永久保存在服务器磁盘,和容器生命周期解绑。 两种挂载方式:
- 命名卷:Docker 自动管理存储目录
- 绑定挂载:手动指定宿主机目录(部署 GitLab、MySQL 必用) 示例 GitLab 挂载:
yaml
volumes: - ./config:/etc/gitlab - ./logs:/var/log/gitlab - ./data:/var/opt/gitlab容器删除,宿主机 config、data 文件夹代码、配置依然保留。
2. Docker 网络(容器通信)
四种网络模式:
- bridge 桥接(默认):同一服务器容器互相访问,容器独立 IP;
- host 主机模式:容器直接复用宿主机网卡,无端口隔离;
- none 无网络:完全禁用网络,安全离线容器;
- container 共享网络:复用另一个容器网卡。 多服务互通:同一 bridge 网络下,容器名直接作为域名互相访问。
3. Dockerfile:自定义镜像构建脚本
文本文件,定义如何从零打包自己的项目镜像。 示例 SpringBoot 项目 Dockerfile:
dockerfile
# 基础镜像JDK17 FROM openjdk:17-jdk # 拷贝Jar包到容器 COPY target/demo.jar /app.jar # 启动命令 CMD ["java","-jar","/app.jar"]执行docker build -t demo:v1 .构建自定义业务镜像。
4. Docker Compose:多容器编排工具
单个服务用docker run;一套系统多个服务(GitLab+Redis+PostgreSQL、前后端 + MySQL)用 Compose 统一管理。 通过docker-compose.yml配置文件,一次性定义所有容器、端口、挂载、网络、依赖,一条命令启停整套服务。 你之前部署 GitLab 使用的就是 Docker Compose 方案,是中小企业最主流部署方式。
七、Docker 常用核心命令(配套实操理解)
镜像操作
bash
运行
# 拉取镜像 docker pull mysql:8.0 # 查看本地镜像 docker images # 构建自定义镜像 docker build -t order-service:1.0 . # 删除无用镜像 docker rmi 镜像ID容器操作
bash
运行
# 后台启动容器 docker run -d --name mysql -p 3306:3306 mysql:8.0 # 查看运行中容器 docker ps # 进入容器内部控制台 docker exec -it gitlab /bin/bash # 停止/重启/删除容器 docker stop 容器名 docker restart 容器名 docker rm 容器名 # 查看容器日志(排查报错) docker logs -f gitlabCompose 编排命令
bash
运行
# 后台启动整套服务 docker-compose up -d # 停止服务 docker-compose down # 重新构建镜像并重启 docker-compose up -d --build八、Docker 部署完整流程(以 GitLab 举例)
- 服务器安装 Docker 引擎 + Docker Compose;
- 编写
docker-compose.yml,配置镜像、端口、数据卷挂载; docker-compose up -d自动拉取 GitLab 镜像,创建容器;- 容器启动,挂载本地目录持久化配置、代码、日志;
- 访问 IP 使用,需要迁移直接复制宿主机挂载目录,新服务器启动即可;
- 版本升级:修改镜像标签,重新执行 up -d,自动拉取新版本镜像更新。
九、Docker 优缺点总结
优点
- 环境标准化,彻底消除环境不一致问题;
- 资源占用极低,一台服务器可部署数十个服务;
- 部署、迁移、扩容效率极高,一键启停;
- 资源隔离,服务之间互不冲突、安全隔离;
- 完美适配 CI/CD 自动化流水线;
- 镜像版本管理,线上故障快速回滚;
- 跨系统兼容,Linux/Windows/mac 运行一致。
缺点
- 仅支持 Linux 内核,Windows/mac 需要底层虚拟机兼容;
- 内核共享,无法实现完全硬件级隔离(超高安全金融场景搭配虚拟机);
- 复杂集群大规模运维需要搭配 K8s,原生 Docker 单机能力有限;
- 镜像分层存储,长期不清理会占用大量磁盘空间。
十、常见开发使用场景
- 本地开发环境:一键启动 MySQL、Redis、RocketMQ,不用本地安装中间件;
- 线上服务部署:GitLab、Nginx、后端 Java、Vue 前端全部容器化;
- CI/CD 自动化打包部署:流水线构建业务镜像,自动发布;
- 测试环境快速搭建:临时拉起全套测试服务,测试完成直接销毁;
- 集群扩容:多台服务器统一镜像,批量启动实例;
- 版本灰度发布:新旧镜像并行,快速切换回滚。
十一、学习路线梳理
- 理解镜像、容器、仓库、数据卷四大基础概念;
- 掌握基础 docker 命令,手动拉取 MySQL、Redis 练习启动;
- 学习 Dockerfile,自己打包 SpringBoot/Vue 自定义镜像;
- 精通 Docker Compose,实现多服务整套编排部署(GitLab、前后端项目);
- 进阶私有镜像仓库 Harbor、K8s 容器集群调度。
结语
Docker 是现代后端开发、运维的必备基础工具,现在几乎所有云服务器、中间件、项目都采用 Docker 部署。 传统手动安装软件的模式已经被淘汰,核心优势就是标准化环境、轻量隔离、一键部署、便于自动化。 你之前部署 Nginx 前端、GitLab、Redis、MySQL 的方案,全部基于 Docker 容器化实现,熟练掌握 Docker 能大幅降低项目部署、迁移、环境排错的工作量。
