当前位置: 首页 > news >正文

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 虚拟机 本质区别

表格

对比项虚拟机 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. 迁移、扩容、集群极其简单

  1. 迁移:镜像导出压缩包,拷贝到新服务器导入直接运行;
  2. 扩容:新增节点只需要拉取同一镜像启动容器,环境完全统一;
  3. 集群:K8s 基于 Docker 镜像实现弹性伸缩,秒级扩容实例。

6. 快速销毁,不污染宿主机系统

容器是临时沙盒,测试环境用完直接docker rm删除,所有文件、依赖全部清除,不会在宿主机残留垃圾文件、软件。 测试中间件、新版本软件不用反复安装卸载。

7. 持续集成 CI/CD 完美适配(GitLab 流水线核心)

GitLab CI、Jenkins 流水线标准流程: 代码提交 → 构建 Docker 镜像 → 推送私有镜像仓库 → 服务器拉取镜像自动部署。 实现代码、环境、部署一体化自动化。

8. 版本回滚,快速故障恢复

镜像支持多版本标签:project:v1.0project:v2.0; 新版本上线出现 bug,一键切换旧版本镜像启动,快速回滚业务,比传统替换 Jar 包稳定可靠。

四、Docker 三大核心核心概念(必须分清)

1. 镜像 Image(静态模板,只读)

镜像就是打包好的软件安装包,包含程序、依赖、环境,只读,不能修改。 类比:Windows 系统安装包、软件安装程序。 举例:gitlab/gitlab-ce镜像、mysql:8.0镜像、nginx:1.24镜像。

  • 分层存储:Docker 镜像采用 UnionFS 分层,底层公共层复用,节省磁盘空间;
  • 不可修改:想要修改内容必须基于原有镜像新建镜像。

2. 容器 Container(镜像运行实例,可读写)

镜像运行后产生的动态实例,拥有独立读写文件系统、网络、进程。 类比:安装包安装后打开运行的软件程序。

  • 一个镜像可以同时启动 N 个独立容器;
  • 容器删除后,容器内读写数据会丢失(必须挂载数据卷持久化);
  • 生命周期:创建 → 启动 → 停止 → 删除。

3. 仓库 Registry(镜像存储中心)

存放镜像的服务器,分为三类:

  1. 官方公共仓库 Docker Hub:存放 MySQL、Redis、GitLab 官方镜像;
  2. 企业私有镜像仓库:Harbor,公司内部业务镜像私有存储,外网无法访问;
  3. 本地仓库:服务器本地存储镜像。

五、Docker 底层核心架构

Docker 采用C/S 客户端 - 服务端架构

  1. Client(客户端):我们输入docker run/docker ps命令的工具;
  2. Daemon(dockerd 守护进程):后台常驻服务,管理镜像、容器、网络、数据卷;
  3. REST API:客户端和守护进程通信接口;
  4. Registry 镜像仓库:拉取、推送镜像。

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

  1. Namespace:实现容器资源隔离(网络、进程、文件)
  2. Cgroups:限制容器 CPU、内存、磁盘 IO 资源上限
  3. UnionFS 联合文件系统:实现镜像分层读写,容器读写层单独分层,不修改原始镜像

六、Docker 核心组件详解

1. 数据卷 Volume(解决容器数据丢失问题)

容器删除,内部所有文件全部清空,数据库、GitLab 代码、日志会丢失。 数据卷把宿主机目录挂载到容器内部,数据永久保存在服务器磁盘,和容器生命周期解绑。 两种挂载方式:

  1. 命名卷:Docker 自动管理存储目录
  2. 绑定挂载:手动指定宿主机目录(部署 GitLab、MySQL 必用) 示例 GitLab 挂载:

yaml

volumes: - ./config:/etc/gitlab - ./logs:/var/log/gitlab - ./data:/var/opt/gitlab

容器删除,宿主机 config、data 文件夹代码、配置依然保留。

2. Docker 网络(容器通信)

四种网络模式:

  1. bridge 桥接(默认):同一服务器容器互相访问,容器独立 IP;
  2. host 主机模式:容器直接复用宿主机网卡,无端口隔离;
  3. none 无网络:完全禁用网络,安全离线容器;
  4. 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 gitlab

Compose 编排命令

bash

运行

# 后台启动整套服务 docker-compose up -d # 停止服务 docker-compose down # 重新构建镜像并重启 docker-compose up -d --build

八、Docker 部署完整流程(以 GitLab 举例)

  1. 服务器安装 Docker 引擎 + Docker Compose;
  2. 编写docker-compose.yml,配置镜像、端口、数据卷挂载;
  3. docker-compose up -d自动拉取 GitLab 镜像,创建容器;
  4. 容器启动,挂载本地目录持久化配置、代码、日志;
  5. 访问 IP 使用,需要迁移直接复制宿主机挂载目录,新服务器启动即可;
  6. 版本升级:修改镜像标签,重新执行 up -d,自动拉取新版本镜像更新。

