Docker 学习总结(下):数据卷、Compose 与部署实战
一、从跑一个容器到跑一堆容器上篇学完我已经能把 hm-service 打成镜像、用docker run跑起来了。但黑马商城是微服务项目订单、商品、网关好几个服务外加 MySQL、Redis 这些中间件每个都手敲一遍docker run参数又长又容易抄错改一次配置就得全部重来。所以下篇解决两件事容器里的数据怎么不丢数据卷多个容器怎么一起管Compose最后把 hm-service 完整部署一遍。二、数据卷容器的外置硬盘最早起 MySQL 容器的时候忘了挂-v。中途 restart 了几次都没事数据还在我就以为没问题了。后来rm重跑库和表全没了。当时我盯着空荡荡的数据库脑子里只有一个想法我明明没删数据啊。愣了几秒才反应过来——数据一直在容器里容器没了数据就没了。restart 不会丢数据rm才会。这一点我后来才弄清楚restart 只是重启容器可写层还在rm才是把容器和它的可写层一起删掉。数据卷就是为这个场景准备的把宿主机目录挂载进容器dockerrun-vmysql-data:/var/lib/mysql mysql-v后面的格式是宿主机路径或卷名:容器路径。容器往这个路径里写的数据其实落到了宿主机上。容器删了数据还在重建一个容器挂同一个目录数据接着用。用法上大概分两类MySQL 数据目录、Redis 持久化文件这类必须保住的挂命名卷或固定目录配置文件、日志目录这类经常改的用绑定挂载宿主机上改完容器里立刻生效不用重新打镜像。命名卷和绑定挂载的区别也弄清楚了docker volume create出来的命名卷由 Docker 统一管理位置藏在/var/lib/docker/volumes下面省心但不好直接摸到绑定挂载就是自己指定宿主机路径位置透明。数据求稳用命名卷配置求好选用绑定挂载。从那以后起中间件之前我会先问自己一句这容器里有什么数据是不能丢的。三、Docker Compose用 YAML 管理多容器服务一多一个个docker run就撑不住了命令越敲越长启动顺序没法保证参数也没个记录。Compose 的思路很直接——把所有docker run收进一个docker-compose.ymlservices:hm-service:build:.ports:-8081:8080environment:-DB_HOSThost.docker.internaldepends_on:mysql:condition:service_healthyrestart:alwaysmysql:image:mysql:8volumes:-mysql-data:/var/lib/mysqlhealthcheck:test:[CMD,mysqladmin,ping]interval:5sretries:10volumes:mysql-data:我挑几个容易和docker run搞混的字段说一下services下面每个键就是一个容器image/build用现成镜像写image要从 Dockerfile 构建写buildports等价于-p“宿主机:容器”environment等价于-e塞环境变量depends_on声明启动顺序。默认只保证mysql 容器先启动配合condition: service_healthy才能真正等到 MySQL 就绪volumes数据卷用法和-v一样顶层的volumes用来声明命名卷restart容器挂了自动拉起always表示除非手动停否则一直重启healthcheck定期检查容器里的服务是否真的可用剩下的字段用到的时候查文档就行不用背。depends_on 只管启动不管就绪一开始只写了depends_on: - mysql以为这样 hm-service 就会等 MySQL 准备好了再启动。结果 hm-service 起来之后还是报连接失败——因为它只保证mysql 容器启动了不保证mysql 服务能连了。后来在 mysql 上加了 healthcheck再用condition: service_healthy才能真正等到 MySQL 可以接受连接了再启动 hm-servicedepends_on:mysql:condition:service_healthyhealthcheck 里的test是检查命令mysqladmin ping能通就说明 MySQL 活着。interval是检查间隔retries是失败重试次数超过次数 Docker 就认为容器不健康。还有一个点restart: always是生产部署的标配。学习阶段可能感觉不到它的价值但容器因为意外挂了、服务器重启了这行配置能让服务自动恢复不用人手动去拉。部署实战里这行配置比任何优化都实在。常用命令命令作用docker compose up -d后台启动所有服务docker compose down停止并删除容器默认保留命名卷docker compose logs -f实时查看日志Compose 不是另一个 Docker它只是把散落的 docker 命令文件化。yml 里每个字段几乎都能对应到上篇学过的某个命令。四、部署实战把 hm-service 跑起来这次把上篇零散学的东西串了一遍。先mvn package -DskipTests打出 jar然后基于openjdk:17-jdk-slim写 Dockerfiledocker build构建最后dockerrun-d--namehm-service-p8081:8080-eDB_HOSThost.docker.internal hm-service:1.0起容器。端口映射 8081:8080浏览器访问宿主机 8081流量转进容器的 8080。构建和启动都没出问题结果服务一起来就抛反射错误——MyBatis-Plus 序列化 lambda 表达式时反射访问 SerializedLambda抛出InaccessibleObjectExceptionCaused by: java.lang.reflect.InaccessibleObjectException: Unable to make field private final java.lang.Class java.lang.invoke.SerializedLambda.capturingClass accessible: module java.base does not opens java.lang.invoke to unnamed module 27abe2cd at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354) at com.baomidou.mybatisplus.core.toolkit.SetAccessibleAction.run(SetAccessibleAction.java:18) at com.baomidou.mybatisplus.core.toolkit.SerializedLambdaMeta.clinit(SerializedLambdaMeta.java:19) at com.baomidou.mybatisplus.core.toolkit.LambdaUtils.extract(LambdaUtils.java:55)查了一下根源在 JDK 9 引入的模块系统JDK 16 之后强封装变成默认行为java.base不再对未命名模块开放java.lang.invoke这些内部包MyBatis-Plus 反射读 SerializedLambda 内部字段时正好被拦住。平时在本地 IDEA 里跑感觉不到IDE 往往自带各种宽容参数换成干净的容器就现原形了。报错信息里写清了是哪个包没开对着加--add-opens就行ENTRYPOINT [java, --add-opens, java.base/java.lang.invokeALL-UNNAMED, -jar, /app.jar]改完重新 build服务顺利起来。那一刻我有点后怕。如果不是容器逼着我把环境暴露出来我可能一直不知道自己的项目依赖了 IDE 的宽容参数。在我电脑上能跑这句话在容器面前毫无意义。五、小结下篇补上了数据卷、Compose、hm-service 部署实战外加一个印象很深的 JDK 17 反射坑。连同上篇的镜像、容器、Dockerfile 和网络Docker 基础部分到这里闭环了。两篇写完回头看Docker 最核心的东西其实就两个分层和隔离。镜像分层叠加容器各自隔离。Compose 管的是把这一堆隔离的东西组合起来数据卷管的是隔离边界上的持久化。上篇的镜像、容器、网络下篇的数据卷、Compose说到底都是围绕这两个词在转。难的真不是命令是理解背后的设计思想。命令忘了随时能查文档思想通了遇到没见过的报错也知道往哪儿查。

