<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>梦中世界</title><description>心之所向，如梦似幻</description><link>https://ning348.cn/</link><templateTheme>Firefly</templateTheme><templateThemeVersion>6.15.5</templateThemeVersion><templateThemeUrl>https://github.com/CuteLeaf/Firefly</templateThemeUrl><lastBuildDate>2026年8月10日 19:27:13</lastBuildDate><item><title>告别排班与调度难题：Timefold Solver 实战踩坑与性能调优心得</title><link>https://ning348.cn/posts/timefold-solver/</link><guid isPermaLink="true">https://ning348.cn/posts/timefold-solver/</guid><pubDate>Sat, 25 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在处理企业级应用时，我们经常会遇到一类让人头疼的问题：&lt;strong&gt;规划与调度（Planning and Scheduling）&lt;/strong&gt;。不管是员工排班、车辆路径规划（VRP）、还是会议室分配，这类问题在数学上通常属于 NP-Hard 问题。靠人工写 &lt;code&gt;if-else&lt;/code&gt; 和贪心算法，不仅代码难以维护，而且很难找到最优解。&lt;/p&gt;
&lt;p&gt;最近在项目中，我引入了 &lt;strong&gt;Timefold Solver&lt;/strong&gt;（OptaPlanner 的继任者），它真的是解决这类资源分配问题的“降维打击”工具。今天不仅复盘一下我的使用心得，还会深入聊聊约束分级策略，以及一个极其容易踩中的性能大坑。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;一、 核心概念：捅破窗户纸的“顿悟”时刻&lt;a href=&quot;#一-核心概念捅破窗户纸的顿悟时刻&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Timefold 的核心逻辑其实就是三个词：&lt;strong&gt;Domain（领域模型）&lt;/strong&gt;、&lt;strong&gt;Score（分数）&lt;/strong&gt; 和 &lt;strong&gt;Solver（求解器）&lt;/strong&gt;。理清以下三个角色就豁然开朗了：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Planning Entity（规划实体）&lt;/strong&gt;：业务里需要被分配的对象。比如“值班任务”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Planning Variable（规划变量）&lt;/strong&gt;：实体中需要被求解器填入的属性。比如值班任务里的“员工”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Planning Solution（规划方案）&lt;/strong&gt;：整个问题的全局视图，包含所有实体和资源，以及计算出来的总得分。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;二、 深入理解分数体系：Hard、Medium 与 Soft&lt;a href=&quot;#二-深入理解分数体系hardmedium-与-soft&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在复杂的业务场景中，非黑即白的“硬约束”和“软约束”往往不够用。Timefold 提供了多级分数机制（如 &lt;code&gt;HardMediumSoftScore&lt;/code&gt;），帮助求解器在不同的业务维度上权衡利弊。求解器的比较逻辑是&lt;strong&gt;严格向下压制&lt;/strong&gt;的：只有在 Hard 分数相同时，才会去比较 Medium 分数；Medium 相同时，再去比较 Soft 分数。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;1. Hard Score（硬约束）：不可逾越的红线&lt;a href=&quot;#1-hard-score硬约束不可逾越的红线&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;硬约束代表了物理限制、法律合规或绝对的业务底线。任何破坏硬约束的方案都是&lt;strong&gt;不可行解（Infeasible Solution）&lt;/strong&gt;。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;场景举例&lt;/strong&gt;：一个医生不能在同一时间段主刀两台手术；一辆卡车的装载量不能超过它的最大载重。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;求解器行为&lt;/strong&gt;：Solver 会拼尽全力把 Hard 分数提升到 0（或 0 以上）。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. Medium Score（中等约束）：核心业务 KPI&lt;a href=&quot;#2-medium-score中等约束核心业务-kpi&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;当我们满足了所有硬约束，得到了可行解后，往往会有多个方案摆在面前。Medium 约束通常用来衡量方案的&lt;strong&gt;核心业务价值&lt;/strong&gt;，比如总成本、总利润或整体的公平性。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;场景举例&lt;/strong&gt;：在物流配送中，所有包裹都装上车了（Hard 满足），此时需要最小化所有车辆的总行驶里程；在排班中，保证各个团队分配到的资深员工数量大致均衡。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;求解器行为&lt;/strong&gt;：在确保 Hard 分数不下降的前提下，努力优化 Medium 分数。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. Soft Score（软约束）：锦上添花的偏好&lt;a href=&quot;#3-soft-score软约束锦上添花的偏好&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这是优先级最低的约束，通常涉及用户体验或个人偏好。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;场景举例&lt;/strong&gt;：员工 A 希望周五能排早班以便提早回家；尽量把会议安排在带有白板的会议室。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;求解器行为&lt;/strong&gt;：在 Hard 和 Medium 都锁定的情况下，顺手做个人情，尽量满足这些条件。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;三、 性能避坑指南：为什么千万别用 BigDecimal 当分数？&lt;a href=&quot;#三-性能避坑指南为什么千万别用-bigdecimal-当分数&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在编写 Java 领域模型时，由于经常涉及金额（如计算超时加班费、物流成本），很多开发者会本能地使用 &lt;code&gt;BigDecimal&lt;/code&gt;，并在 Timefold 中配置对应的 &lt;code&gt;BendableBigDecimalScore&lt;/code&gt;。&lt;strong&gt;这是一个极其致命的性能陷阱！&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Timefold 的底层是一个启发式搜索殷勤，它在寻找最优解时，每秒钟需要进行数万次甚至数十万次的分数计算（Score Calculation）。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;对象创建开销&lt;/strong&gt;：&lt;code&gt;BigDecimal&lt;/code&gt; 是不可变对象。在每秒数万次的运算循环中，频繁进行加减乘除会产生海量的短生命周期对象。这会导致 Java 的垃圾回收器（GC）压力骤增，频繁触发 GC 停顿，直接将求解速度拖慢几个数量级。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;正确的优化姿势&lt;/strong&gt;：&lt;strong&gt;永远优先使用基本数据类型！&lt;/strong&gt; 采用 &lt;code&gt;int&lt;/code&gt;（对应 &lt;code&gt;HardSoftScore&lt;/code&gt;）或 &lt;code&gt;long&lt;/code&gt;（对应 &lt;code&gt;HardSoftLongScore&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;如何处理小数？&lt;/strong&gt;：使用&lt;strong&gt;整数放大法&lt;/strong&gt;。如果成本精确到分，直接把金额乘以 100 存为 &lt;code&gt;long&lt;/code&gt; 参与计算；如果需要三位小数精度，就乘以 1000。在最终向前端展示结果时，再除以对应的倍数还原即可。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;四、 给新手的几条实践建议&lt;a href=&quot;#四-给新手的几条实践建议&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;从小数据集开始验证&lt;/strong&gt;：千万不要一开始就把生产环境几万条数据扔进去跑。先搞一个极小的数据集（比如 5个任务，3个员工），验证你的 &lt;code&gt;ConstraintProvider&lt;/code&gt; 写得对不对。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;善用 ConstraintVerifier&lt;/strong&gt;：这是 Timefold 提供的单元测试工具。&lt;strong&gt;一定要为每一条约束写单元测试！&lt;/strong&gt; 否则当你有 20 条约束混合在一起时，你根本不知道为什么求解器给出了一个奇怪的结果。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;监控分数计算速度（Score Calculation Speed）&lt;/strong&gt;：观察日志，如果每秒计算次数只有几百次，说明你的约束流写得太重了，或者误用了类似 &lt;code&gt;BigDecimal&lt;/code&gt; 这样高开销的类型。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;</content:encoded></item><item><title>从爆内存到毫秒响应：回溯剪枝、启发式算法与运筹求解器选型指南</title><link>https://ning348.cn/posts/back-pruning/</link><guid isPermaLink="true">https://ning348.cn/posts/back-pruning/</guid><pubDate>Wed, 17 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在软件开发中，我们经常遇到诸如“任务调度、路径规划、装箱问题、组合优化”等复杂计算场景。很多开发者遇到这类问题，第一反应是写个递归回溯，结果数据量一上来就抛出 &lt;code&gt;StackOverflowError&lt;/code&gt; 或跑几个小时不出结果。&lt;/p&gt;
&lt;p&gt;算法选型没有“万能灵药”。本文将从&lt;strong&gt;原理对比、数据量选型、实战剪枝技巧&lt;/strong&gt;三个维度，帮助你在面对组合爆炸问题时做出最优架构选择。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;一、 三大主流求解方案对比&lt;a href=&quot;#一-三大主流求解方案对比&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在解决 NP-Hard / 组合优化问题时，通常有以下三大技术路线：&lt;/p&gt;


































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;strong&gt;维度&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;准确回溯算法 (Backtracking)&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;元启发式算法 (Heuristics/Metaheuristics)&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;专业运筹求解器 (Timefold / OR-Tools / OR-Suite)&lt;/strong&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;求解目标&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;必须找到&lt;strong&gt;全局最优解 / 绝对精确解&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;快速找到&lt;strong&gt;满意解 / 局部最优解&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;在规定时间内寻找&lt;strong&gt;尽可能最优的解&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;核心机制&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;深度优先搜索 (DFS) + 剪枝&lt;/td&gt;&lt;td&gt;贪心、遗传算法、禁忌搜索、模拟退火&lt;/td&gt;&lt;td&gt;增量计算 + 局部搜索 (Local Search) + 规则引擎&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;数据量承载&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;小规模（数十至上百）&lt;/td&gt;&lt;td&gt;中大规模（数千至数十万）&lt;/td&gt;&lt;td&gt;中大规模（复杂的约束多维问题）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;开发与维护成本&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;简单直接，但剪枝逻辑易写错&lt;/td&gt;&lt;td&gt;算法调优繁琐，容易陷入局部最优&lt;/td&gt;&lt;td&gt;建模门槛略高，但业务规则扩展极其容易&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;二、 如何根据数据量与场景进行选型？&lt;a href=&quot;#二-如何根据数据量与场景进行选型&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;决策的本质是在&lt;strong&gt;算力成本、响应时间、求解质量&lt;/strong&gt;之间做权衡。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;数据规模/复杂度评估：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├─ 小规模数据（N ≤ 20~30）──────&amp;gt; 优先选【回溯 + 极简剪枝】&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├─ 约束规则简单 + 大数据量 ───────&amp;gt; 优先选【贪心 / 局部搜索启发式算法】&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;└─ 复杂约束 + 动态业务逻辑 ──────&amp;gt; 优先选【Timefold / Google OR-Tools 等求解器】&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;section&gt;&lt;h3&gt;1. 小数据量（N ≤ 30）：首选回溯剪枝&lt;a href=&quot;#1-小数据量n--30首选回溯剪枝&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：数独求解、凑零钱问题、小规模组合搜索、权限组合穷举。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优势&lt;/strong&gt;：代码量少，零额外依赖，逻辑直观。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;风险&lt;/strong&gt;：若无有效剪枝，复杂度呈指数级 &lt;span&gt;&lt;span&gt;O(2N)O(2^N)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;O&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 或 &lt;span&gt;&lt;span&gt;O(N!)O(N!)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;O&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;N&lt;/span&gt;&lt;span&gt;!)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 爆发。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 中大规模数据 + 单一目标：选用传统启发式算法&lt;a href=&quot;#2-中大规模数据--单一目标选用传统启发式算法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：简单迷宫寻路（A* 算法）、千万级数据的降维近邻查找、简单装箱。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优势&lt;/strong&gt;：计算速度极快（通常为毫秒级），内存占用低。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;劣势&lt;/strong&gt;：一旦业务新增“临时规则”，启发式函数（Heuristic Function）需要重写，维护成本高。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 复杂业务约束 + 动态变化：首选 Timefold / OR-Tools 求解器&lt;a href=&quot;#3-复杂业务约束--动态变化首选-timefold--or-tools-求解器&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：外卖派单（VRP）、医院护士排班、工厂生产线调度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优势&lt;/strong&gt;：业务规则与求解引擎&lt;strong&gt;解耦&lt;/strong&gt;。业务人员今天加一条“A和B不能同班”，只需加一条约束规则，无需改动核心搜索算法。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;三、 实战：回溯算法如何高效“剪枝”？&lt;a href=&quot;#三-实战回溯算法如何高效剪枝&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如果你选择了回溯算法，&lt;strong&gt;剪枝（Pruning）&lt;/strong&gt; 是决定系统生死存亡的关键。剪枝的核心思想就是：&lt;strong&gt;尽早发现当前分支不可能产生有效解/最优解，并立即返回（砍掉这棵决策树的分枝）。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;常用的三大剪枝绝招：&lt;/p&gt;&lt;section&gt;&lt;h3&gt;1. 可行性剪枝（Feasibility Pruning）&lt;a href=&quot;#1-可行性剪枝feasibility-pruning&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;原理&lt;/strong&gt;：在搜索过程中，一旦发现当前状态已经违反了硬性约束，不再继续向下递归。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&gt;：在背包问题中，如果当前放入物品的总重量已经超过了背包容量限制，直接 &lt;code&gt;return&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 最优性剪枝 / 限界剪枝（Bound Pruning）&lt;a href=&quot;#2-最优性剪枝--限界剪枝bound-pruning&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;原理&lt;/strong&gt;：维护一个全局已知的“历史最优解”。如果“当前已产生的代价 + 未来理论上的最佳估计”依然比不上“历史最优解”，直接剪枝。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&gt;：求解最短路径时，如果当前路径长度已经超过了之前找到的一条可行路径的总长，后面的节点就不必再走。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 顺序剪枝与去重剪枝（Ordering &amp;amp; Deduplication）&lt;a href=&quot;#3-顺序剪枝与去重剪枝ordering--deduplication&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;原理&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;顺序优化&lt;/strong&gt;：先处理分支较少或约束最强的节点（最紧约束优先原则），可以极大地缩小整棵树的宽度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;去重&lt;/strong&gt;：遇到完全等价的状态时，跳过重复分支（通常配合 HashSet 或记忆化 Bitmask）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Java&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 剪枝伪代码模板&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;void backtrack(int level, State currentState) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 1. 可行性剪枝：非法状态直接返回&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;if (!isValid(currentState)) return;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 2. 最优性剪枝：当前花费已经不可能超越历史最佳，直接返回&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;if (currentState.cost &amp;gt;= globalBestCost) return;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 达到终止条件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;if (level == MAX_LEVEL) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;globalBestCost = Math.min(globalBestCost, currentState.cost);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;for (Option option : getSortedOptions(level)) { // 3. 顺序优化：优先尝试更有可能的选项&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;makeChoice(option);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;backtrack(level + 1, currentState);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;undoChoice(option); // 回溯恢复现场&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;四、 总结与落地方案推荐&lt;a href=&quot;#四-总结与落地方案推荐&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;不要一上来就写复杂的算法&lt;/strong&gt;：先评估数据规模。如果是小集合处理，写个带剪枝的 DFS 足以胜任。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;拒绝“硬编码”复杂规则&lt;/strong&gt;：如果排班、调度类需求中的“软硬约束”多达几十条，且频繁变更，&lt;strong&gt;果断放弃纯手写回溯&lt;/strong&gt;，直接接入 &lt;strong&gt;Timefold Solver&lt;/strong&gt; 等成熟框架。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能监控是关键&lt;/strong&gt;：对回溯算法务必设置&lt;strong&gt;最大递归深度&lt;/strong&gt;或&lt;strong&gt;超时中断机制&lt;/strong&gt;；对求解器则需要合理配置终止条件（如 &lt;code&gt;spentLimit&lt;/code&gt;）。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;选对了算法与架构，不仅能把 CPU 利用率降下来，更能让你的代码在面对业务变更时游刃有余！&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>搞懂 MySQL 临时表：会话级、事务级与常见坑点解析</title><link>https://ning348.cn/posts/mysql-temp-table/</link><guid isPermaLink="true">https://ning348.cn/posts/mysql-temp-table/</guid><pubDate>Sun, 30 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在处理复杂查询、中间数据暂存或报表生成时，MySQL 的临时表（Temporary Table）是我们经常用到的“利器”。但你真的了解它的生命周期和适用场景吗？为什么在 PostgreSQL 或 Oracle 里常见的“事务级临时表”，在 MySQL 里却不太一样？&lt;/p&gt;
&lt;p&gt;本文将带你系统梳理 MySQL 临时表的概念、分类、用法以及实践中的注意事项。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;一、 什么是 MySQL 临时表？&lt;a href=&quot;#一-什么是-mysql-临时表&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;临时表是一种特殊的数据库表，主要用于&lt;strong&gt;存储临时数据&lt;/strong&gt;。它最大的特点是&lt;strong&gt;只对当前连接（Session/会话）可见&lt;/strong&gt;，当连接断开时，临时表会被数据库自动销毁并释放空间。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;核心特性：&lt;a href=&quot;#核心特性&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;隔离性&lt;/strong&gt;：不同会话创建同名的临时表互不干扰。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;同名覆盖&lt;/strong&gt;：当前会话如果创建了与普通表同名的临时表，在此会话中普通表会被“隐匿”，所有操作作用于临时表；会话结束后，原普通表不受任何影响。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自动释放&lt;/strong&gt;：会话关闭时自动删除，无需手动 &lt;code&gt;DROP TABLE&lt;/code&gt;（但显式删除是更好的习惯）。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;二、 基础语法与使用&lt;a href=&quot;#二-基础语法与使用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;创建临时表非常简单，只需要在 &lt;code&gt;CREATE TABLE&lt;/code&gt; 中增加 &lt;code&gt;TEMPORARY&lt;/code&gt; 关键字：&lt;/p&gt;&lt;p&gt;SQL&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-- 创建内存/磁盘临时表&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;CREATE TEMPORARY TABLE tmp_user_stats (&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;user_id INT PRIMARY KEY,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;login_count INT DEFAULT 0,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;last_login_time DATETIME&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;) ENGINE=InnoDB;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-- 插入数据与普通表无异&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;INSERT INTO tmp_user_stats VALUES (1, 10, NOW());&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-- 查询数据&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;SELECT * FROM tmp_user_stats;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-- 手动删除（推荐）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;DROP TEMPORARY TABLE IF EXISTS tmp_user_stats;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;三、 会话级临时表 vs 事务级临时表&lt;a href=&quot;#三-会话级临时表-vs-事务级临时表&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;对于临时表，不同数据库（如 Oracle、PostgreSQL、MySQL）的实现机制和生命周期定义有所不同，主要分为&lt;strong&gt;会话级（Session-level）*&lt;em&gt;和*&lt;/em&gt;事务级（Transaction-level）&lt;/strong&gt;。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;1. 普通临时表（会话级临时表）&lt;a href=&quot;#1-普通临时表会话级临时表&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;MySQL 原生支持的 &lt;code&gt;CREATE TEMPORARY TABLE&lt;/code&gt; 默认属于&lt;strong&gt;会话级临时表&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;生命周期&lt;/strong&gt;：贯穿整个会话。只要会话不关闭，表和其中的数据就一直存在（除非显式删除）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跨事务性&lt;/strong&gt;：在一个事务中插入的数据，在事务提交（&lt;code&gt;COMMIT&lt;/code&gt;）后&lt;strong&gt;依然保留&lt;/strong&gt;在临时表中，可以被后续事务继续使用。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 事务级临时表（Transaction-Level Temporary Table）&lt;a href=&quot;#2-事务级临时表transaction-level-temporary-table&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;事务级临时表的作用域仅限于当前事务：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;生命周期&lt;/strong&gt;：仅在当前事务内有效。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据清理机制&lt;/strong&gt;：一旦事务提交（&lt;code&gt;COMMIT&lt;/code&gt;）或回滚（&lt;code&gt;ROLLBACK&lt;/code&gt;），临时表中的数据会自动被清空（或表结构被清理）。&lt;/li&gt;
&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;💡 &lt;strong&gt;MySQL 的情况说明&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;MySQL（包括 InnoDB 引擎）&lt;strong&gt;原生并不直接支持类似 Oracle 那样 &lt;code&gt;ON COMMIT DELETE ROWS&lt;/code&gt; 的标准事务级临时表语法&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;如果需要在 MySQL 中实现“事务级临时表”的效果，通常有以下两种替代方案：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;应用层手动维护&lt;/strong&gt;：在事务提交或回滚前，显式调用 &lt;code&gt;TRUNCATE TABLE tmp_table&lt;/code&gt; 或 &lt;code&gt;DROP TEMPORARY TABLE tmp_table&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;利用内存引擎+局部逻辑&lt;/strong&gt;：结合存储过程或事务块，在事务结束时用程序控制数据清空。&lt;/li&gt;
&lt;/ol&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;四、 内部临时表（Internal Temporary Tables）&lt;a href=&quot;#四-内部临时表internal-temporary-tables&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;除了我们用 SQL 显式创建的临时表，MySQL 执行引擎在处理特定查询时，也会&lt;strong&gt;自动在后台创建“内部临时表”&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;常见触发场景：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;包含 &lt;code&gt;GROUP BY&lt;/code&gt; 和 &lt;code&gt;ORDER BY&lt;/code&gt; 的列不一致时&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;DISTINCT&lt;/code&gt; 结合 &lt;code&gt;ORDER BY&lt;/code&gt; 时&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UNION&lt;/code&gt; 查询（非 &lt;code&gt;UNION ALL&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;子查询或复杂 Join 无法有效利用索引时&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;优化建议&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;内部临时表优先建立在内存中（Memory / TempTable 引擎），如果超过 &lt;code&gt;tmp_table_size&lt;/code&gt; 或 &lt;code&gt;max_heap_table_size&lt;/code&gt; 限制，会退化为&lt;strong&gt;磁盘临时表&lt;/strong&gt;（InnoDB / MyISAM），严重拖慢性能。在写复杂 SQL 时，应尽量通过合理索引和改写 SQL 避免触发磁盘临时表。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;五、 临时表的使用坑点与最佳实践&lt;a href=&quot;#五-临时表的使用坑点与最佳实践&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;主从复制（Replication）隐患&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;在基于语句的复制（Statement-Based Replication, SBR）模式下，临时表的操作可能导致主从不一致。现代 MySQL 建议使用基于行的复制（Row-Based Replication, RBR）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;主从切换/连接池复用&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;在短连接或高频连接池环境中，如果连接被重用且没有正确清理临时表，可能导致后续逻辑误用残余的临时表数据。建议在使用完毕后&lt;strong&gt;显式清理&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;SQL&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;DROP TEMPORARY TABLE IF EXISTS tmp_table_name;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;不能多次引用同一张临时表&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;在同一个查询（如 JOIN 或子查询）中，MySQL 不允许两次引用同一个 InnoDB/Memory 临时表，否则会报错：&lt;code&gt;Can&apos;t reopen table: &apos;tmp_table&apos;&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;六、 总结&lt;a href=&quot;#六-总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;




























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;strong&gt;临时表类型&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;生命周期&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;MySQL 是否原生支持&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;常用场景&lt;/strong&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;会话级临时表&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;当前会话建立至连接断开&lt;/td&gt;&lt;td&gt;&lt;strong&gt;是&lt;/strong&gt; (&lt;code&gt;CREATE TEMPORARY TABLE&lt;/code&gt;)&lt;/td&gt;&lt;td&gt;跨多个事务暂存中间计算结果&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;事务级临时表&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;当前事务开始至 &lt;code&gt;COMMIT&lt;/code&gt;/&lt;code&gt;ROLLBACK&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;否&lt;/strong&gt;（需手动清理或借助程序实现）&lt;/td&gt;&lt;td&gt;单个事务内的短期计算、防止数据污染&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;内部临时表&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;单条 SQL 执行期间&lt;/td&gt;&lt;td&gt;&lt;strong&gt;是&lt;/strong&gt;（由优化器自动生成）&lt;/td&gt;&lt;td&gt;&lt;code&gt;GROUP BY&lt;/code&gt;、&lt;code&gt;DISTINCT&lt;/code&gt;、&lt;code&gt;UNION&lt;/code&gt; 等&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;合理使用临时表能大大简化复杂查询的开发逻辑，但也要时刻警惕内存占用和未显式销毁带来的潜在副作用！&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>认识docker以及如何使用</title><link>https://ning348.cn/posts/docker-start/</link><guid isPermaLink="true">https://ning348.cn/posts/docker-start/</guid><pubDate>Tue, 22 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Docker是一款针对程序开发人员和系统管理员来开发、部署、运行应用的一款虚拟化平台。Docker 可以让你像使用集装箱一样快速的组合成应用，并且可以像运输标准集装箱一样，尽可能的屏蔽代码层面的差异。传统虚拟化方式是在硬件层面实现虚拟化，需要有额外的虚拟机管理应用和虚拟机操作系统层。而docker容器是在操作系统层面上实现虚拟化，直接复用本地主机操作系统，更加轻量。&lt;/p&gt;
&lt;section&gt;&lt;h1&gt;docker&lt;a href=&quot;#docker&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h3&gt;Docker Engine概述&lt;a href=&quot;#docker-engine概述&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Docker Engine是一种开源容器化技术，用于构建和容器化您的应用程序。Docker Engine通过以下方式充当客户端-服务器应用程序：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;具有长时间运行的守护进程的服务器&lt;code&gt;dockerd&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;API，用于指定程序可以用来与Docker守护程序进行对话和指示的接口。&lt;/li&gt;
&lt;li&gt;命令行界面（CLI）客户端&lt;code&gt;docker&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;为什么选择Docker？&lt;a href=&quot;#为什么选择docker&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;快速交付应用程序&lt;a href=&quot;#快速交付应用程序&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;我们希望你的开发环境能够更好的提高你的工作效率。Docker容器能够帮助开发人员、系统管理员、QA和版本控制工程师在一个生产环节中一起协同工作。我们制定了一套容器标准，而这套容器标准能够使系统管理员更改容器的时候，程序员不需要关心容器的变化，而更专注自己的应用程序代码。从而隔离开了开发和管理，简化了开发和部署的成本。&lt;/li&gt;
&lt;li&gt;我们使应用的构建方式更加简单，可以快速的迭代你的应用，并且可以可视化的来查看应用的细微更改。这能够帮助组织里边的成员来更好的理解一个应用从构建到运行的过程。&lt;/li&gt;
&lt;li&gt;Docker 是一个轻量级的容器，所以它的速度是非常快的，而容器的启动时间只需要一秒钟，从而大大的减少了开发、测试和部署的时间。轻松部署和扩展&lt;/li&gt;
&lt;li&gt;Docker 容器可以运行在大多数的环境中，你可以在桌面环境、物理主机、虚拟主机再到数据中，私有或者公有云中部署。&lt;/li&gt;
&lt;li&gt;因为 Docker 可以从多平台下运行。你可以很容器的迁移你的应用程序。如果需要，你可以非常简单的将应用程序从测试环境迁移到云，或者从云迁移到测试环境。&lt;/li&gt;
&lt;li&gt;Docker 是一个轻量级的容器，因此它可以在很短的时间内启动和关闭。当你需要的时候，你可以启动多个容器引擎，并且在不需要使用他们的时候，可以将他们全部关闭。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Docker的容器本身不需要额外创建虚拟机管理系统，因此你可以启动多套Docker容器，这样就可以充分发挥主机服务器的物理资源，也可以降低因为采购服务器licenses而带来的额外成本。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;快速构建 轻松管理&lt;a href=&quot;#快速构建-轻松管理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;因为Docker上述轻便，快速的特性。可以使您的应用达到快速迭代的目的。每次小的变更，马上就可以看到效果。而不用将若干个小变更积攒到一定程度再变更。每次变更一小部分其实是一种非常安全的方式。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;镜像&lt;a href=&quot;#镜像&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h4&gt;概念&lt;a href=&quot;#概念&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;​		镜像是一种轻量级、可执行的独立软件包，用来打包软件运行环境和基于运行环境开发的软件，它包含运行某个软件所需的所有内容，包括代码、运行时、库、环境变量和配置文件。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;加载原理&lt;a href=&quot;#加载原理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;（1）UnionFS(联合文件系统)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;UnionFS（联合文件系统）：Union文件系统是一种分层、轻量级并且高性能的文件系统，它支持对文件系统的修改作为一次提交来一层层的叠加，同时可以将不同目录挂载到同一个虚拟文件系统下，Union文件系统是Dokcer镜像的基础。镜像可以通过分层来进行继承，基于基础镜像（没有父镜像），可以制作各种具体的镜像。&lt;/p&gt;&lt;p&gt;特性：一次同时加载多个文件系统，但从外面看起来，只能看到一个文件系统，联合加载会把各层文件系统加载起来，这样最终的文件系统会包含所有的底层文件和目录。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;（2）Docker镜像加载原理&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;docker的镜像实际上是由一层一层的文件系统构成，这种层级的文件系统UnionFS。&lt;/p&gt;&lt;p&gt;主要包含bootloader和kernel，bootloader主要是引导加载kernel，Linux刚启动时会加载bootfs文件系统，在Docker镜像的最底层是bootfs。这一层与我们典型的linux/unix系统是一样的，包含boot加载器内核。当boot加载完之后整个内核就都在内存中了，此时内存的使用权已经由bootfs交给内核了，此时系统也会卸载bootfs。&lt;/p&gt;&lt;p&gt;rootfs：在 bootfs之上，包含的就是典型 Linux系统中的/dev、/proc、/bin、/etc等标准目录和文件，rootfs就是各种不同的操作系统发行版，比如：Ubuntu,、CentOS等等&lt;/p&gt;&lt;p&gt;简单理解：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;对于Docker安装OS来说：就是Docker使用了Linux本身的bootfs，只需要安装自己所需的rootfs。&lt;/li&gt;
&lt;li&gt;对于Docker安装普通镜像来说：就是Docker本身是分层下载镜像，所以可以提取出公共层镜像，进行复用。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;可以看到，新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件，就在现有镜像的基础上增加一层。为什么 Docker 镜像要采用这种分层结构呢？&lt;/p&gt;&lt;p&gt;&lt;strong&gt;最大一个好处就是——共享资源&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;比如：有多个镜像都从相同的base镜像构建而来，那么宿主机只需要在磁盘上保存一份base镜像，同时内存中也需要加载一份base镜像，就可以为所有服务器服务了。而且镜像的每一层都可以被共享。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;平时我们安装进虚拟机的CentOS都是好几个G，为什么docker这里才200M&lt;/strong&gt;？&lt;/p&gt;&lt;p&gt;对以一个精简的OS，rootfs可以很小，只需要包括最基本的命令、工具和程序库就行，因为底层直接用host和kernel，自己只需要提供rootfs就行。由此可见对于不同的Linux发行版，bootfs基本是一致的，rootfs会有差别，因此不同的发行版可以公用bootfs。&lt;/p&gt;&lt;p&gt;下图是docker下载镜像的日志，可以很清晰的看到是一层一层在下载的。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;容器命令&lt;a href=&quot;#容器命令&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h4&gt;进入容器内部：docker run -it  rongqiName/rongqiId  /bin/bash&lt;a href=&quot;#进入容器内部docker-run--it--rongqinamerongqiid--binbash&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;退出容器：exit&lt;a href=&quot;#退出容器exit&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;容器生命周期管理&lt;a href=&quot;#容器生命周期管理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;run: &lt;a href=&quot;https://www.runoob.com/docker/docker-run-command.html&quot; target=&quot;_blank&quot;&gt;https://www.runoob.com/docker/docker-run-command.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;start/stop/restart: &lt;a href=&quot;https://www.runoob.com/docker/docker-start-stop-restart-command.html&quot; target=&quot;_blank&quot;&gt;https://www.runoob.com/docker/docker-start-stop-restart-command.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;kill: &lt;a href=&quot;https://www.runoob.com/docker/docker-kill-command.html&quot; target=&quot;_blank&quot;&gt;https://www.runoob.com/docker/docker-kill-command.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;rm: &lt;a href=&quot;https://www.runoob.com/docker/docker-rm-command.html&quot; target=&quot;_blank&quot;&gt;https://www.runoob.com/docker/docker-rm-command.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;pause/unpause: &lt;a href=&quot;https://www.runoob.com/docker/docker-pause-unpause-command.html&quot; target=&quot;_blank&quot;&gt;https://www.runoob.com/docker/docker-pause-unpause-command.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;create：&lt;a href=&quot;https://www.runoob.com/docker/docker-create-command.html&quot; target=&quot;_blank&quot;&gt;https://www.runoob.com/docker/docker-create-command.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;exec：&lt;a href=&quot;https://www.runoob.com/docker/docker-exec-command.html&quot; target=&quot;_blank&quot;&gt;https://www.runoob.com/docker/docker-exec-command.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;容器操作&lt;a href=&quot;#容器操作&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;ps：&lt;a href=&quot;https://www.runoob.com/docker/docker-ps-command.html&quot; target=&quot;_blank&quot;&gt;https://www.runoob.com/docker/docker-ps-command.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;inspect：&lt;a href=&quot;https://www.runoob.com/docker/docker-inspect-command.html&quot; target=&quot;_blank&quot;&gt;https://www.runoob.com/docker/docker-inspect-command.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;top：&lt;a href=&quot;https://www.runoob.com/docker/docker-top-command.html&quot; target=&quot;_blank&quot;&gt;https://www.runoob.com/docker/docker-top-command.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;attach：&lt;a href=&quot;https://www.runoob.com/docker/docker-attach-command.html&quot; target=&quot;_blank&quot;&gt;https://www.runoob.com/docker/docker-attach-command.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;events：&lt;a href=&quot;https://www.runoob.com/docker/docker-events-command.html&quot; target=&quot;_blank&quot;&gt;https://www.runoob.com/docker/docker-events-command.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;logs：&lt;a href=&quot;https://www.runoob.com/docker/docker-logs-command.html&quot; target=&quot;_blank&quot;&gt;https://www.runoob.com/docker/docker-logs-command.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;wait：&lt;a href=&quot;https://www.runoob.com/docker/docker-wait-command.html&quot; target=&quot;_blank&quot;&gt;https://www.runoob.com/docker/docker-wait-command.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;export：&lt;a href=&quot;https://www.runoob.com/docker/docker-export-command.html&quot; target=&quot;_blank&quot;&gt;https://www.runoob.com/docker/docker-export-command.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;port：&lt;a href=&quot;https://www.runoob.com/docker/docker-port-command.html&quot; target=&quot;_blank&quot;&gt;https://www.runoob.com/docker/docker-port-command.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;容器rootfs命令&lt;a href=&quot;#容器rootfs命令&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;commit：&lt;a href=&quot;https://www.runoob.com/docker/docker-commit-command.html&quot; target=&quot;_blank&quot;&gt;https://www.runoob.com/docker/docker-commit-command.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;cp：&lt;a href=&quot;https://www.runoob.com/docker/docker-cp-command.html&quot; target=&quot;_blank&quot;&gt;https://www.runoob.com/docker/docker-cp-command.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;diff：&lt;a href=&quot;https://www.runoob.com/docker/docker-diff-command.html&quot; target=&quot;_blank&quot;&gt;https://www.runoob.com/docker/docker-diff-command.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;容器数据卷&lt;a href=&quot;#容器数据卷&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h4&gt;匿名挂载&lt;a href=&quot;#匿名挂载&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-p&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;8080:80&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;nginx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-v&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/etc/nginx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;nginx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 查看docker镜像，可以看到刚刚创建的nginx的信息&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[root@localhost ~]# docker ps&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;CONTAINER&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ID&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;IMAGE&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;COMMAND&lt;/span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;span&gt;CREATED&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;STATUS&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;PORTS&lt;/span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;span&gt;NAMES&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;942dba4d602b&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;nginx&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;&quot;/docker-entrypoint.…&quot;&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;minutes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ago&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;Up&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;minutes&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;0.0.0.0:8080&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;80/tcp&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;nginx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 查看数据卷列表，可以看到生成了一个随机名称的数据卷&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[root@localhost ~]# docker volume ls&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;DRIVER&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;VOLUME&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;NAME&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;local&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;4a1a16c05c8653f31cfbaf3d5839f69b734c81dcfb4254ef98f308d95dbe4192&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 查看该数据卷的详细信息&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[root@localhost ~]# docker volume inspect 4a1a16c05c8653f31cfbaf3d5839f69b734c81dcfb4254ef98f308d95dbe4192&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;CreatedAt&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2021-04-04T17:17:51+08:00&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;Driver&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;local&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;Labels&quot;&lt;/span&gt;&lt;span&gt;: null,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;Mountpoint&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;/var/lib/docker/volumes/4a1a16c05c8653f31cfbaf3d5839f69b734c81dcfb4254ef98f308d95dbe4192/_data&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;Name&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;4a1a16c05c8653f31cfbaf3d5839f69b734c81dcfb4254ef98f308d95dbe4192&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;Options&quot;&lt;/span&gt;&lt;span&gt;: null,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;Scope&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;local&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;具名挂载&lt;a href=&quot;#具名挂载&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-p&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;8081:80&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;nginx1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-v&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;nginx:/etc/nginx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;nginx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 查看数据卷列表，可以看到生成了一个随机名称的数据卷&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[root@localhost ~]# docker volume ls&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;DRIVER&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;VOLUME&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;NAME&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;local&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;4a1a16c05c8653f31cfbaf3d5839f69b734c81dcfb4254ef98f308d95dbe4192&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;local&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;nginx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 查看该数据卷的详细信息&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[root@localhost ~]# docker volume inspect nginx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;CreatedAt&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2021-04-04T17:19:14+08:00&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;Driver&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;local&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;Labels&quot;&lt;/span&gt;&lt;span&gt;: null,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;Mountpoint&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;/var/lib/docker/volumes/nginx/_data&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;Name&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;nginx&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;Options&quot;&lt;/span&gt;&lt;span&gt;: null,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;Scope&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;local&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;指定路径挂载&lt;a href=&quot;#指定路径挂载&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-p&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;8082:80&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;nginx2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-v&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/mydata/nginx/html:/usr/share/nginx/html&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-v&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/mydata/nginx/logs:/var/log/nginx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;nginx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;数据同步&lt;a href=&quot;#数据同步&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;—volumes-from    &lt;strong&gt;ps：因为使用的是拷贝，当一个容器删除后，另一个容器中的数据不会消失。&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;Dockerfile&lt;a href=&quot;#dockerfile&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;# 基础镜像，第一条指令必须为 FROM 指令。并且，如果在同一个Dockerfile中创建多个镜像时，可以使用多个 FROM 指令（每个镜像一次）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;MAINTAINER&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 指定维护者信息，一般是姓名 + 邮箱&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;RUN&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 镜像构建的时候需要的命令&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ADD&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 压缩文件放在当前目录下，拷过去会自动解压&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;WORKDIR&lt;/span&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;# 镜像工作目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;VOLUME&lt;/span&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;# 挂载的目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;EXPOSE&lt;/span&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;# 暴露的端口&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;CMD&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 指定容器启动时要运行的命令，如果有多个该命令，只有最后一个生效，可被替代&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ENTRYPOINT&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 指定容器启动时要运行的命令，可以追加命令&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ONBUILD&lt;/span&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;# 当构建一个被继承 DockerFile ，这个时候就会运行 ONBUILD 的指令，触发命令&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;COPY&lt;/span&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;# 类似ADD，将我们的文件拷贝到容器中，当使用本地目录为源目录时，推荐使用&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ENV&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 指定一个环境变量&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;Docker网络&lt;a href=&quot;#docker网络&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h4&gt;docker0&lt;a href=&quot;#docker0&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pull&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;348491564/sentinel-dashboard:1.8.1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-it&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-p&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;8858:8858&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sentinel1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-v&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/mydata/sentinel/logs:/root/logs&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;348491564/sentinel-dashboard:1.8.1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-it&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-p&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;8859:8858&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sentinel2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-v&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/mydata/sentinel/logs:/root/logs&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;348491564/sentinel-dashboard:1.8.1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 为容器安装ip addr命令和ping命令&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt-get&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;iproute2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[root@localhost ~]# ip addr&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lo:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mtu&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;65536&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;qdisc&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;noqueue&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;UNKNOWN&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;group&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;qlen&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;link/loopback&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;00:00:00:00:00:00&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;brd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;00:00:00:00:00:00&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;inet&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;127.0.0.1/8&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;scope&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lo&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;valid_lft&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;forever&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;preferred_lft&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;forever&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;inet6&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;::1/128&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;scope&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;valid_lft&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;forever&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;preferred_lft&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;forever&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ens33:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mtu&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1500&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;qdisc&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pfifo_fast&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;UP&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;group&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;qlen&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;link/ether&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;00:0c:29:5a:e2:81&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;brd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ff:ff:ff:ff:ff:ff&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;inet&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;192.168.1.80/24&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;brd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;192.168.1.255&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;scope&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;global&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;noprefixroute&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ens33&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;valid_lft&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;forever&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;preferred_lft&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;forever&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;inet6&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;240e:390:c66:8960:822d:8305:95bd:8188/64&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;scope&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;global&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;noprefixroute&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dynamic&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;valid_lft&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;258969sec&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;preferred_lft&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;172569sec&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;inet6&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fe80::6f0d:e285:3e9a:f34d/64&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;scope&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;noprefixroute&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;valid_lft&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;forever&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;preferred_lft&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;forever&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docker0:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mtu&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1500&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;qdisc&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;noqueue&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;UP&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;group&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;link/ether&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;02:42:05:60:0b:d4&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;brd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ff:ff:ff:ff:ff:ff&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;inet&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;172.17.0.1/16&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;brd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;172.17.255.255&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;scope&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;global&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docker0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;valid_lft&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;forever&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;preferred_lft&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;forever&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;inet6&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fe80::42:5ff:fe60:bd4/64&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;scope&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;valid_lft&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;forever&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;preferred_lft&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;forever&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;23:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;veth0a5c9e6@if22:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mtu&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1500&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;qdisc&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;noqueue&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;master&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docker0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;UP&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;group&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;link/ether&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;96:22:79:da:e1:fe&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;brd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ff:ff:ff:ff:ff:ff&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;link-netnsid&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;inet6&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fe80::9422:79ff:feda:e1fe/64&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;scope&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;valid_lft&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;forever&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;preferred_lft&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;forever&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;25:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;veth52d47f8@if24:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mtu&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1500&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;qdisc&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;noqueue&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;master&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docker0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;UP&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;group&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;link/ether&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;aa:6b:a7:71:a6:64&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;brd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ff:ff:ff:ff:ff:ff&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;link-netnsid&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;inet6&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fe80::a86b:a7ff:fe71:a664/64&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;scope&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;valid_lft&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;forever&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;preferred_lft&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;forever&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 使用容器1 ping 容器2 的ip，可以ping通&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[root@localhost ~]# docker exec -it sentinel1 ping 172.17.0.3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;PING&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;172.17.0.3&lt;/span&gt;&lt;span&gt; (172.17.0.3): 56 data bytes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;64&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;172.17.0.3:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;icmp_seq=&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ttl=&lt;/span&gt;&lt;span&gt;64&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;time=&lt;/span&gt;&lt;span&gt;0.062&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ms&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;64&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;172.17.0.3:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;icmp_seq=&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ttl=&lt;/span&gt;&lt;span&gt;64&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;time=&lt;/span&gt;&lt;span&gt;0.049&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ms&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;64&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;172.17.0.3:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;icmp_seq=&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ttl=&lt;/span&gt;&lt;span&gt;64&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;time=&lt;/span&gt;&lt;span&gt;0.048&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ms&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;64&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;172.17.0.3:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;icmp_seq=&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ttl=&lt;/span&gt;&lt;span&gt;64&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;time=&lt;/span&gt;&lt;span&gt;0.046&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ms&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;48&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 使用容器1 ping 容器2 的域名，无法找到主机&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;49&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[root@localhost ~]# docker exec -it sentinel1 ping sentinel2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;50&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ping:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;unknown&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;自定义Docker网络&lt;a href=&quot;#自定义docker网络&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[root@localhost ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-it&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-p&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;8858:8858&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sentinel1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-v&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/mydata/sentinel/logs:/root/logs&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--net&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mynet&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;348491564/sentinel-dashboard:1.8.1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-it&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-p&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;8859:8858&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sentinel2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-v&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/mydata/sentinel/logs:/root/logs&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--net&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mynet&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;348491564/sentinel-dashboard:1.8.1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[root@localhost ~]# docker exec -it sentinel1 ping sentinel2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;PING&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;4f7d49a86234&lt;/span&gt;&lt;span&gt; (192.168.0.2): 56 data bytes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;64&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;192.168.0.2:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;icmp_seq=&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ttl=&lt;/span&gt;&lt;span&gt;64&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;time=&lt;/span&gt;&lt;span&gt;0.050&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ms&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;64&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;192.168.0.2:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;icmp_seq=&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ttl=&lt;/span&gt;&lt;span&gt;64&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;time=&lt;/span&gt;&lt;span&gt;0.045&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ms&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;64&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;192.168.0.2:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;icmp_seq=&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ttl=&lt;/span&gt;&lt;span&gt;64&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;time=&lt;/span&gt;&lt;span&gt;0.046&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ms&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;64&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;192.168.0.2:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;icmp_seq=&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ttl=&lt;/span&gt;&lt;span&gt;64&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;time=&lt;/span&gt;&lt;span&gt;0.048&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ms&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;64&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;192.168.0.2:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;icmp_seq=&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ttl=&lt;/span&gt;&lt;span&gt;64&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;time=&lt;/span&gt;&lt;span&gt;0.047&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ms&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;64&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;192.168.0.2:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;icmp_seq=&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ttl=&lt;/span&gt;&lt;span&gt;64&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;time=&lt;/span&gt;&lt;span&gt;0.039&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ms&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;64&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;192.168.0.2:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;icmp_seq=&lt;/span&gt;&lt;span&gt;6&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ttl=&lt;/span&gt;&lt;span&gt;64&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;time=&lt;/span&gt;&lt;span&gt;0.062&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ms&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;Docker-compose&lt;a href=&quot;#docker-compose&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h4&gt;介绍&lt;a href=&quot;#介绍&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Docker-Compose 是 Docker 的一种编排服务，是一个用于在 Docker 上定义并运行复杂应用的工具，可以让用户在集群中部署分布式应用。通过 Docker-Compose 用户可以很容易地用一个配置文件定义一个多容器的应用，然后使用一条指令安装这个应用的所有依赖，完成构建。Docker-Compose 解决了容器与容器之间如何管理编排的问题。&lt;/p&gt;&lt;p&gt;Compose 中有两个重要的概念：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;服务 (service) ：一个应用的容器，实际上可以包括若干运行相同镜像的容器实例。&lt;/li&gt;
&lt;li&gt;项目 (project) ：由一组关联的应用容器组成的一个完整业务单元，在 docker-compose.yml 文件中定义。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;一个项目可以由多个服务（容器）关联而成，Compose 面向项目进行管理，通过子命令对项目中的一组容器进行便捷地生命周期管理。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;配置&lt;a href=&quot;#配置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 版本配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;3&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 服务配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;service1&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;service2&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 其他配置，例如：网卡配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;networks&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;net1&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;net1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;driver&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;bridge&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;net2&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;net2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;driver&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;bridge&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item></channel></rss>