九、Docker 优缺点总结

优点

  1. 环境标准化,彻底消除环境不一致问题;
  2. 资源占用极低,一台服务器可部署数十个服务;
  3. 部署、迁移、扩容效率极高,一键启停;
  4. 资源隔离,服务之间互不冲突、安全隔离;
  5. 完美适配 CI/CD 自动化流水线;
  6. 镜像版本管理,线上故障快速回滚;
  7. 跨系统兼容,Linux/Windows/mac 运行一致。

缺点

  1. 仅支持 Linux 内核,Windows/mac 需要底层虚拟机兼容;
  2. 内核共享,无法实现完全硬件级隔离(超高安全金融场景搭配虚拟机);
  3. 复杂集群大规模运维需要搭配 K8s,原生 Docker 单机能力有限;
  4. 镜像分层存储,长期不清理会占用大量磁盘空间。

十、常见开发使用场景

  1. 本地开发环境:一键启动 MySQL、Redis、RocketMQ,不用本地安装中间件;
  2. 线上服务部署:GitLab、Nginx、后端 Java、Vue 前端全部容器化;
  3. CI/CD 自动化打包部署:流水线构建业务镜像,自动发布;
  4. 测试环境快速搭建:临时拉起全套测试服务,测试完成直接销毁;
  5. 集群扩容:多台服务器统一镜像,批量启动实例;
  6. 版本灰度发布:新旧镜像并行,快速切换回滚。

十一、学习路线梳理

  1. 理解镜像、容器、仓库、数据卷四大基础概念;
  2. 掌握基础 docker 命令,手动拉取 MySQL、Redis 练习启动;
  3. 学习 Dockerfile,自己打包 SpringBoot/Vue 自定义镜像;
  4. 精通 Docker Compose,实现多服务整套编排部署(GitLab、前后端项目);
  5. 进阶私有镜像仓库 Harbor、K8s 容器集群调度。

结语

Docker 是现代后端开发、运维的必备基础工具,现在几乎所有云服务器、中间件、项目都采用 Docker 部署。 传统手动安装软件的模式已经被淘汰,核心优势就是标准化环境、轻量隔离、一键部署、便于自动化。 你之前部署 Nginx 前端、GitLab、Redis、MySQL 的方案,全部基于 Docker 容器化实现,熟练掌握 Docker 能大幅降低项目部署、迁移、环境排错的工作量。

http://www.jsqmd.com/news/1105906/

相关文章:

  • LangMem记忆框架vs蛙趣拼文:框架级记忆和产品级记忆的工程差异
  • 嵌入式 Linux 快速入门(四)
  • DVWA 靶场 SQL 注入实战心得:从手工检测到布尔盲注自动化利用全流程详解
  • 项目面试-雪花算法如何生成唯一标识
  • 2026广州高端宣传片拍摄团队怎么选?广州AIGC企业视频制作机构盘点
  • 基于单片机的工件位置控制系统设计
  • 进程是什么,协程是什么
  • 还在手敲数据库三线表?这个SQL自动生成法,建议直接收藏!
  • 三台迷你主机硬跑70B大模型!场面十分尴尬
  • AI智能体运营工程师:核心能力与实战路径
  • 3步快速部署GreaterWMS:完全开源的仓库管理系统完整指南
  • 泛目录站群程序,泛站群程序源码,泛端口站群程序
  • [论文学习]SOFT:选择性数据混淆——保护LLM微调免受成员推理攻击深度解读
  • Gemini Nano Banana Pro图像生成提示词技巧与参数优化
  • 【第一部分(升级版):机器学习基础概念篇】
  • 2026年ISO认证咨询机构选型指南:企业如何选择你的管理赋能伙伴
  • 1.超详细Redis7.X 安装教程
  • SPEKS可搜索加密模型漏洞剖析:从离线关键词猜到工程实践加固
  • 终极窗口管理工具:5分钟掌握游戏分辨率自定义的完整指南
  • 筑牢企业“东墙”:Linux防火墙从iptables到nftables的平滑迁移与实战
  • AI绘画提示词设计指南与Gemini Nano Banana Pro实践
  • AI Agent 工程师面试题 200 题(codex出品)
  • GPU并行优化:OpenMP卸载代码的性能提升策略
  • 802.1X 认证技术指南
  • THPX信号源:把合规意识做到位——细节分析与提示整理
  • 《小程序网站翻译:全球化征程中的关键一环》
  • 第一次学 Neo4j,我终于明白 Agent 为什么不只用 MySQL
  • Skill安全系列之Skill基础
  • leecodecode【面试150】【2026.6.26-7.1打卡-java版本】
  • 前端转大模型:页面开发到 AI 产品工程师,从方案设计到上线检查