
前言之前我们有一篇博客讨论过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 虚拟机 本质区别表格对比项虚拟机 VMDocker 容器隔离层级完整操作系统内核隔离仅进程、文件、网络、用户隔离共享宿主机内核资源占用高每台虚拟机占用 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命令的工具Daemondockerd 守护进程后台常驻服务管理镜像、容器、网络、数据卷REST API客户端和守护进程通信接口Registry 镜像仓库拉取、推送镜像。底层依赖 Linux 三大内核技术Namespace实现容器资源隔离网络、进程、文件Cgroups限制容器 CPU、内存、磁盘 IO 资源上限UnionFS 联合文件系统实现镜像分层读写容器读写层单独分层不修改原始镜像六、Docker 核心组件详解1. 数据卷 Volume解决容器数据丢失问题容器删除内部所有文件全部清空数据库、GitLab 代码、日志会丢失。 数据卷把宿主机目录挂载到容器内部数据永久保存在服务器磁盘和容器生命周期解绑。 两种挂载方式命名卷Docker 自动管理存储目录绑定挂载手动指定宿主机目录部署 GitLab、MySQL 必用 示例 GitLab 挂载yamlvolumes: - ./config:/etc/gitlab - ./logs:/var/log/gitlab - ./data:/var/opt/gitlab容器删除宿主机 config、data 文件夹代码、配置依然保留。2. Docker 网络容器通信四种网络模式bridge 桥接默认同一服务器容器互相访问容器独立 IPhost 主机模式容器直接复用宿主机网卡无端口隔离none 无网络完全禁用网络安全离线容器container 共享网络复用另一个容器网卡。 多服务互通同一 bridge 网络下容器名直接作为域名互相访问。3. Dockerfile自定义镜像构建脚本文本文件定义如何从零打包自己的项目镜像。 示例 SpringBoot 项目 Dockerfiledockerfile# 基础镜像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一套系统多个服务GitLabRedisPostgreSQL、前后端 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 能大幅降低项目部署、迁移、环境排错的工作量。