相关新闻

eWebEditor JSP版:Java Web老项目快速集成富文本编辑器方案

eWebEditor JSP版:Java Web老项目快速集成富文本编辑器方案

简介:本资源是专为JSP开发者提供的轻量级富文本在线编辑器eWebEditor v0.1.4修改版,由吕海鹏优化适配,适用于Java Web项目中快速集成网页内容编辑功能,解决传统表单无法支持图文混排、格式化编辑与HTML源码可控等痛点,…

2026/10/10 6:39:00 阅读更多 →
数组元素交换最大值最小值:索引修正与边界条件详解

数组元素交换最大值最小值:索引修正与边界条件详解

1. 题目到底在考什么先别急着写代码。这道题看起来只是“交换数组首尾元素”,但它其实埋了不少坑,尤其是“最大的与第一个元素交换,最小的与最后一个元素交换”这句话,很多人第一次做都会掉进顺序陷阱里。题目本身很简单&#xff…

2026/10/10 6:39:00 阅读更多 →
React Native鸿蒙开发入门:电风扇旋转Demo实战解析

React Native鸿蒙开发入门:电风扇旋转Demo实战解析

最近在折腾React Native开发鸿蒙应用,拿一个会转的电风扇练手。这个项目算很基础的入门Demo,但覆盖面一点都不窄:界面布局、组件拆分、状态管理、循环动画、设备联调,全都在一个几十行的代码里串起来了。很多人第一次接触鸿蒙跨平…

2026/10/10 6:39:00 阅读更多 →

最新新闻

我对等保2.0的看法

我对等保2.0的看法

结合等保2.0标准资料来看,我对它的理解是:它不是1.0的简单修订,而是《网络安全法》实施后等级保护制度的一次整体升级。核心变化在于,合规基线从“被动防住”转向“主动对抗、持续运营”。这个判断听着有点抽象,但落到…

2026/10/10 7:19:18 阅读更多 →
利用ABAQUS CEL算法模拟密封突破:从接触应力到泄漏路径的完整指南

利用ABAQUS CEL算法模拟密封突破:从接触应力到泄漏路径的完整指南

先说我遇到的真实案例。给某型号高压水阀做密封评审,按老一套流程操作:提取50 MPa工况下的接触应力云图,看密封面上的最小接触应力是否大于介质压力,结论是合格。结果样机做出来,打到32 MPa就开始出现渗漏,…

2026/10/10 7:19:18 阅读更多 →
Flask CSRF防护实战:从攻击原理到Flask-WTF配置与排错

Flask CSRF防护实战:从攻击原理到Flask-WTF配置与排错

说起Flask项目的CSRF防护,我印象最深的是早年前接手的一个内部系统。当时系统里所有POST表单都能正常提交,直到有一次安全扫描报告出来,上面清清楚楚列着“跨站请求伪造风险”,我才意识到自己一直忽视了这一层。后来花了一个下午把…

2026/10/10 7:19:18 阅读更多 →
华为云码道 CodeArts 造了 CuiLianTu——一张报名照卡在 50KB,简历投递材料的硬性要求

华为云码道 CodeArts 造了 CuiLianTu——一张报名照卡在 50KB,简历投递材料的硬性要求

一张报名照卡在 50KB,四条路全堵死——我用华为云码道 CodeArts 造了 CuiLianTu 一键开通华为云码道 CodeArts 代码智能体:https://developer.huaweicloud.com/codeartsco.html?sourcedmzntgwatomgit1&sourceaddmzntgwatomgithd 参与方向&#xff…

2026/10/10 7:19:18 阅读更多 →
手艺人的数字突围:从被遗忘到被搜到的生存法则

手艺人的数字突围:从被遗忘到被搜到的生存法则

街边小店正在批量消失。前两年还能在巷口遇到的修鞋摊、配钥匙铺、裁缝店、家电维修点,如今正被奶茶店、外卖档口和快递驿站取代。我花了差不多两年时间,走过了十六个城市的旧城区,和超过四十位手艺人聊过天,想搞清楚一个问题&…

2026/10/10 7:19:18 阅读更多 →
DeepSeek大模型高校落地全解析:部署、智能体与避坑实践

DeepSeek大模型高校落地全解析:部署、智能体与避坑实践

简介:这份122页的PPT由厦门大学大数据教学团队出品,系统讲解DeepSeek大模型在高校教学与科研中的落地路径,适合高校师生、教育信息化工作者以及希望系统了解大模型应用的初学者。内容覆盖人工智能发展简史、人工智能思维、大模型概念与发展历…

2026/10/10 7:18:18 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →