<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>cmijohnson</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://cmijohnson.github.io/</id>
  <link href="https://cmijohnson.github.io/" rel="alternate"/>
  <link href="https://cmijohnson.github.io/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, cmijohnson</rights>
  <subtitle>Computing · Engineering · Research</subtitle>
  <title>cmijohnson's Blog</title>
  <updated>2026-06-26T19:43:40.497Z</updated>
  <entry>
    <author>
      <name>cmijohnson</name>
    </author>
    <category term="组成原理" scheme="https://cmijohnson.github.io/blog/categories/%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/"/>
    <category term="计算机硬件" scheme="https://cmijohnson.github.io/blog/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A1%AC%E4%BB%B6/"/>
    <content>
      <![CDATA[<h1 id="程序员数学之-IEEE754-规范（整理版）"><a href="#程序员数学之-IEEE754-规范（整理版）" class="headerlink" title="程序员数学之 IEEE754 规范（整理版）"></a>程序员数学之 IEEE754 规范（整理版）</h1><p>通用版：<a href="https://www.yuque.com/u2333-ohan5/gbpqhm/readme?singleDoc#">https://www.yuque.com/u2333-ohan5/gbpqhm/readme?singleDoc#</a></p><blockquote><p>来源：博客园 sureZ_ok《程序员数学之-IEEE754规范》。本文是学习整理版，保留核心知识点，并将图片放入 <code>images/</code> 目录，Markdown 中使用相对路径引用。</p></blockquote><h2 id="1-定点数与浮点数"><a href="#1-定点数与浮点数" class="headerlink" title="1. 定点数与浮点数"></a>1. 定点数与浮点数</h2><p>计算机表示小数主要有两类方法：<strong>定点数</strong>和<strong>浮点数</strong>。</p><p><strong>定点数（Fixed Point Number）</strong>：小数点位置固定。例如常见的 <code>Qm.n</code> 表示法，一般可以理解为：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs text">1 个符号位 + m 个整数位 + n 个小数位<br></code></pre></td></tr></table></figure><p>优点是计算速度快；缺点是表示范围较小，不适合同时表示特别大和特别小的数。</p><p><strong>浮点数（Floating Point Number）</strong>：使用类似科学计数法的形式表示小数。优点是表示范围广、精度较高；缺点是计算过程比定点数复杂。</p><h2 id="2-IEEE754-规范"><a href="#2-IEEE754-规范" class="headerlink" title="2. IEEE754 规范"></a>2. IEEE754 规范</h2><p>IEEE754 规定了常见浮点数的存储格式，例如 <code>float16</code>、<code>float32</code>、<code>float64</code>。它们都可以拆成三部分：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs text">S：符号位 Sign<br>E：阶码 / 指数 Exponent<br>M：尾数 / 小数部分 Mantissa / Fraction<br></code></pre></td></tr></table></figure><h3 id="2-1-浮点数存储格式"><a href="#2-1-浮点数存储格式" class="headerlink" title="2.1 浮点数存储格式"></a>2.1 浮点数存储格式</h3><h4 id="float16：半精度浮点数"><a href="#float16：半精度浮点数" class="headerlink" title="float16：半精度浮点数"></a>float16：半精度浮点数</h4><p><img src="https://raw.githubusercontent.com/cmijohnson/cmijohnson-imagebed/main/01_float16_layout.png" alt="float16 layout"></p><p><code>float16</code> 一共 16 bit：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs text">1 bit 符号位 + 5 bit 阶码 + 10 bit 尾数<br></code></pre></td></tr></table></figure><h4 id="float32：单精度浮点数"><a href="#float32：单精度浮点数" class="headerlink" title="float32：单精度浮点数"></a>float32：单精度浮点数</h4><p><img src="https://raw.githubusercontent.com/cmijohnson/cmijohnson-imagebed/main/02_float32_layout.png" alt="float32 layout"></p><p><code>float32</code> 一共 32 bit：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs text">1 bit 符号位 + 8 bit 阶码 + 23 bit 尾数<br></code></pre></td></tr></table></figure><h4 id="float64：双精度浮点数"><a href="#float64：双精度浮点数" class="headerlink" title="float64：双精度浮点数"></a>float64：双精度浮点数</h4><p><img src="https://raw.githubusercontent.com/cmijohnson/cmijohnson-imagebed/main/03_float64_layout.png" alt="float64 layout"></p><p><code>float64</code> 一共 64 bit：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs text">1 bit 符号位 + 11 bit 阶码 + 52 bit 尾数<br></code></pre></td></tr></table></figure><h2 id="3-规格数、非规格数与特殊数"><a href="#3-规格数、非规格数与特殊数" class="headerlink" title="3. 规格数、非规格数与特殊数"></a>3. 规格数、非规格数与特殊数</h2><p>IEEE754 主要根据阶码 <code>E</code> 的状态，把浮点数分成三类：</p><table><thead><tr><th>类型</th><th>E 的状态</th><th>M 的状态</th><th>含义</th></tr></thead><tbody><tr><td>规格数 Normal Number</td><td>E 不是全 0，也不是全 1</td><td>任意</td><td>正常表示绝大多数浮点数</td></tr><tr><td>非规格数 Subnormal Number</td><td>E 全 0</td><td>通常非 0，也可表示 0</td><td>表示 0 附近很小的数</td></tr><tr><td>特殊数 Special Number</td><td>E 全 1</td><td>M&#x3D;0 或 M≠0</td><td>表示 Infinity 或 NaN</td></tr></tbody></table><h3 id="3-1-规格数-Normal-Number"><a href="#3-1-规格数-Normal-Number" class="headerlink" title="3.1 规格数 Normal Number"></a>3.1 规格数 Normal Number</h3><p><img src="https://raw.githubusercontent.com/cmijohnson/cmijohnson-imagebed/main/04_normal_number.png" alt="normal number"></p><p>规格数的特点是：<strong>阶码 E 不为 0，也不为全 1</strong>。</p><p>它的计算公式是：</p><p><img src="https://raw.githubusercontent.com/cmijohnson/cmijohnson-imagebed/main/05_normal_formula.png" alt="normal formula"></p><p>其中 <code>bias</code> 是偏置值：</p><table><thead><tr><th>类型</th><th align="right">阶码位数</th><th align="right">bias</th></tr></thead><tbody><tr><td>float16</td><td align="right">5</td><td align="right">15</td></tr><tr><td>float32</td><td align="right">8</td><td align="right">127</td></tr><tr><td>float64</td><td align="right">11</td><td align="right">1023</td></tr></tbody></table><p>比如对于 <code>float32</code> 的 <code>-3.456</code>：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs text">符号位：负数，所以 S = 1<br>3.456 ≈ (1 + 0.728) × 2^1<br>所以 M ≈ 0.728<br>真实指数 = 1<br>存储阶码 E = 1 + 127 = 128<br></code></pre></td></tr></table></figure><p>注意：规格数不能表示 0，也不能很好地表示非常靠近 0 的数。</p><h3 id="3-2-非规格数-Subnormal-Number"><a href="#3-2-非规格数-Subnormal-Number" class="headerlink" title="3.2 非规格数 Subnormal Number"></a>3.2 非规格数 Subnormal Number</h3><p><img src="https://raw.githubusercontent.com/cmijohnson/cmijohnson-imagebed/main/07_subnormal_number.png" alt="subnormal number"></p><p>非规格数的特点是：<strong>阶码 E 全 0</strong>。它主要用于表示 0 以及非常接近 0 的小数。</p><p>它的计算公式是：</p><p><img src="https://raw.githubusercontent.com/cmijohnson/cmijohnson-imagebed/main/08_subnormal_formula.png" alt="subnormal formula"></p><p>这里要特别注意：非规格数的指数是 <code>1 - bias</code>，而不是 <code>0 - bias</code>。</p><p>规格数和非规格数在数轴上的关系大致如下：</p><p><img src="https://raw.githubusercontent.com/cmijohnson/cmijohnson-imagebed/main/06_number_axis.png" alt="number axis"></p><p>可以这样理解：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs text">规格数：负责表示“正常范围”的数<br>非规格数：负责填补 0 附近特别小的数<br>特殊数：负责表示无穷大和非法结果<br></code></pre></td></tr></table></figure><h3 id="3-3-特殊数-Special-Number"><a href="#3-3-特殊数-Special-Number" class="headerlink" title="3.3 特殊数 Special Number"></a>3.3 特殊数 Special Number</h3><p>特殊数的特点是：<strong>阶码 E 全 1</strong>。</p><h4 id="Infinity：无穷大"><a href="#Infinity：无穷大" class="headerlink" title="Infinity：无穷大"></a>Infinity：无穷大</h4><p><img src="https://raw.githubusercontent.com/cmijohnson/cmijohnson-imagebed/main/09_infinity.png" alt="infinity"></p><p>当：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs text">E 全 1，M = 0<br></code></pre></td></tr></table></figure><p>表示正无穷或负无穷。符号位 <code>S</code> 决定是 <code>+Infinity</code> 还是 <code>-Infinity</code>。</p><h4 id="NaN：非数值"><a href="#NaN：非数值" class="headerlink" title="NaN：非数值"></a>NaN：非数值</h4><p><img src="https://raw.githubusercontent.com/cmijohnson/cmijohnson-imagebed/main/10_nan.png" alt="nan"></p><p>当：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs text">E 全 1，M ≠ 0<br></code></pre></td></tr></table></figure><p>表示 <code>NaN</code>，也就是 <code>Not A Number</code>。常见于非法数学运算，比如某些情况下的 <code>0/0</code>。</p><h2 id="4-浮点数表示范围与精度"><a href="#4-浮点数表示范围与精度" class="headerlink" title="4. 浮点数表示范围与精度"></a>4. 浮点数表示范围与精度</h2><table><thead><tr><th>类型</th><th>近似表示范围</th><th>精度理解</th></tr></thead><tbody><tr><td>float16</td><td>约 <code>(-65536, 65536)</code></td><td>约 3～4 位有效数字</td></tr><tr><td>float32</td><td>约 <code>(-3.4e38, 3.4e38)</code></td><td>约 6～7 位有效数字</td></tr><tr><td>float64</td><td>约 <code>(-1.79e308, 1.79e308)</code></td><td>约 15～16 位有效数字</td></tr></tbody></table><p>这里的“精度”可以先粗略理解为：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs text">尾数位越多，小数部分能分得越细，有效数字越多。<br></code></pre></td></tr></table></figure><p>例如：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs text">float16 的尾数是 10 位，所以有效数字较少。<br>float32 的尾数是 23 位，所以有效数字更多。<br>float64 的尾数是 52 位，所以有效数字最多。<br></code></pre></td></tr></table></figure><h2 id="5-浮点数之间相互转换"><a href="#5-浮点数之间相互转换" class="headerlink" title="5. 浮点数之间相互转换"></a>5. 浮点数之间相互转换</h2><p>以 <code>float16</code> 转 <code>float32</code> 为例，本质不是简单“数值复制”，而是要按照 IEEE754 格式重新扩展：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs c"><span class="hljs-type">float16_t</span> val = <span class="hljs-number">1.5</span>;<br><span class="hljs-built_in">printf</span>(<span class="hljs-string">&quot;val = %f</span><br><span class="hljs-string">&quot;</span>, (<span class="hljs-type">float32_t</span>)val);<br></code></pre></td></tr></table></figure><p>在转换过程中，需要处理：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs text">符号位 S：从 float16 放到 float32 对应位置<br>阶码 E：从 5 位扩展为 8 位，并重新计算 bias<br>尾数 M：从 10 位扩展为 23 位，通常向高位对齐并补 0<br></code></pre></td></tr></table></figure><p>示意代码：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><code class="hljs c"><span class="hljs-type">float32_t</span> <span class="hljs-title function_">f16Tof32</span><span class="hljs-params">(<span class="hljs-type">float16_t</span> halfFloat)</span> &#123;<br>    <span class="hljs-class"><span class="hljs-keyword">union</span> &#123;</span><br>        <span class="hljs-type">uint32_t</span> Uint32;<br>        <span class="hljs-type">float32_t</span> F32;<br>    &#125; val;<br><br>    val.Uint32 = *((<span class="hljs-type">uint32_t</span> *)(&amp;halfFloat));<br><br>    <span class="hljs-comment">// S + E + M</span><br>    val.Uint32 = ((val.Uint32 &amp; <span class="hljs-number">0x8000</span>) &lt;&lt; <span class="hljs-number">16</span>) |<br>                 (((((val.Uint32 &gt;&gt; <span class="hljs-number">10</span>) &amp; <span class="hljs-number">0x1f</span>) - <span class="hljs-number">15</span> + <span class="hljs-number">127</span>) &amp; <span class="hljs-number">0xff</span>) &lt;&lt; <span class="hljs-number">23</span>) |<br>                 ((val.Uint32 &amp; <span class="hljs-number">0x03FF</span>) &lt;&lt; <span class="hljs-number">13</span>);<br><br>    <span class="hljs-keyword">return</span> val.F32;<br>&#125;<br></code></pre></td></tr></table></figure><p>这段代码的核心逻辑是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs text">float16 的 bias 是 15<br>float32 的 bias 是 127<br>所以指数部分要从 “E16 - 15” 转成 “真实指数”，再加上 127 存入 float32<br></code></pre></td></tr></table></figure><h2 id="6-快速计算-2-的指数次幂"><a href="#6-快速计算-2-的指数次幂" class="headerlink" title="6. 快速计算 2 的指数次幂"></a>6. 快速计算 2 的指数次幂</h2><p>IEEE754 的结构可以用来快速构造 <code>2^x</code>。</p><p>对于 <code>float32</code>：</p><p><img src="https://raw.githubusercontent.com/cmijohnson/cmijohnson-imagebed/main/11_power2.png" alt="power2"></p><p>因为：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs text">2^x = 1.0 × 2^x<br></code></pre></td></tr></table></figure><p>所以可以设置：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs text">S = 0<br>M = 0<br>E = x + 127<br></code></pre></td></tr></table></figure><p>示意代码：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs c"><span class="hljs-type">uint32_t</span> <span class="hljs-title function_">power2</span><span class="hljs-params">(<span class="hljs-type">uint32_t</span> x)</span> &#123;<br>    <span class="hljs-class"><span class="hljs-keyword">union</span> &#123;</span><br>        <span class="hljs-type">uint32_t</span> Uint32;<br>        <span class="hljs-type">float_t</span> F32;<br>    &#125; val;<br><br>    val.Uint32 = (<span class="hljs-number">127</span> + x) &lt;&lt; <span class="hljs-number">23</span>;<br>    <span class="hljs-keyword">return</span> (<span class="hljs-type">uint32_t</span>)val.F32;<br>&#125;<br></code></pre></td></tr></table></figure><p>同理，也可以通过读取浮点数中的阶码来快速近似计算 <code>log2</code>：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs c"><span class="hljs-type">uint32_t</span> <span class="hljs-title function_">log2</span><span class="hljs-params">(<span class="hljs-type">float_t</span> y)</span> &#123;<br>    <span class="hljs-class"><span class="hljs-keyword">union</span> &#123;</span><br>        <span class="hljs-type">uint32_t</span> Uint32;<br>        <span class="hljs-type">float_t</span> F32;<br>    &#125; val;<br><br>    val.F32 = y;<br>    <span class="hljs-keyword">return</span> ((val.Uint32) &gt;&gt; <span class="hljs-number">23</span>) - <span class="hljs-number">127</span>;<br>&#125;<br></code></pre></td></tr></table></figure><h2 id="7-考试速记版"><a href="#7-考试速记版" class="headerlink" title="7. 考试速记版"></a>7. 考试速记版</h2><h3 id="7-1-三段结构"><a href="#7-1-三段结构" class="headerlink" title="7.1 三段结构"></a>7.1 三段结构</h3><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs text">浮点数 = S + E + M<br>S：正负<br>E：数量级 / 指数<br>M：精细程度 / 有效数字<br></code></pre></td></tr></table></figure><h3 id="7-2-三种状态"><a href="#7-2-三种状态" class="headerlink" title="7.2 三种状态"></a>7.2 三种状态</h3><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs text">E 不是全 0，也不是全 1：规格数<br>E 全 0：非规格数 / 0 附近<br>E 全 1：特殊数<br></code></pre></td></tr></table></figure><h3 id="7-3-特殊数判断"><a href="#7-3-特殊数判断" class="headerlink" title="7.3 特殊数判断"></a>7.3 特殊数判断</h3><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs text">E 全 1，M = 0：Infinity<br>E 全 1，M ≠ 0：NaN<br></code></pre></td></tr></table></figure><h3 id="7-4-bias-记忆"><a href="#7-4-bias-记忆" class="headerlink" title="7.4 bias 记忆"></a>7.4 bias 记忆</h3><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs text">float16：bias = 15<br>float32：bias = 127<br>float64：bias = 1023<br></code></pre></td></tr></table></figure><h3 id="7-5-规格数公式"><a href="#7-5-规格数公式" class="headerlink" title="7.5 规格数公式"></a>7.5 规格数公式</h3><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs text">V = (-1)^S × (1.M) × 2^(E - bias)<br></code></pre></td></tr></table></figure><h3 id="7-6-非规格数公式"><a href="#7-6-非规格数公式" class="headerlink" title="7.6 非规格数公式"></a>7.6 非规格数公式</h3><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs text">V = (-1)^S × (0.M) × 2^(1 - bias)<br></code></pre></td></tr></table></figure><h2 id="8-一句话理解"><a href="#8-一句话理解" class="headerlink" title="8. 一句话理解"></a>8. 一句话理解</h2><p>IEEE754 就是在用三块信息表示一个小数：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs text">S 决定正负，E 决定大小级别，M 决定这个数在该级别里的精细位置。<br></code></pre></td></tr></table></figure>]]>
    </content>
    <id>https://cmijohnson.github.io/blog/2026/06/16/ieee754-%E8%A7%84%E8%8C%83/</id>
    <link href="https://cmijohnson.github.io/blog/2026/06/16/ieee754-%E8%A7%84%E8%8C%83/"/>
    <published>2026-06-16T11:01:18.000Z</published>
    <summary>
      <![CDATA[<h1 id="程序员数学之-IEEE754-规范（整理版）"><a href="#程序员数学之-IEEE754-规范（整理版）" class="headerlink" title="程序员数学之 IEEE754 规范（整理版）"></a>程序员数学之 IEEE754 规范（整理]]>
    </summary>
    <title>IEEE754 规范</title>
    <updated>2026-06-26T19:43:40.497Z</updated>
  </entry>
  <entry>
    <author>
      <name>cmijohnson</name>
    </author>
    <category term="基础语言" scheme="https://cmijohnson.github.io/blog/categories/%E5%9F%BA%E7%A1%80%E8%AF%AD%E8%A8%80/"/>
    <category term="Python" scheme="https://cmijohnson.github.io/blog/tags/Python/"/>
    <content>
      <![CDATA[<h1 id="Python-常见考点复习文档"><a href="#Python-常见考点复习文档" class="headerlink" title="Python 常见考点复习文档"></a>Python 常见考点复习文档</h1><blockquote><p>适合期末考试 &#x2F; 机考 &#x2F; 选择填空 &#x2F; 程序阅读 &#x2F; 编程题快速复习。<br>复习思路：<strong>先会读代码，再会改代码，最后会写常见小题。</strong></p></blockquote><hr><h2 id="0-考前总览：Python-最常考什么？"><a href="#0-考前总览：Python-最常考什么？" class="headerlink" title="0. 考前总览：Python 最常考什么？"></a>0. 考前总览：Python 最常考什么？</h2><table><thead><tr><th>模块</th><th>常见考法</th><th>重点程度</th></tr></thead><tbody><tr><td>基础语法</td><td>变量、输入输出、缩进、注释</td><td>★★★★★</td></tr><tr><td>数据类型</td><td>int、float、str、bool、list、tuple、dict、set</td><td>★★★★★</td></tr><tr><td>运算符</td><td>算术、比较、逻辑、成员、身份运算</td><td>★★★★★</td></tr><tr><td>分支循环</td><td>if、for、while、break、continue</td><td>★★★★★</td></tr><tr><td>字符串</td><td>索引、切片、常用方法、格式化输出</td><td>★★★★★</td></tr><tr><td>列表</td><td>增删改查、切片、排序、遍历</td><td>★★★★★</td></tr><tr><td>字典</td><td>键值对、遍历、统计频次</td><td>★★★★☆</td></tr><tr><td>函数</td><td>定义、参数、返回值、作用域</td><td>★★★★★</td></tr><tr><td>文件操作</td><td>open、read、write、with</td><td>★★★★☆</td></tr><tr><td>异常处理</td><td>try-except-finally</td><td>★★★☆☆</td></tr><tr><td>面向对象</td><td>类、对象、构造方法、self</td><td>★★★☆☆</td></tr><tr><td>常见算法</td><td>求和、最大最小、素数、水仙花、排序、查找</td><td>★★★★★</td></tr></tbody></table><hr><h2 id="1-Python-程序基本结构"><a href="#1-Python-程序基本结构" class="headerlink" title="1. Python 程序基本结构"></a>1. Python 程序基本结构</h2><h3 id="1-1-注释"><a href="#1-1-注释" class="headerlink" title="1.1 注释"></a>1.1 注释</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-comment"># 单行注释</span><br><br><span class="hljs-string">&#x27;&#x27;&#x27;</span><br><span class="hljs-string">多行注释</span><br><span class="hljs-string">也可以这样写</span><br><span class="hljs-string">&#x27;&#x27;&#x27;</span><br></code></pre></td></tr></table></figure><p>考试容易问：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-comment"># 这行不会执行</span><br><span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;hello&quot;</span>)  <span class="hljs-comment"># 这部分也不会执行</span><br></code></pre></td></tr></table></figure><hr><h3 id="1-2-缩进"><a href="#1-2-缩进" class="headerlink" title="1.2 缩进"></a>1.2 缩进</h3><p>Python 不用 <code>{}</code> 表示代码块，靠<strong>缩进</strong>。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">if</span> <span class="hljs-literal">True</span>:<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;进入 if&quot;</span>)<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;这一行也属于 if&quot;</span>)<br><span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;这一行不属于 if&quot;</span>)<br></code></pre></td></tr></table></figure><p>易错点：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">if</span> <span class="hljs-literal">True</span>:<br><span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;hello&quot;</span>)   <span class="hljs-comment"># 错误：没有缩进</span><br></code></pre></td></tr></table></figure><hr><h2 id="2-输入与输出"><a href="#2-输入与输出" class="headerlink" title="2. 输入与输出"></a>2. 输入与输出</h2><h2 id="2-1-print-输出"><a href="#2-1-print-输出" class="headerlink" title="2.1 print 输出"></a>2.1 print 输出</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;hello&quot;</span>)<br><span class="hljs-built_in">print</span>(<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>)<br></code></pre></td></tr></table></figure><p>输出：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs text">hello<br>1 2 3<br></code></pre></td></tr></table></figure><h3 id="print-的-sep-和-end"><a href="#print-的-sep-和-end" class="headerlink" title="print 的 sep 和 end"></a>print 的 sep 和 end</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-built_in">print</span>(<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, sep=<span class="hljs-string">&quot;-&quot;</span>)<br><span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;hello&quot;</span>, end=<span class="hljs-string">&quot; &quot;</span>)<br><span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;world&quot;</span>)<br></code></pre></td></tr></table></figure><p>输出：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs text">1-2-3<br>hello world<br></code></pre></td></tr></table></figure><p>解释：</p><table><thead><tr><th>参数</th><th>含义</th></tr></thead><tbody><tr><td><code>sep</code></td><td>多个输出内容之间用什么隔开，默认空格</td></tr><tr><td><code>end</code></td><td>一次 print 结束后用什么结尾，默认换行</td></tr></tbody></table><hr><h2 id="2-2-input-输入"><a href="#2-2-input-输入" class="headerlink" title="2.2 input 输入"></a>2.2 input 输入</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python">name = <span class="hljs-built_in">input</span>(<span class="hljs-string">&quot;请输入姓名：&quot;</span>)<br><span class="hljs-built_in">print</span>(name)<br></code></pre></td></tr></table></figure><p>重点：<code>input()</code> 输入的内容<strong>永远是字符串 str</strong>。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python">x = <span class="hljs-built_in">input</span>(<span class="hljs-string">&quot;请输入数字：&quot;</span>)<br><span class="hljs-built_in">print</span>(<span class="hljs-built_in">type</span>(x))<br></code></pre></td></tr></table></figure><p>即使输入 <code>123</code>，类型也是：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python">&lt;<span class="hljs-keyword">class</span> <span class="hljs-string">&#x27;str&#x27;</span>&gt;<br></code></pre></td></tr></table></figure><p>如果要做数学运算，要转类型：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python">a = <span class="hljs-built_in">int</span>(<span class="hljs-built_in">input</span>(<span class="hljs-string">&quot;请输入整数：&quot;</span>))<br>b = <span class="hljs-built_in">float</span>(<span class="hljs-built_in">input</span>(<span class="hljs-string">&quot;请输入小数：&quot;</span>))<br></code></pre></td></tr></table></figure><hr><h2 id="3-变量与数据类型"><a href="#3-变量与数据类型" class="headerlink" title="3. 变量与数据类型"></a>3. 变量与数据类型</h2><h2 id="3-1-常见数据类型"><a href="#3-1-常见数据类型" class="headerlink" title="3.1 常见数据类型"></a>3.1 常见数据类型</h2><table><thead><tr><th>类型</th><th>例子</th><th>说明</th></tr></thead><tbody><tr><td>int</td><td><code>10</code></td><td>整数</td></tr><tr><td>float</td><td><code>3.14</code></td><td>小数</td></tr><tr><td>str</td><td><code>&#39;abc&#39;</code>、<code>&quot;abc&quot;</code></td><td>字符串</td></tr><tr><td>bool</td><td><code>True</code>、<code>False</code></td><td>布尔值</td></tr><tr><td>list</td><td><code>[1, 2, 3]</code></td><td>列表，可修改</td></tr><tr><td>tuple</td><td><code>(1, 2, 3)</code></td><td>元组，不可修改</td></tr><tr><td>dict</td><td><code>{&quot;name&quot;: &quot;Tom&quot;}</code></td><td>字典，键值对</td></tr><tr><td>set</td><td><code>{1, 2, 3}</code></td><td>集合，去重、无序</td></tr></tbody></table><hr><h2 id="3-2-type-查看类型"><a href="#3-2-type-查看类型" class="headerlink" title="3.2 type 查看类型"></a>3.2 type 查看类型</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python">x = <span class="hljs-number">10</span><br><span class="hljs-built_in">print</span>(<span class="hljs-built_in">type</span>(x))<br></code></pre></td></tr></table></figure><p>输出：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python">&lt;<span class="hljs-keyword">class</span> <span class="hljs-string">&#x27;int&#x27;</span>&gt;<br></code></pre></td></tr></table></figure><hr><h2 id="3-3-类型转换"><a href="#3-3-类型转换" class="headerlink" title="3.3 类型转换"></a>3.3 类型转换</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-built_in">int</span>(<span class="hljs-string">&quot;123&quot;</span>)       <span class="hljs-comment"># 123</span><br><span class="hljs-built_in">float</span>(<span class="hljs-string">&quot;3.14&quot;</span>)    <span class="hljs-comment"># 3.14</span><br><span class="hljs-built_in">str</span>(<span class="hljs-number">100</span>)         <span class="hljs-comment"># &quot;100&quot;</span><br><span class="hljs-built_in">list</span>(<span class="hljs-string">&quot;abc&quot;</span>)      <span class="hljs-comment"># [&#x27;a&#x27;, &#x27;b&#x27;, &#x27;c&#x27;]</span><br></code></pre></td></tr></table></figure><p>易错：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-built_in">int</span>(<span class="hljs-string">&quot;3.14&quot;</span>)      <span class="hljs-comment"># 错，因为 &quot;3.14&quot; 不是整数形式</span><br><span class="hljs-built_in">int</span>(<span class="hljs-number">3.14</span>)        <span class="hljs-comment"># 3，小数部分直接丢掉，不是四舍五入</span><br></code></pre></td></tr></table></figure><hr><h2 id="4-运算符"><a href="#4-运算符" class="headerlink" title="4. 运算符"></a>4. 运算符</h2><h2 id="4-1-算术运算符"><a href="#4-1-算术运算符" class="headerlink" title="4.1 算术运算符"></a>4.1 算术运算符</h2><table><thead><tr><th>运算符</th><th>含义</th><th>例子</th><th>结果</th></tr></thead><tbody><tr><td><code>+</code></td><td>加</td><td><code>3 + 2</code></td><td><code>5</code></td></tr><tr><td><code>-</code></td><td>减</td><td><code>3 - 2</code></td><td><code>1</code></td></tr><tr><td><code>*</code></td><td>乘</td><td><code>3 * 2</code></td><td><code>6</code></td></tr><tr><td><code>/</code></td><td>真除法</td><td><code>5 / 2</code></td><td><code>2.5</code></td></tr><tr><td><code>//</code></td><td>整除</td><td><code>5 // 2</code></td><td><code>2</code></td></tr><tr><td><code>%</code></td><td>取余</td><td><code>5 % 2</code></td><td><code>1</code></td></tr><tr><td><code>**</code></td><td>幂运算</td><td><code>2 ** 3</code></td><td><code>8</code></td></tr></tbody></table><p>重点区别：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-built_in">print</span>(<span class="hljs-number">5</span> / <span class="hljs-number">2</span>)   <span class="hljs-comment"># 2.5</span><br><span class="hljs-built_in">print</span>(<span class="hljs-number">5</span> // <span class="hljs-number">2</span>)  <span class="hljs-comment"># 2</span><br><span class="hljs-built_in">print</span>(<span class="hljs-number">5</span> % <span class="hljs-number">2</span>)   <span class="hljs-comment"># 1</span><br></code></pre></td></tr></table></figure><hr><h2 id="4-2-比较运算符"><a href="#4-2-比较运算符" class="headerlink" title="4.2 比较运算符"></a>4.2 比较运算符</h2><table><thead><tr><th>运算符</th><th>含义</th></tr></thead><tbody><tr><td><code>&gt;</code></td><td>大于</td></tr><tr><td><code>&lt;</code></td><td>小于</td></tr><tr><td><code>&gt;=</code></td><td>大于等于</td></tr><tr><td><code>&lt;=</code></td><td>小于等于</td></tr><tr><td><code>==</code></td><td>判断是否相等</td></tr><tr><td><code>!=</code></td><td>判断是否不等</td></tr></tbody></table><p>易错点：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python">x = <span class="hljs-number">5</span>      <span class="hljs-comment"># 赋值</span><br>x == <span class="hljs-number">5</span>     <span class="hljs-comment"># 判断 x 是否等于 5</span><br></code></pre></td></tr></table></figure><hr><h2 id="4-3-逻辑运算符"><a href="#4-3-逻辑运算符" class="headerlink" title="4.3 逻辑运算符"></a>4.3 逻辑运算符</h2><table><thead><tr><th>运算符</th><th>含义</th><th>例子</th></tr></thead><tbody><tr><td><code>and</code></td><td>并且</td><td>两边都真才真</td></tr><tr><td><code>or</code></td><td>或者</td><td>有一个真就真</td></tr><tr><td><code>not</code></td><td>取反</td><td>真变假，假变真</td></tr></tbody></table><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python">age = <span class="hljs-number">20</span><br><span class="hljs-built_in">print</span>(age &gt;= <span class="hljs-number">18</span> <span class="hljs-keyword">and</span> age &lt;= <span class="hljs-number">60</span>)  <span class="hljs-comment"># True</span><br></code></pre></td></tr></table></figure><p>Python 支持连续比较：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">if</span> <span class="hljs-number">18</span> &lt;= age &lt;= <span class="hljs-number">60</span>:<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;合法年龄&quot;</span>)<br></code></pre></td></tr></table></figure><hr><h2 id="4-4-成员运算符"><a href="#4-4-成员运算符" class="headerlink" title="4.4 成员运算符"></a>4.4 成员运算符</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;a&#x27;</span> <span class="hljs-keyword">in</span> <span class="hljs-string">&#x27;abc&#x27;</span>)       <span class="hljs-comment"># True</span><br><span class="hljs-built_in">print</span>(<span class="hljs-number">4</span> <span class="hljs-keyword">in</span> [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>])     <span class="hljs-comment"># False</span><br><span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;x&#x27;</span> <span class="hljs-keyword">not</span> <span class="hljs-keyword">in</span> <span class="hljs-string">&#x27;abc&#x27;</span>)   <span class="hljs-comment"># True</span><br></code></pre></td></tr></table></figure><hr><h2 id="4-5-身份运算符"><a href="#4-5-身份运算符" class="headerlink" title="4.5 身份运算符"></a>4.5 身份运算符</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python">a <span class="hljs-keyword">is</span> b<br></code></pre></td></tr></table></figure><p>判断两个变量是否指向同一个对象。</p><p>一般考试更常用的是：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python">a == b<br></code></pre></td></tr></table></figure><p>区别：</p><table><thead><tr><th>写法</th><th>判断内容</th></tr></thead><tbody><tr><td><code>==</code></td><td>值是否相等</td></tr><tr><td><code>is</code></td><td>是否是同一个对象</td></tr></tbody></table><hr><h2 id="5-分支结构-if"><a href="#5-分支结构-if" class="headerlink" title="5. 分支结构 if"></a>5. 分支结构 if</h2><h2 id="5-1-基本格式"><a href="#5-1-基本格式" class="headerlink" title="5.1 基本格式"></a>5.1 基本格式</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs python">score = <span class="hljs-number">85</span><br><br><span class="hljs-keyword">if</span> score &gt;= <span class="hljs-number">90</span>:<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;优秀&quot;</span>)<br><span class="hljs-keyword">elif</span> score &gt;= <span class="hljs-number">60</span>:<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;及格&quot;</span>)<br><span class="hljs-keyword">else</span>:<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;不及格&quot;</span>)<br></code></pre></td></tr></table></figure><p>执行逻辑：</p><ol><li>先判断 <code>if</code></li><li>不满足再判断 <code>elif</code></li><li>都不满足才执行 <code>else</code></li></ol><hr><h2 id="5-2-常见题型：判断奇偶数"><a href="#5-2-常见题型：判断奇偶数" class="headerlink" title="5.2 常见题型：判断奇偶数"></a>5.2 常见题型：判断奇偶数</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs python">n = <span class="hljs-built_in">int</span>(<span class="hljs-built_in">input</span>(<span class="hljs-string">&quot;请输入一个整数：&quot;</span>))<br><br><span class="hljs-keyword">if</span> n % <span class="hljs-number">2</span> == <span class="hljs-number">0</span>:<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;偶数&quot;</span>)<br><span class="hljs-keyword">else</span>:<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;奇数&quot;</span>)<br></code></pre></td></tr></table></figure><hr><h2 id="5-3-常见题型：成绩等级"><a href="#5-3-常见题型：成绩等级" class="headerlink" title="5.3 常见题型：成绩等级"></a>5.3 常见题型：成绩等级</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs python">score = <span class="hljs-built_in">int</span>(<span class="hljs-built_in">input</span>(<span class="hljs-string">&quot;请输入成绩：&quot;</span>))<br><br><span class="hljs-keyword">if</span> score &gt;= <span class="hljs-number">90</span>:<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;A&quot;</span>)<br><span class="hljs-keyword">elif</span> score &gt;= <span class="hljs-number">80</span>:<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;B&quot;</span>)<br><span class="hljs-keyword">elif</span> score &gt;= <span class="hljs-number">70</span>:<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;C&quot;</span>)<br><span class="hljs-keyword">elif</span> score &gt;= <span class="hljs-number">60</span>:<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;D&quot;</span>)<br><span class="hljs-keyword">else</span>:<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;E&quot;</span>)<br></code></pre></td></tr></table></figure><p>注意：顺序不能乱。<br>如果先写 <code>score &gt;= 60</code>，那么 95 分也会被归到及格。</p><hr><h2 id="6-循环结构"><a href="#6-循环结构" class="headerlink" title="6. 循环结构"></a>6. 循环结构</h2><h2 id="6-1-for-循环"><a href="#6-1-for-循环" class="headerlink" title="6.1 for 循环"></a>6.1 for 循环</h2><p>适合：知道循环次数，或者遍历序列。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">5</span>):<br>    <span class="hljs-built_in">print</span>(i)<br></code></pre></td></tr></table></figure><p>输出：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs text">0<br>1<br>2<br>3<br>4<br></code></pre></td></tr></table></figure><hr><h2 id="6-2-range-函数"><a href="#6-2-range-函数" class="headerlink" title="6.2 range 函数"></a>6.2 range 函数</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-built_in">range</span>(stop)<br><span class="hljs-built_in">range</span>(start, stop)<br><span class="hljs-built_in">range</span>(start, stop, step)<br></code></pre></td></tr></table></figure><p>例子：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-built_in">list</span>(<span class="hljs-built_in">range</span>(<span class="hljs-number">5</span>))          <span class="hljs-comment"># [0, 1, 2, 3, 4]</span><br><span class="hljs-built_in">list</span>(<span class="hljs-built_in">range</span>(<span class="hljs-number">1</span>, <span class="hljs-number">5</span>))       <span class="hljs-comment"># [1, 2, 3, 4]</span><br><span class="hljs-built_in">list</span>(<span class="hljs-built_in">range</span>(<span class="hljs-number">1</span>, <span class="hljs-number">10</span>, <span class="hljs-number">2</span>))   <span class="hljs-comment"># [1, 3, 5, 7, 9]</span><br><span class="hljs-built_in">list</span>(<span class="hljs-built_in">range</span>(<span class="hljs-number">10</span>, <span class="hljs-number">1</span>, -<span class="hljs-number">2</span>))  <span class="hljs-comment"># [10, 8, 6, 4, 2]</span><br></code></pre></td></tr></table></figure><p>重点：<code>range</code> 左闭右开，包含左边，不包含右边。</p><hr><h2 id="6-3-while-循环"><a href="#6-3-while-循环" class="headerlink" title="6.3 while 循环"></a>6.3 while 循环</h2><p>适合：不知道循环次数，只知道循环条件。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs python">i = <span class="hljs-number">1</span><br><span class="hljs-keyword">while</span> i &lt;= <span class="hljs-number">5</span>:<br>    <span class="hljs-built_in">print</span>(i)<br>    i += <span class="hljs-number">1</span><br></code></pre></td></tr></table></figure><hr><h2 id="6-4-break-和-continue"><a href="#6-4-break-和-continue" class="headerlink" title="6.4 break 和 continue"></a>6.4 break 和 continue</h2><h3 id="break：直接结束整个循环"><a href="#break：直接结束整个循环" class="headerlink" title="break：直接结束整个循环"></a>break：直接结束整个循环</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">1</span>, <span class="hljs-number">6</span>):<br>    <span class="hljs-keyword">if</span> i == <span class="hljs-number">3</span>:<br>        <span class="hljs-keyword">break</span><br>    <span class="hljs-built_in">print</span>(i)<br></code></pre></td></tr></table></figure><p>输出：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs text">1<br>2<br></code></pre></td></tr></table></figure><h3 id="continue：跳过本轮，继续下一轮"><a href="#continue：跳过本轮，继续下一轮" class="headerlink" title="continue：跳过本轮，继续下一轮"></a>continue：跳过本轮，继续下一轮</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">1</span>, <span class="hljs-number">6</span>):<br>    <span class="hljs-keyword">if</span> i == <span class="hljs-number">3</span>:<br>        <span class="hljs-keyword">continue</span><br>    <span class="hljs-built_in">print</span>(i)<br></code></pre></td></tr></table></figure><p>输出：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs text">1<br>2<br>4<br>5<br></code></pre></td></tr></table></figure><hr><h2 id="6-5-常见题型：求-1-到-n-的和"><a href="#6-5-常见题型：求-1-到-n-的和" class="headerlink" title="6.5 常见题型：求 1 到 n 的和"></a>6.5 常见题型：求 1 到 n 的和</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs python">n = <span class="hljs-built_in">int</span>(<span class="hljs-built_in">input</span>(<span class="hljs-string">&quot;请输入 n：&quot;</span>))<br>s = <span class="hljs-number">0</span><br><br><span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">1</span>, n + <span class="hljs-number">1</span>):<br>    s += i<br><br><span class="hljs-built_in">print</span>(s)<br></code></pre></td></tr></table></figure><hr><h2 id="6-6-常见题型：求-1-到-n-的偶数和"><a href="#6-6-常见题型：求-1-到-n-的偶数和" class="headerlink" title="6.6 常见题型：求 1 到 n 的偶数和"></a>6.6 常见题型：求 1 到 n 的偶数和</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs python">n = <span class="hljs-built_in">int</span>(<span class="hljs-built_in">input</span>(<span class="hljs-string">&quot;请输入 n：&quot;</span>))<br>s = <span class="hljs-number">0</span><br><br><span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">1</span>, n + <span class="hljs-number">1</span>):<br>    <span class="hljs-keyword">if</span> i % <span class="hljs-number">2</span> == <span class="hljs-number">0</span>:<br>        s += i<br><br><span class="hljs-built_in">print</span>(s)<br></code></pre></td></tr></table></figure><hr><h2 id="7-字符串-str"><a href="#7-字符串-str" class="headerlink" title="7. 字符串 str"></a>7. 字符串 str</h2><h2 id="7-1-字符串定义"><a href="#7-1-字符串定义" class="headerlink" title="7.1 字符串定义"></a>7.1 字符串定义</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs python">s1 = <span class="hljs-string">&#x27;hello&#x27;</span><br>s2 = <span class="hljs-string">&quot;hello&quot;</span><br>s3 = <span class="hljs-string">&#x27;&#x27;&#x27;hello&#x27;&#x27;&#x27;</span><br></code></pre></td></tr></table></figure><hr><h2 id="7-2-索引"><a href="#7-2-索引" class="headerlink" title="7.2 索引"></a>7.2 索引</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs python">s = <span class="hljs-string">&quot;python&quot;</span><br><span class="hljs-built_in">print</span>(s[<span class="hljs-number">0</span>])   <span class="hljs-comment"># p</span><br><span class="hljs-built_in">print</span>(s[<span class="hljs-number">1</span>])   <span class="hljs-comment"># y</span><br><span class="hljs-built_in">print</span>(s[-<span class="hljs-number">1</span>])  <span class="hljs-comment"># n</span><br><span class="hljs-built_in">print</span>(s[-<span class="hljs-number">2</span>])  <span class="hljs-comment"># o</span><br></code></pre></td></tr></table></figure><p>理解：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs text">正向索引： 0   1   2   3   4   5<br>字符：     p   y   t   h   o   n<br>反向索引：-6  -5  -4  -3  -2  -1<br></code></pre></td></tr></table></figure><hr><h2 id="7-3-切片"><a href="#7-3-切片" class="headerlink" title="7.3 切片"></a>7.3 切片</h2><p>格式：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python">字符串[开始:结束:步长]<br></code></pre></td></tr></table></figure><p>重点：切片也是左闭右开。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs python">s = <span class="hljs-string">&quot;python&quot;</span><br><br><span class="hljs-built_in">print</span>(s[<span class="hljs-number">0</span>:<span class="hljs-number">2</span>])    <span class="hljs-comment"># py</span><br><span class="hljs-built_in">print</span>(s[<span class="hljs-number">1</span>:<span class="hljs-number">4</span>])    <span class="hljs-comment"># yth</span><br><span class="hljs-built_in">print</span>(s[:<span class="hljs-number">3</span>])     <span class="hljs-comment"># pyt</span><br><span class="hljs-built_in">print</span>(s[<span class="hljs-number">3</span>:])     <span class="hljs-comment"># hon</span><br><span class="hljs-built_in">print</span>(s[::-<span class="hljs-number">1</span>])   <span class="hljs-comment"># nohtyp，字符串反转</span><br></code></pre></td></tr></table></figure><hr><h2 id="7-4-字符串常用方法"><a href="#7-4-字符串常用方法" class="headerlink" title="7.4 字符串常用方法"></a>7.4 字符串常用方法</h2><table><thead><tr><th>方法</th><th>作用</th><th>例子</th></tr></thead><tbody><tr><td><code>len(s)</code></td><td>求长度</td><td><code>len(&quot;abc&quot;)</code> 得 3</td></tr><tr><td><code>s.upper()</code></td><td>转大写</td><td><code>&quot;abc&quot;.upper()</code></td></tr><tr><td><code>s.lower()</code></td><td>转小写</td><td><code>&quot;ABC&quot;.lower()</code></td></tr><tr><td><code>s.strip()</code></td><td>去掉两边空白</td><td><code>&quot; hi &quot;.strip()</code></td></tr><tr><td><code>s.replace(a,b)</code></td><td>替换</td><td><code>&quot;abc&quot;.replace(&quot;a&quot;, &quot;x&quot;)</code></td></tr><tr><td><code>s.split()</code></td><td>分割</td><td><code>&quot;a b c&quot;.split()</code></td></tr><tr><td><code>&quot;-&quot;.join(list)</code></td><td>拼接</td><td><code>&quot;-&quot;.join([&quot;a&quot;, &quot;b&quot;])</code></td></tr><tr><td><code>s.find(x)</code></td><td>查找位置，找不到返回 -1</td><td><code>&quot;abc&quot;.find(&quot;b&quot;)</code></td></tr><tr><td><code>s.count(x)</code></td><td>统计次数</td><td><code>&quot;banana&quot;.count(&quot;a&quot;)</code></td></tr></tbody></table><hr><h2 id="7-5-字符串不可变"><a href="#7-5-字符串不可变" class="headerlink" title="7.5 字符串不可变"></a>7.5 字符串不可变</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python">s = <span class="hljs-string">&quot;abc&quot;</span><br>s[<span class="hljs-number">0</span>] = <span class="hljs-string">&quot;x&quot;</span>   <span class="hljs-comment"># 错误</span><br></code></pre></td></tr></table></figure><p>如果要改，只能生成新字符串：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs python">s = <span class="hljs-string">&quot;abc&quot;</span><br>s = <span class="hljs-string">&quot;x&quot;</span> + s[<span class="hljs-number">1</span>:]<br><span class="hljs-built_in">print</span>(s)  <span class="hljs-comment"># xbc</span><br></code></pre></td></tr></table></figure><hr><h2 id="8-列表-list"><a href="#8-列表-list" class="headerlink" title="8. 列表 list"></a>8. 列表 list</h2><h2 id="8-1-定义列表"><a href="#8-1-定义列表" class="headerlink" title="8.1 定义列表"></a>8.1 定义列表</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs python">nums = [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">4</span>]<br>names = [<span class="hljs-string">&quot;Tom&quot;</span>, <span class="hljs-string">&quot;Jerry&quot;</span>]<br>mix = [<span class="hljs-number">1</span>, <span class="hljs-string">&quot;a&quot;</span>, <span class="hljs-number">3.14</span>]<br></code></pre></td></tr></table></figure><p>列表特点：</p><ol><li>有顺序</li><li>可重复</li><li>可修改</li></ol><hr><h2 id="8-2-列表索引和切片"><a href="#8-2-列表索引和切片" class="headerlink" title="8.2 列表索引和切片"></a>8.2 列表索引和切片</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs python">lst = [<span class="hljs-number">10</span>, <span class="hljs-number">20</span>, <span class="hljs-number">30</span>, <span class="hljs-number">40</span>]<br><br><span class="hljs-built_in">print</span>(lst[<span class="hljs-number">0</span>])     <span class="hljs-comment"># 10</span><br><span class="hljs-built_in">print</span>(lst[-<span class="hljs-number">1</span>])    <span class="hljs-comment"># 40</span><br><span class="hljs-built_in">print</span>(lst[<span class="hljs-number">1</span>:<span class="hljs-number">3</span>])   <span class="hljs-comment"># [20, 30]</span><br></code></pre></td></tr></table></figure><hr><h2 id="8-3-增删改查"><a href="#8-3-增删改查" class="headerlink" title="8.3 增删改查"></a>8.3 增删改查</h2><h3 id="增加元素"><a href="#增加元素" class="headerlink" title="增加元素"></a>增加元素</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs python">lst = [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>]<br>lst.append(<span class="hljs-number">4</span>)       <span class="hljs-comment"># 末尾加 4</span><br>lst.insert(<span class="hljs-number">1</span>, <span class="hljs-number">99</span>)   <span class="hljs-comment"># 在下标 1 的位置插入 99</span><br><span class="hljs-built_in">print</span>(lst)<br></code></pre></td></tr></table></figure><h3 id="删除元素"><a href="#删除元素" class="headerlink" title="删除元素"></a>删除元素</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs python">lst = [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">2</span>]<br><br>lst.remove(<span class="hljs-number">2</span>)   <span class="hljs-comment"># 删除第一个 2</span><br>x = lst.pop()   <span class="hljs-comment"># 删除并返回最后一个元素</span><br>lst.clear()     <span class="hljs-comment"># 清空列表</span><br></code></pre></td></tr></table></figure><h3 id="修改元素"><a href="#修改元素" class="headerlink" title="修改元素"></a>修改元素</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs python">lst = [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>]<br>lst[<span class="hljs-number">0</span>] = <span class="hljs-number">100</span><br><span class="hljs-built_in">print</span>(lst)  <span class="hljs-comment"># [100, 2, 3]</span><br></code></pre></td></tr></table></figure><h3 id="查找元素"><a href="#查找元素" class="headerlink" title="查找元素"></a>查找元素</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs python">lst = [<span class="hljs-number">10</span>, <span class="hljs-number">20</span>, <span class="hljs-number">30</span>]<br><span class="hljs-built_in">print</span>(<span class="hljs-number">20</span> <span class="hljs-keyword">in</span> lst)       <span class="hljs-comment"># True</span><br><span class="hljs-built_in">print</span>(lst.index(<span class="hljs-number">20</span>))   <span class="hljs-comment"># 1</span><br></code></pre></td></tr></table></figure><hr><h2 id="8-4-列表排序"><a href="#8-4-列表排序" class="headerlink" title="8.4 列表排序"></a>8.4 列表排序</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs python">lst = [<span class="hljs-number">3</span>, <span class="hljs-number">1</span>, <span class="hljs-number">4</span>, <span class="hljs-number">2</span>]<br>lst.sort()<br><span class="hljs-built_in">print</span>(lst)   <span class="hljs-comment"># [1, 2, 3, 4]</span><br></code></pre></td></tr></table></figure><p>降序：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python">lst.sort(reverse=<span class="hljs-literal">True</span>)<br><span class="hljs-built_in">print</span>(lst)   <span class="hljs-comment"># [4, 3, 2, 1]</span><br></code></pre></td></tr></table></figure><p><code>sorted()</code> 不改变原列表，返回新列表：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs python">lst = [<span class="hljs-number">3</span>, <span class="hljs-number">1</span>, <span class="hljs-number">4</span>, <span class="hljs-number">2</span>]<br>new_lst = <span class="hljs-built_in">sorted</span>(lst)<br><span class="hljs-built_in">print</span>(lst)      <span class="hljs-comment"># [3, 1, 4, 2]</span><br><span class="hljs-built_in">print</span>(new_lst)  <span class="hljs-comment"># [1, 2, 3, 4]</span><br></code></pre></td></tr></table></figure><p>区别：</p><table><thead><tr><th>写法</th><th>是否改变原列表</th><th>返回值</th></tr></thead><tbody><tr><td><code>lst.sort()</code></td><td>改变</td><td><code>None</code></td></tr><tr><td><code>sorted(lst)</code></td><td>不改变</td><td>新列表</td></tr></tbody></table><hr><h2 id="8-5-遍历列表"><a href="#8-5-遍历列表" class="headerlink" title="8.5 遍历列表"></a>8.5 遍历列表</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs python">lst = [<span class="hljs-number">10</span>, <span class="hljs-number">20</span>, <span class="hljs-number">30</span>]<br><br><span class="hljs-keyword">for</span> x <span class="hljs-keyword">in</span> lst:<br>    <span class="hljs-built_in">print</span>(x)<br></code></pre></td></tr></table></figure><p>如果需要下标：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs python">lst = [<span class="hljs-number">10</span>, <span class="hljs-number">20</span>, <span class="hljs-number">30</span>]<br><br><span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-built_in">len</span>(lst)):<br>    <span class="hljs-built_in">print</span>(i, lst[i])<br></code></pre></td></tr></table></figure><p>更推荐：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">for</span> i, x <span class="hljs-keyword">in</span> <span class="hljs-built_in">enumerate</span>(lst):<br>    <span class="hljs-built_in">print</span>(i, x)<br></code></pre></td></tr></table></figure><hr><h2 id="8-6-列表推导式"><a href="#8-6-列表推导式" class="headerlink" title="8.6 列表推导式"></a>8.6 列表推导式</h2><p>普通写法：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs python">lst = []<br><span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">1</span>, <span class="hljs-number">6</span>):<br>    lst.append(i * i)<br></code></pre></td></tr></table></figure><p>推导式写法：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python">lst = [i * i <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">1</span>, <span class="hljs-number">6</span>)]<br><span class="hljs-built_in">print</span>(lst)  <span class="hljs-comment"># [1, 4, 9, 16, 25]</span><br></code></pre></td></tr></table></figure><p>带条件：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python">lst = [i <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">1</span>, <span class="hljs-number">11</span>) <span class="hljs-keyword">if</span> i % <span class="hljs-number">2</span> == <span class="hljs-number">0</span>]<br><span class="hljs-built_in">print</span>(lst)  <span class="hljs-comment"># [2, 4, 6, 8, 10]</span><br></code></pre></td></tr></table></figure><hr><h2 id="9-元组-tuple"><a href="#9-元组-tuple" class="headerlink" title="9. 元组 tuple"></a>9. 元组 tuple</h2><p>元组和列表很像，但元组<strong>不可修改</strong>。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python">t = (<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>)<br><span class="hljs-built_in">print</span>(t[<span class="hljs-number">0</span>])<br></code></pre></td></tr></table></figure><p>错误写法：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python">t[<span class="hljs-number">0</span>] = <span class="hljs-number">100</span>   <span class="hljs-comment"># 错误，元组不可变</span><br></code></pre></td></tr></table></figure><p>只有一个元素的元组：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python">t = (<span class="hljs-number">1</span>,)<br></code></pre></td></tr></table></figure><p>注意：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python">t = (<span class="hljs-number">1</span>)<br><span class="hljs-built_in">print</span>(<span class="hljs-built_in">type</span>(t))  <span class="hljs-comment"># int，不是 tuple</span><br></code></pre></td></tr></table></figure><hr><h2 id="10-字典-dict"><a href="#10-字典-dict" class="headerlink" title="10. 字典 dict"></a>10. 字典 dict</h2><h2 id="10-1-字典定义"><a href="#10-1-字典定义" class="headerlink" title="10.1 字典定义"></a>10.1 字典定义</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs python">student = &#123;<br>    <span class="hljs-string">&quot;name&quot;</span>: <span class="hljs-string">&quot;Tom&quot;</span>,<br>    <span class="hljs-string">&quot;age&quot;</span>: <span class="hljs-number">18</span>,<br>    <span class="hljs-string">&quot;score&quot;</span>: <span class="hljs-number">90</span><br>&#125;<br></code></pre></td></tr></table></figure><p>字典特点：</p><ol><li>用键值对保存数据</li><li>键不能重复</li><li>通过键取值</li></ol><hr><h2 id="10-2-字典取值"><a href="#10-2-字典取值" class="headerlink" title="10.2 字典取值"></a>10.2 字典取值</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs python">student = &#123;<span class="hljs-string">&quot;name&quot;</span>: <span class="hljs-string">&quot;Tom&quot;</span>, <span class="hljs-string">&quot;age&quot;</span>: <span class="hljs-number">18</span>&#125;<br><br><span class="hljs-built_in">print</span>(student[<span class="hljs-string">&quot;name&quot;</span>])<br><span class="hljs-built_in">print</span>(student.get(<span class="hljs-string">&quot;name&quot;</span>))<br></code></pre></td></tr></table></figure><p>区别：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python">student[<span class="hljs-string">&quot;sex&quot;</span>]       <span class="hljs-comment"># 键不存在会报错</span><br>student.get(<span class="hljs-string">&quot;sex&quot;</span>)   <span class="hljs-comment"># 键不存在返回 None</span><br></code></pre></td></tr></table></figure><p>也可以设置默认值：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python">student.get(<span class="hljs-string">&quot;sex&quot;</span>, <span class="hljs-string">&quot;未知&quot;</span>)<br></code></pre></td></tr></table></figure><hr><h2 id="10-3-字典增删改"><a href="#10-3-字典增删改" class="headerlink" title="10.3 字典增删改"></a>10.3 字典增删改</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs python">student = &#123;<span class="hljs-string">&quot;name&quot;</span>: <span class="hljs-string">&quot;Tom&quot;</span>, <span class="hljs-string">&quot;age&quot;</span>: <span class="hljs-number">18</span>&#125;<br><br>student[<span class="hljs-string">&quot;score&quot;</span>] = <span class="hljs-number">90</span>     <span class="hljs-comment"># 新增</span><br>student[<span class="hljs-string">&quot;age&quot;</span>] = <span class="hljs-number">20</span>       <span class="hljs-comment"># 修改</span><br><span class="hljs-keyword">del</span> student[<span class="hljs-string">&quot;name&quot;</span>]       <span class="hljs-comment"># 删除</span><br></code></pre></td></tr></table></figure><hr><h2 id="10-4-遍历字典"><a href="#10-4-遍历字典" class="headerlink" title="10.4 遍历字典"></a>10.4 遍历字典</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs python">student = &#123;<span class="hljs-string">&quot;name&quot;</span>: <span class="hljs-string">&quot;Tom&quot;</span>, <span class="hljs-string">&quot;age&quot;</span>: <span class="hljs-number">18</span>&#125;<br><br><span class="hljs-keyword">for</span> key <span class="hljs-keyword">in</span> student:<br>    <span class="hljs-built_in">print</span>(key, student[key])<br></code></pre></td></tr></table></figure><p>更常见：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">for</span> key, value <span class="hljs-keyword">in</span> student.items():<br>    <span class="hljs-built_in">print</span>(key, value)<br></code></pre></td></tr></table></figure><p>只遍历键：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">for</span> key <span class="hljs-keyword">in</span> student.keys():<br>    <span class="hljs-built_in">print</span>(key)<br></code></pre></td></tr></table></figure><p>只遍历值：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">for</span> value <span class="hljs-keyword">in</span> student.values():<br>    <span class="hljs-built_in">print</span>(value)<br></code></pre></td></tr></table></figure><hr><h2 id="10-5-高频题：统计字符出现次数"><a href="#10-5-高频题：统计字符出现次数" class="headerlink" title="10.5 高频题：统计字符出现次数"></a>10.5 高频题：统计字符出现次数</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs python">s = <span class="hljs-string">&quot;banana&quot;</span><br>d = &#123;&#125;<br><br><span class="hljs-keyword">for</span> ch <span class="hljs-keyword">in</span> s:<br>    d[ch] = d.get(ch, <span class="hljs-number">0</span>) + <span class="hljs-number">1</span><br><br><span class="hljs-built_in">print</span>(d)<br></code></pre></td></tr></table></figure><p>输出：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python">&#123;<span class="hljs-string">&#x27;b&#x27;</span>: <span class="hljs-number">1</span>, <span class="hljs-string">&#x27;a&#x27;</span>: <span class="hljs-number">3</span>, <span class="hljs-string">&#x27;n&#x27;</span>: <span class="hljs-number">2</span>&#125;<br></code></pre></td></tr></table></figure><p>核心套路：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python">d[x] = d.get(x, <span class="hljs-number">0</span>) + <span class="hljs-number">1</span><br></code></pre></td></tr></table></figure><p>意思是：</p><ol><li>如果 x 以前出现过，就取原来的次数</li><li>如果没出现过，就按 0 处理</li><li>然后次数加 1</li></ol><hr><h2 id="11-集合-set"><a href="#11-集合-set" class="headerlink" title="11. 集合 set"></a>11. 集合 set</h2><p>集合特点：</p><ol><li>无序</li><li>不重复</li><li>常用于去重</li></ol><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python">s = &#123;<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">3</span>, <span class="hljs-number">3</span>&#125;<br><span class="hljs-built_in">print</span>(s)  <span class="hljs-comment"># &#123;1, 2, 3&#125;</span><br></code></pre></td></tr></table></figure><p>列表去重：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs python">lst = [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">3</span>, <span class="hljs-number">3</span>]<br>lst = <span class="hljs-built_in">list</span>(<span class="hljs-built_in">set</span>(lst))<br><span class="hljs-built_in">print</span>(lst)<br></code></pre></td></tr></table></figure><p>注意：集合没有下标。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python">s = &#123;<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>&#125;<br><span class="hljs-comment"># s[0]  错误</span><br></code></pre></td></tr></table></figure><hr><h2 id="12-函数"><a href="#12-函数" class="headerlink" title="12. 函数"></a>12. 函数</h2><h2 id="12-1-函数定义"><a href="#12-1-函数定义" class="headerlink" title="12.1 函数定义"></a>12.1 函数定义</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">函数名</span>(<span class="hljs-params">参数</span>):<br>    函数体<br>    <span class="hljs-keyword">return</span> 返回值<br></code></pre></td></tr></table></figure><p>例子：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">add</span>(<span class="hljs-params">a, b</span>):<br>    <span class="hljs-keyword">return</span> a + b<br><br>result = add(<span class="hljs-number">3</span>, <span class="hljs-number">5</span>)<br><span class="hljs-built_in">print</span>(result)<br></code></pre></td></tr></table></figure><hr><h2 id="12-2-return-的作用"><a href="#12-2-return-的作用" class="headerlink" title="12.2 return 的作用"></a>12.2 return 的作用</h2><p><code>return</code> 表示：</p><ol><li>返回结果</li><li>结束函数</li></ol><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">test</span>():<br>    <span class="hljs-keyword">return</span> <span class="hljs-number">1</span><br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;hello&quot;</span>)  <span class="hljs-comment"># 不会执行</span><br></code></pre></td></tr></table></figure><hr><h2 id="12-3-没有-return-的函数"><a href="#12-3-没有-return-的函数" class="headerlink" title="12.3 没有 return 的函数"></a>12.3 没有 return 的函数</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">hello</span>():<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;hello&quot;</span>)<br><br>x = hello()<br><span class="hljs-built_in">print</span>(x)<br></code></pre></td></tr></table></figure><p>输出：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs text">hello<br>None<br></code></pre></td></tr></table></figure><p>如果函数没有 <code>return</code>，默认返回 <code>None</code>。</p><hr><h2 id="12-4-参数类型"><a href="#12-4-参数类型" class="headerlink" title="12.4 参数类型"></a>12.4 参数类型</h2><h3 id="位置参数"><a href="#位置参数" class="headerlink" title="位置参数"></a>位置参数</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">add</span>(<span class="hljs-params">a, b</span>):<br>    <span class="hljs-keyword">return</span> a + b<br><br>add(<span class="hljs-number">1</span>, <span class="hljs-number">2</span>)<br></code></pre></td></tr></table></figure><h3 id="默认参数"><a href="#默认参数" class="headerlink" title="默认参数"></a>默认参数</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">greet</span>(<span class="hljs-params">name=<span class="hljs-string">&quot;同学&quot;</span></span>):<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;你好&quot;</span>, name)<br><br>greet()<br>greet(<span class="hljs-string">&quot;Tom&quot;</span>)<br></code></pre></td></tr></table></figure><h3 id="关键字参数"><a href="#关键字参数" class="headerlink" title="关键字参数"></a>关键字参数</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">info</span>(<span class="hljs-params">name, age</span>):<br>    <span class="hljs-built_in">print</span>(name, age)<br><br>info(age=<span class="hljs-number">18</span>, name=<span class="hljs-string">&quot;Tom&quot;</span>)<br></code></pre></td></tr></table></figure><hr><h2 id="12-5-局部变量和全局变量"><a href="#12-5-局部变量和全局变量" class="headerlink" title="12.5 局部变量和全局变量"></a>12.5 局部变量和全局变量</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs python">x = <span class="hljs-number">10</span><br><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">f</span>():<br>    x = <span class="hljs-number">20</span><br>    <span class="hljs-built_in">print</span>(x)<br><br>f()        <span class="hljs-comment"># 20</span><br><span class="hljs-built_in">print</span>(x)   <span class="hljs-comment"># 10</span><br></code></pre></td></tr></table></figure><p>函数内部的 <code>x</code> 是局部变量，不影响外面的 <code>x</code>。</p><p>如果一定要在函数里改全局变量：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs python">x = <span class="hljs-number">10</span><br><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">f</span>():<br>    <span class="hljs-keyword">global</span> x<br>    x = <span class="hljs-number">20</span><br><br>f()<br><span class="hljs-built_in">print</span>(x)  <span class="hljs-comment"># 20</span><br></code></pre></td></tr></table></figure><hr><h2 id="12-6-递归函数"><a href="#12-6-递归函数" class="headerlink" title="12.6 递归函数"></a>12.6 递归函数</h2><p>递归：函数自己调用自己。</p><p>必须有：</p><ol><li>递归出口</li><li>递归调用</li></ol><h3 id="求阶乘"><a href="#求阶乘" class="headerlink" title="求阶乘"></a>求阶乘</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">fact</span>(<span class="hljs-params">n</span>):<br>    <span class="hljs-keyword">if</span> n == <span class="hljs-number">1</span>:<br>        <span class="hljs-keyword">return</span> <span class="hljs-number">1</span><br>    <span class="hljs-keyword">return</span> n * fact(n - <span class="hljs-number">1</span>)<br><br><span class="hljs-built_in">print</span>(fact(<span class="hljs-number">5</span>))  <span class="hljs-comment"># 120</span><br></code></pre></td></tr></table></figure><p>理解：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs text">fact(5) = 5 * fact(4)<br>fact(4) = 4 * fact(3)<br>fact(3) = 3 * fact(2)<br>fact(2) = 2 * fact(1)<br>fact(1) = 1<br></code></pre></td></tr></table></figure><hr><h2 id="13-文件操作"><a href="#13-文件操作" class="headerlink" title="13. 文件操作"></a>13. 文件操作</h2><h2 id="13-1-open-基本格式"><a href="#13-1-open-基本格式" class="headerlink" title="13.1 open 基本格式"></a>13.1 open 基本格式</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs python">f = <span class="hljs-built_in">open</span>(<span class="hljs-string">&quot;test.txt&quot;</span>, <span class="hljs-string">&quot;r&quot;</span>, encoding=<span class="hljs-string">&quot;utf-8&quot;</span>)<br>content = f.read()<br>f.close()<br></code></pre></td></tr></table></figure><p>更推荐：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(<span class="hljs-string">&quot;test.txt&quot;</span>, <span class="hljs-string">&quot;r&quot;</span>, encoding=<span class="hljs-string">&quot;utf-8&quot;</span>) <span class="hljs-keyword">as</span> f:<br>    content = f.read()<br></code></pre></td></tr></table></figure><p><code>with</code> 会自动关闭文件。</p><hr><h2 id="13-2-文件打开模式"><a href="#13-2-文件打开模式" class="headerlink" title="13.2 文件打开模式"></a>13.2 文件打开模式</h2><table><thead><tr><th>模式</th><th>含义</th></tr></thead><tbody><tr><td><code>r</code></td><td>只读，文件不存在会报错</td></tr><tr><td><code>w</code></td><td>写入，会清空原文件；文件不存在会创建</td></tr><tr><td><code>a</code></td><td>追加，在文件末尾写入；文件不存在会创建</td></tr><tr><td><code>rb</code></td><td>二进制读</td></tr><tr><td><code>wb</code></td><td>二进制写</td></tr></tbody></table><hr><h2 id="13-3-读文件"><a href="#13-3-读文件" class="headerlink" title="13.3 读文件"></a>13.3 读文件</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(<span class="hljs-string">&quot;test.txt&quot;</span>, <span class="hljs-string">&quot;r&quot;</span>, encoding=<span class="hljs-string">&quot;utf-8&quot;</span>) <span class="hljs-keyword">as</span> f:<br>    data = f.read()<br>    <span class="hljs-built_in">print</span>(data)<br></code></pre></td></tr></table></figure><p>逐行读取：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(<span class="hljs-string">&quot;test.txt&quot;</span>, <span class="hljs-string">&quot;r&quot;</span>, encoding=<span class="hljs-string">&quot;utf-8&quot;</span>) <span class="hljs-keyword">as</span> f:<br>    <span class="hljs-keyword">for</span> line <span class="hljs-keyword">in</span> f:<br>        <span class="hljs-built_in">print</span>(line.strip())<br></code></pre></td></tr></table></figure><hr><h2 id="13-4-写文件"><a href="#13-4-写文件" class="headerlink" title="13.4 写文件"></a>13.4 写文件</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(<span class="hljs-string">&quot;test.txt&quot;</span>, <span class="hljs-string">&quot;w&quot;</span>, encoding=<span class="hljs-string">&quot;utf-8&quot;</span>) <span class="hljs-keyword">as</span> f:<br>    f.write(<span class="hljs-string">&quot;hello\n&quot;</span>)<br>    f.write(<span class="hljs-string">&quot;world\n&quot;</span>)<br></code></pre></td></tr></table></figure><p>追加文件：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(<span class="hljs-string">&quot;test.txt&quot;</span>, <span class="hljs-string">&quot;a&quot;</span>, encoding=<span class="hljs-string">&quot;utf-8&quot;</span>) <span class="hljs-keyword">as</span> f:<br>    f.write(<span class="hljs-string">&quot;new line\n&quot;</span>)<br></code></pre></td></tr></table></figure><hr><h2 id="14-异常处理"><a href="#14-异常处理" class="headerlink" title="14. 异常处理"></a>14. 异常处理</h2><h2 id="14-1-基本格式"><a href="#14-1-基本格式" class="headerlink" title="14.1 基本格式"></a>14.1 基本格式</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">try</span>:<br>    x = <span class="hljs-built_in">int</span>(<span class="hljs-built_in">input</span>(<span class="hljs-string">&quot;请输入数字：&quot;</span>))<br>    <span class="hljs-built_in">print</span>(<span class="hljs-number">10</span> / x)<br><span class="hljs-keyword">except</span> ValueError:<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;输入的不是整数&quot;</span>)<br><span class="hljs-keyword">except</span> ZeroDivisionError:<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;不能除以 0&quot;</span>)<br><span class="hljs-keyword">else</span>:<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;没有异常时执行&quot;</span>)<br><span class="hljs-keyword">finally</span>:<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;无论是否异常都会执行&quot;</span>)<br></code></pre></td></tr></table></figure><hr><h2 id="14-2-常见异常"><a href="#14-2-常见异常" class="headerlink" title="14.2 常见异常"></a>14.2 常见异常</h2><table><thead><tr><th>异常</th><th>含义</th></tr></thead><tbody><tr><td><code>ValueError</code></td><td>值错误，比如 <code>int(&quot;abc&quot;)</code></td></tr><tr><td><code>ZeroDivisionError</code></td><td>除以 0</td></tr><tr><td><code>IndexError</code></td><td>下标越界</td></tr><tr><td><code>KeyError</code></td><td>字典键不存在</td></tr><tr><td><code>TypeError</code></td><td>类型错误</td></tr><tr><td><code>FileNotFoundError</code></td><td>文件不存在</td></tr></tbody></table><hr><h2 id="15-面向对象基础"><a href="#15-面向对象基础" class="headerlink" title="15. 面向对象基础"></a>15. 面向对象基础</h2><h2 id="15-1-类和对象"><a href="#15-1-类和对象" class="headerlink" title="15.1 类和对象"></a>15.1 类和对象</h2><p>类：模板。<br>对象：根据模板造出来的具体东西。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">Student</span>:<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, name, age</span>):<br>        <span class="hljs-variable language_">self</span>.name = name<br>        <span class="hljs-variable language_">self</span>.age = age<br><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">say_hello</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;我叫&quot;</span>, <span class="hljs-variable language_">self</span>.name)<br><br>s1 = Student(<span class="hljs-string">&quot;Tom&quot;</span>, <span class="hljs-number">18</span>)<br>s1.say_hello()<br></code></pre></td></tr></table></figure><hr><h2 id="15-2-self-是什么？"><a href="#15-2-self-是什么？" class="headerlink" title="15.2 self 是什么？"></a>15.2 self 是什么？</h2><p><code>self</code> 表示当前对象自己。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-variable language_">self</span>.name = name<br></code></pre></td></tr></table></figure><p>意思是：把传进来的 <code>name</code> 保存到当前对象的 <code>name</code> 属性里。</p><hr><h2 id="15-3-构造方法-init"><a href="#15-3-构造方法-init" class="headerlink" title="15.3 构造方法 init"></a>15.3 构造方法 <strong>init</strong></h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, name, age</span>):<br>    <span class="hljs-variable language_">self</span>.name = name<br>    <span class="hljs-variable language_">self</span>.age = age<br></code></pre></td></tr></table></figure><p>创建对象时自动调用：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python">s = Student(<span class="hljs-string">&quot;Tom&quot;</span>, <span class="hljs-number">18</span>)<br></code></pre></td></tr></table></figure><hr><h2 id="15-4-类属性和实例属性"><a href="#15-4-类属性和实例属性" class="headerlink" title="15.4 类属性和实例属性"></a>15.4 类属性和实例属性</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">Student</span>:<br>    school = <span class="hljs-string">&quot;江苏大学&quot;</span>   <span class="hljs-comment"># 类属性</span><br><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, name</span>):<br>        <span class="hljs-variable language_">self</span>.name = name   <span class="hljs-comment"># 实例属性</span><br></code></pre></td></tr></table></figure><table><thead><tr><th>类型</th><th>属于谁</th></tr></thead><tbody><tr><td>类属性</td><td>所有对象共享</td></tr><tr><td>实例属性</td><td>每个对象自己拥有</td></tr></tbody></table><hr><h2 id="16-常见内置函数"><a href="#16-常见内置函数" class="headerlink" title="16. 常见内置函数"></a>16. 常见内置函数</h2><table><thead><tr><th>函数</th><th>作用</th></tr></thead><tbody><tr><td><code>len()</code></td><td>求长度</td></tr><tr><td><code>sum()</code></td><td>求和</td></tr><tr><td><code>max()</code></td><td>最大值</td></tr><tr><td><code>min()</code></td><td>最小值</td></tr><tr><td><code>sorted()</code></td><td>排序，返回新列表</td></tr><tr><td><code>range()</code></td><td>生成整数序列</td></tr><tr><td><code>type()</code></td><td>查看类型</td></tr><tr><td><code>int()</code></td><td>转整数</td></tr><tr><td><code>float()</code></td><td>转小数</td></tr><tr><td><code>str()</code></td><td>转字符串</td></tr><tr><td><code>list()</code></td><td>转列表</td></tr><tr><td><code>dict()</code></td><td>转字典</td></tr><tr><td><code>set()</code></td><td>转集合</td></tr><tr><td><code>enumerate()</code></td><td>同时获得下标和值</td></tr><tr><td><code>zip()</code></td><td>并行打包多个序列</td></tr></tbody></table><p>例子：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs python">lst = [<span class="hljs-number">3</span>, <span class="hljs-number">1</span>, <span class="hljs-number">4</span>, <span class="hljs-number">2</span>]<br><br><span class="hljs-built_in">print</span>(<span class="hljs-built_in">len</span>(lst))     <span class="hljs-comment"># 4</span><br><span class="hljs-built_in">print</span>(<span class="hljs-built_in">sum</span>(lst))     <span class="hljs-comment"># 10</span><br><span class="hljs-built_in">print</span>(<span class="hljs-built_in">max</span>(lst))     <span class="hljs-comment"># 4</span><br><span class="hljs-built_in">print</span>(<span class="hljs-built_in">min</span>(lst))     <span class="hljs-comment"># 1</span><br><span class="hljs-built_in">print</span>(<span class="hljs-built_in">sorted</span>(lst))  <span class="hljs-comment"># [1, 2, 3, 4]</span><br></code></pre></td></tr></table></figure><hr><h2 id="17-常见编程题套路"><a href="#17-常见编程题套路" class="headerlink" title="17. 常见编程题套路"></a>17. 常见编程题套路</h2><h2 id="17-1-判断素数"><a href="#17-1-判断素数" class="headerlink" title="17.1 判断素数"></a>17.1 判断素数</h2><p>素数：只能被 1 和自身整除的大于 1 的整数。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><code class="hljs python">n = <span class="hljs-built_in">int</span>(<span class="hljs-built_in">input</span>(<span class="hljs-string">&quot;请输入一个整数：&quot;</span>))<br><br><span class="hljs-keyword">if</span> n &lt;= <span class="hljs-number">1</span>:<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;不是素数&quot;</span>)<br><span class="hljs-keyword">else</span>:<br>    flag = <span class="hljs-literal">True</span><br>    <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">2</span>, n):<br>        <span class="hljs-keyword">if</span> n % i == <span class="hljs-number">0</span>:<br>            flag = <span class="hljs-literal">False</span><br>            <span class="hljs-keyword">break</span><br><br>    <span class="hljs-keyword">if</span> flag:<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;是素数&quot;</span>)<br>    <span class="hljs-keyword">else</span>:<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;不是素数&quot;</span>)<br></code></pre></td></tr></table></figure><p>优化版：只判断到平方根。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs python">n = <span class="hljs-built_in">int</span>(<span class="hljs-built_in">input</span>(<span class="hljs-string">&quot;请输入一个整数：&quot;</span>))<br><br><span class="hljs-keyword">if</span> n &lt;= <span class="hljs-number">1</span>:<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;不是素数&quot;</span>)<br><span class="hljs-keyword">else</span>:<br>    flag = <span class="hljs-literal">True</span><br>    <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">2</span>, <span class="hljs-built_in">int</span>(n ** <span class="hljs-number">0.5</span>) + <span class="hljs-number">1</span>):<br>        <span class="hljs-keyword">if</span> n % i == <span class="hljs-number">0</span>:<br>            flag = <span class="hljs-literal">False</span><br>            <span class="hljs-keyword">break</span><br><br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;是素数&quot;</span> <span class="hljs-keyword">if</span> flag <span class="hljs-keyword">else</span> <span class="hljs-string">&quot;不是素数&quot;</span>)<br></code></pre></td></tr></table></figure><hr><h2 id="17-2-输出-100-以内所有素数"><a href="#17-2-输出-100-以内所有素数" class="headerlink" title="17.2 输出 100 以内所有素数"></a>17.2 输出 100 以内所有素数</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">for</span> n <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">2</span>, <span class="hljs-number">101</span>):<br>    flag = <span class="hljs-literal">True</span><br>    <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">2</span>, <span class="hljs-built_in">int</span>(n ** <span class="hljs-number">0.5</span>) + <span class="hljs-number">1</span>):<br>        <span class="hljs-keyword">if</span> n % i == <span class="hljs-number">0</span>:<br>            flag = <span class="hljs-literal">False</span><br>            <span class="hljs-keyword">break</span><br>    <span class="hljs-keyword">if</span> flag:<br>        <span class="hljs-built_in">print</span>(n, end=<span class="hljs-string">&quot; &quot;</span>)<br></code></pre></td></tr></table></figure><hr><h2 id="17-3-水仙花数"><a href="#17-3-水仙花数" class="headerlink" title="17.3 水仙花数"></a>17.3 水仙花数</h2><p>三位水仙花数：每个位数字的立方和等于它本身。</p><p>例如：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs text">153 = 1^3 + 5^3 + 3^3<br></code></pre></td></tr></table></figure><p>代码：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">for</span> n <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">100</span>, <span class="hljs-number">1000</span>):<br>    a = n // <span class="hljs-number">100</span><br>    b = n // <span class="hljs-number">10</span> % <span class="hljs-number">10</span><br>    c = n % <span class="hljs-number">10</span><br><br>    <span class="hljs-keyword">if</span> a ** <span class="hljs-number">3</span> + b ** <span class="hljs-number">3</span> + c ** <span class="hljs-number">3</span> == n:<br>        <span class="hljs-built_in">print</span>(n)<br></code></pre></td></tr></table></figure><p>拆位技巧：</p><table><thead><tr><th>数位</th><th>写法</th></tr></thead><tbody><tr><td>百位</td><td><code>n // 100</code></td></tr><tr><td>十位</td><td><code>n // 10 % 10</code></td></tr><tr><td>个位</td><td><code>n % 10</code></td></tr></tbody></table><hr><h2 id="17-4-反转整数"><a href="#17-4-反转整数" class="headerlink" title="17.4 反转整数"></a>17.4 反转整数</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs python">n = <span class="hljs-built_in">int</span>(<span class="hljs-built_in">input</span>(<span class="hljs-string">&quot;请输入整数：&quot;</span>))<br>rev = <span class="hljs-number">0</span><br><br><span class="hljs-keyword">while</span> n &gt; <span class="hljs-number">0</span>:<br>    digit = n % <span class="hljs-number">10</span><br>    rev = rev * <span class="hljs-number">10</span> + digit<br>    n //= <span class="hljs-number">10</span><br><br><span class="hljs-built_in">print</span>(rev)<br></code></pre></td></tr></table></figure><p>例如：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs text">123 -&gt; 321<br></code></pre></td></tr></table></figure><hr><h2 id="17-5-最大公约数"><a href="#17-5-最大公约数" class="headerlink" title="17.5 最大公约数"></a>17.5 最大公约数</h2><p>普通写法：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs python">a = <span class="hljs-built_in">int</span>(<span class="hljs-built_in">input</span>())<br>b = <span class="hljs-built_in">int</span>(<span class="hljs-built_in">input</span>())<br><br>m = <span class="hljs-built_in">min</span>(a, b)<br><span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(m, <span class="hljs-number">0</span>, -<span class="hljs-number">1</span>):<br>    <span class="hljs-keyword">if</span> a % i == <span class="hljs-number">0</span> <span class="hljs-keyword">and</span> b % i == <span class="hljs-number">0</span>:<br>        <span class="hljs-built_in">print</span>(i)<br>        <span class="hljs-keyword">break</span><br></code></pre></td></tr></table></figure><p>辗转相除法：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs python">a = <span class="hljs-built_in">int</span>(<span class="hljs-built_in">input</span>())<br>b = <span class="hljs-built_in">int</span>(<span class="hljs-built_in">input</span>())<br><br><span class="hljs-keyword">while</span> b != <span class="hljs-number">0</span>:<br>    a, b = b, a % b<br><br><span class="hljs-built_in">print</span>(a)<br></code></pre></td></tr></table></figure><hr><h2 id="17-6-最小公倍数"><a href="#17-6-最小公倍数" class="headerlink" title="17.6 最小公倍数"></a>17.6 最小公倍数</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs python">a = <span class="hljs-built_in">int</span>(<span class="hljs-built_in">input</span>())<br>b = <span class="hljs-built_in">int</span>(<span class="hljs-built_in">input</span>())<br><br>x, y = a, b<br><span class="hljs-keyword">while</span> b != <span class="hljs-number">0</span>:<br>    a, b = b, a % b<br><br>gcd = a<br>lcm = x * y // gcd<br><span class="hljs-built_in">print</span>(lcm)<br></code></pre></td></tr></table></figure><p>公式：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs text">最小公倍数 = 两数乘积 // 最大公约数<br></code></pre></td></tr></table></figure><hr><h2 id="17-7-斐波那契数列"><a href="#17-7-斐波那契数列" class="headerlink" title="17.7 斐波那契数列"></a>17.7 斐波那契数列</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs python">n = <span class="hljs-built_in">int</span>(<span class="hljs-built_in">input</span>(<span class="hljs-string">&quot;请输入项数：&quot;</span>))<br><br>a, b = <span class="hljs-number">0</span>, <span class="hljs-number">1</span><br><span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(n):<br>    <span class="hljs-built_in">print</span>(a, end=<span class="hljs-string">&quot; &quot;</span>)<br>    a, b = b, a + b<br></code></pre></td></tr></table></figure><p>输出前 10 项：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs text">0 1 1 2 3 5 8 13 21 34<br></code></pre></td></tr></table></figure><hr><h2 id="17-8-冒泡排序"><a href="#17-8-冒泡排序" class="headerlink" title="17.8 冒泡排序"></a>17.8 冒泡排序</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs python">lst = [<span class="hljs-number">5</span>, <span class="hljs-number">3</span>, <span class="hljs-number">8</span>, <span class="hljs-number">1</span>, <span class="hljs-number">2</span>]<br><br><span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-built_in">len</span>(lst) - <span class="hljs-number">1</span>):<br>    <span class="hljs-keyword">for</span> j <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-built_in">len</span>(lst) - <span class="hljs-number">1</span> - i):<br>        <span class="hljs-keyword">if</span> lst[j] &gt; lst[j + <span class="hljs-number">1</span>]:<br>            lst[j], lst[j + <span class="hljs-number">1</span>] = lst[j + <span class="hljs-number">1</span>], lst[j]<br><br><span class="hljs-built_in">print</span>(lst)<br></code></pre></td></tr></table></figure><p>理解：</p><ul><li>每一轮把当前最大的数“冒”到后面。</li><li>外层控制轮数。</li><li>内层控制相邻比较。</li></ul><hr><h2 id="17-9-线性查找"><a href="#17-9-线性查找" class="headerlink" title="17.9 线性查找"></a>17.9 线性查找</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><code class="hljs python">lst = [<span class="hljs-number">10</span>, <span class="hljs-number">20</span>, <span class="hljs-number">30</span>, <span class="hljs-number">40</span>]<br>target = <span class="hljs-built_in">int</span>(<span class="hljs-built_in">input</span>(<span class="hljs-string">&quot;请输入要查找的数：&quot;</span>))<br><br>pos = -<span class="hljs-number">1</span><br><span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-built_in">len</span>(lst)):<br>    <span class="hljs-keyword">if</span> lst[i] == target:<br>        pos = i<br>        <span class="hljs-keyword">break</span><br><br><span class="hljs-keyword">if</span> pos == -<span class="hljs-number">1</span>:<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;没找到&quot;</span>)<br><span class="hljs-keyword">else</span>:<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;下标是&quot;</span>, pos)<br></code></pre></td></tr></table></figure><hr><h2 id="17-10-统计列表最大值和下标"><a href="#17-10-统计列表最大值和下标" class="headerlink" title="17.10 统计列表最大值和下标"></a>17.10 统计列表最大值和下标</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs python">lst = [<span class="hljs-number">3</span>, <span class="hljs-number">9</span>, <span class="hljs-number">2</span>, <span class="hljs-number">9</span>, <span class="hljs-number">5</span>]<br>max_value = lst[<span class="hljs-number">0</span>]<br>max_index = <span class="hljs-number">0</span><br><br><span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">1</span>, <span class="hljs-built_in">len</span>(lst)):<br>    <span class="hljs-keyword">if</span> lst[i] &gt; max_value:<br>        max_value = lst[i]<br>        max_index = i<br><br><span class="hljs-built_in">print</span>(max_value, max_index)<br></code></pre></td></tr></table></figure><hr><h2 id="17-11-输入一行数字，求和"><a href="#17-11-输入一行数字，求和" class="headerlink" title="17.11 输入一行数字，求和"></a>17.11 输入一行数字，求和</h2><p>输入：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs text">1 2 3 4 5<br></code></pre></td></tr></table></figure><p>代码：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs python">nums = <span class="hljs-built_in">input</span>().split()<br>nums = [<span class="hljs-built_in">int</span>(x) <span class="hljs-keyword">for</span> x <span class="hljs-keyword">in</span> nums]<br><span class="hljs-built_in">print</span>(<span class="hljs-built_in">sum</span>(nums))<br></code></pre></td></tr></table></figure><p>合并写法：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python">nums = <span class="hljs-built_in">list</span>(<span class="hljs-built_in">map</span>(<span class="hljs-built_in">int</span>, <span class="hljs-built_in">input</span>().split()))<br><span class="hljs-built_in">print</span>(<span class="hljs-built_in">sum</span>(nums))<br></code></pre></td></tr></table></figure><hr><h2 id="18-程序阅读题常见坑"><a href="#18-程序阅读题常见坑" class="headerlink" title="18. 程序阅读题常见坑"></a>18. 程序阅读题常见坑</h2><h2 id="18-1-变量交换"><a href="#18-1-变量交换" class="headerlink" title="18.1 变量交换"></a>18.1 变量交换</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs python">a = <span class="hljs-number">3</span><br>b = <span class="hljs-number">5</span><br>a, b = b, a<br><span class="hljs-built_in">print</span>(a, b)<br></code></pre></td></tr></table></figure><p>输出：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs text">5 3<br></code></pre></td></tr></table></figure><hr><h2 id="18-2-列表赋值不是复制"><a href="#18-2-列表赋值不是复制" class="headerlink" title="18.2 列表赋值不是复制"></a>18.2 列表赋值不是复制</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs python">a = [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>]<br>b = a<br>b[<span class="hljs-number">0</span>] = <span class="hljs-number">100</span><br><span class="hljs-built_in">print</span>(a)<br></code></pre></td></tr></table></figure><p>输出：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python">[<span class="hljs-number">100</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>]<br></code></pre></td></tr></table></figure><p>因为 <code>a</code> 和 <code>b</code> 指向同一个列表。</p><p>正确复制：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs python">b = a.copy()<br><span class="hljs-comment"># 或</span><br>b = a[:]<br></code></pre></td></tr></table></figure><hr><h2 id="18-3-可变对象和不可变对象"><a href="#18-3-可变对象和不可变对象" class="headerlink" title="18.3 可变对象和不可变对象"></a>18.3 可变对象和不可变对象</h2><table><thead><tr><th>类型</th><th>是否可变</th></tr></thead><tbody><tr><td>int</td><td>不可变</td></tr><tr><td>float</td><td>不可变</td></tr><tr><td>str</td><td>不可变</td></tr><tr><td>tuple</td><td>不可变</td></tr><tr><td>list</td><td>可变</td></tr><tr><td>dict</td><td>可变</td></tr><tr><td>set</td><td>可变</td></tr></tbody></table><hr><h2 id="18-4-函数修改列表"><a href="#18-4-函数修改列表" class="headerlink" title="18.4 函数修改列表"></a>18.4 函数修改列表</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">f</span>(<span class="hljs-params">lst</span>):<br>    lst.append(<span class="hljs-number">4</span>)<br><br>nums = [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>]<br>f(nums)<br><span class="hljs-built_in">print</span>(nums)<br></code></pre></td></tr></table></figure><p>输出：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python">[<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">4</span>]<br></code></pre></td></tr></table></figure><p>列表是可变对象，函数里可以改到原列表。</p><hr><h2 id="18-5-and-or-的短路逻辑"><a href="#18-5-and-or-的短路逻辑" class="headerlink" title="18.5 and &#x2F; or 的短路逻辑"></a>18.5 and &#x2F; or 的短路逻辑</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-built_in">print</span>(<span class="hljs-number">0</span> <span class="hljs-keyword">and</span> <span class="hljs-number">5</span>)   <span class="hljs-comment"># 0</span><br><span class="hljs-built_in">print</span>(<span class="hljs-number">1</span> <span class="hljs-keyword">and</span> <span class="hljs-number">5</span>)   <span class="hljs-comment"># 5</span><br><span class="hljs-built_in">print</span>(<span class="hljs-number">0</span> <span class="hljs-keyword">or</span> <span class="hljs-number">5</span>)    <span class="hljs-comment"># 5</span><br><span class="hljs-built_in">print</span>(<span class="hljs-number">1</span> <span class="hljs-keyword">or</span> <span class="hljs-number">5</span>)    <span class="hljs-comment"># 1</span><br></code></pre></td></tr></table></figure><p>考试如果只考 True &#x2F; False，可以记：</p><table><thead><tr><th>表达式</th><th>结果</th></tr></thead><tbody><tr><td><code>A and B</code></td><td>A 假就返回 A，否则返回 B</td></tr><tr><td><code>A or B</code></td><td>A 真就返回 A，否则返回 B</td></tr></tbody></table><hr><h2 id="18-6-浮点数精度问题"><a href="#18-6-浮点数精度问题" class="headerlink" title="18.6 浮点数精度问题"></a>18.6 浮点数精度问题</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-built_in">print</span>(<span class="hljs-number">0.1</span> + <span class="hljs-number">0.2</span>)<br></code></pre></td></tr></table></figure><p>可能输出：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-number">0.30000000000000004</span><br></code></pre></td></tr></table></figure><p>所以不要直接用浮点数判断绝对相等。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-built_in">abs</span>((<span class="hljs-number">0.1</span> + <span class="hljs-number">0.2</span>) - <span class="hljs-number">0.3</span>) &lt; <span class="hljs-number">1e-9</span><br></code></pre></td></tr></table></figure><hr><h2 id="18-7-默认参数不要用可变对象"><a href="#18-7-默认参数不要用可变对象" class="headerlink" title="18.7 默认参数不要用可变对象"></a>18.7 默认参数不要用可变对象</h2><p>错误示范：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">f</span>(<span class="hljs-params">x, lst=[]</span>):<br>    lst.append(x)<br>    <span class="hljs-keyword">return</span> lst<br><br><span class="hljs-built_in">print</span>(f(<span class="hljs-number">1</span>))<br><span class="hljs-built_in">print</span>(f(<span class="hljs-number">2</span>))<br></code></pre></td></tr></table></figure><p>输出可能是：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python">[<span class="hljs-number">1</span>]<br>[<span class="hljs-number">1</span>, <span class="hljs-number">2</span>]<br></code></pre></td></tr></table></figure><p>更安全写法：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">f</span>(<span class="hljs-params">x, lst=<span class="hljs-literal">None</span></span>):<br>    <span class="hljs-keyword">if</span> lst <span class="hljs-keyword">is</span> <span class="hljs-literal">None</span>:<br>        lst = []<br>    lst.append(x)<br>    <span class="hljs-keyword">return</span> lst<br></code></pre></td></tr></table></figure><hr><h2 id="19-高频选择题-填空题速记"><a href="#19-高频选择题-填空题速记" class="headerlink" title="19. 高频选择题 &#x2F; 填空题速记"></a>19. 高频选择题 &#x2F; 填空题速记</h2><h3 id="19-1-Python-文件后缀"><a href="#19-1-Python-文件后缀" class="headerlink" title="19.1 Python 文件后缀"></a>19.1 Python 文件后缀</h3><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs text">.py<br></code></pre></td></tr></table></figure><h3 id="19-2-Python-用什么表示代码块？"><a href="#19-2-Python-用什么表示代码块？" class="headerlink" title="19.2 Python 用什么表示代码块？"></a>19.2 Python 用什么表示代码块？</h3><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs text">缩进<br></code></pre></td></tr></table></figure><h3 id="19-3-Python-变量需要提前声明吗？"><a href="#19-3-Python-变量需要提前声明吗？" class="headerlink" title="19.3 Python 变量需要提前声明吗？"></a>19.3 Python 变量需要提前声明吗？</h3><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs text">不需要<br></code></pre></td></tr></table></figure><h3 id="19-4-input-返回什么类型？"><a href="#19-4-input-返回什么类型？" class="headerlink" title="19.4 input 返回什么类型？"></a>19.4 input 返回什么类型？</h3><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs text">str 字符串<br></code></pre></td></tr></table></figure><h3 id="19-5-列表和元组区别？"><a href="#19-5-列表和元组区别？" class="headerlink" title="19.5 列表和元组区别？"></a>19.5 列表和元组区别？</h3><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs text">列表 list 可修改，元组 tuple 不可修改。<br></code></pre></td></tr></table></figure><h3 id="19-6-字典通过什么取值？"><a href="#19-6-字典通过什么取值？" class="headerlink" title="19.6 字典通过什么取值？"></a>19.6 字典通过什么取值？</h3><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs text">键 key<br></code></pre></td></tr></table></figure><h3 id="19-7-集合最大特点？"><a href="#19-7-集合最大特点？" class="headerlink" title="19.7 集合最大特点？"></a>19.7 集合最大特点？</h3><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs text">元素不重复，无序。<br></code></pre></td></tr></table></figure><h3 id="19-8-函数没有-return-返回什么？"><a href="#19-8-函数没有-return-返回什么？" class="headerlink" title="19.8 函数没有 return 返回什么？"></a>19.8 函数没有 return 返回什么？</h3><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs text">None<br></code></pre></td></tr></table></figure><h3 id="19-9-和-区别？"><a href="#19-9-和-区别？" class="headerlink" title="19.9 = 和 == 区别？"></a>19.9 <code>=</code> 和 <code>==</code> 区别？</h3><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs text">= 是赋值，== 是判断是否相等。<br></code></pre></td></tr></table></figure><h3 id="19-10-和-区别？"><a href="#19-10-和-区别？" class="headerlink" title="19.10 / 和 // 区别？"></a>19.10 <code>/</code> 和 <code>//</code> 区别？</h3><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs text">/ 是普通除法，结果通常是小数；// 是整除，取商的整数部分。<br></code></pre></td></tr></table></figure><hr><h2 id="20-机考万能模板"><a href="#20-机考万能模板" class="headerlink" title="20. 机考万能模板"></a>20. 机考万能模板</h2><h2 id="20-1-输入一个整数"><a href="#20-1-输入一个整数" class="headerlink" title="20.1 输入一个整数"></a>20.1 输入一个整数</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python">n = <span class="hljs-built_in">int</span>(<span class="hljs-built_in">input</span>())<br></code></pre></td></tr></table></figure><h2 id="20-2-输入多个整数"><a href="#20-2-输入多个整数" class="headerlink" title="20.2 输入多个整数"></a>20.2 输入多个整数</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python">nums = <span class="hljs-built_in">list</span>(<span class="hljs-built_in">map</span>(<span class="hljs-built_in">int</span>, <span class="hljs-built_in">input</span>().split()))<br></code></pre></td></tr></table></figure><h2 id="20-3-输入-n-个整数，每个一行"><a href="#20-3-输入-n-个整数，每个一行" class="headerlink" title="20.3 输入 n 个整数，每个一行"></a>20.3 输入 n 个整数，每个一行</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs python">n = <span class="hljs-built_in">int</span>(<span class="hljs-built_in">input</span>())<br>nums = []<br><span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(n):<br>    nums.append(<span class="hljs-built_in">int</span>(<span class="hljs-built_in">input</span>()))<br></code></pre></td></tr></table></figure><h2 id="20-4-输入-n-个整数，在一行"><a href="#20-4-输入-n-个整数，在一行" class="headerlink" title="20.4 输入 n 个整数，在一行"></a>20.4 输入 n 个整数，在一行</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python">n = <span class="hljs-built_in">int</span>(<span class="hljs-built_in">input</span>())<br>nums = <span class="hljs-built_in">list</span>(<span class="hljs-built_in">map</span>(<span class="hljs-built_in">int</span>, <span class="hljs-built_in">input</span>().split()))<br></code></pre></td></tr></table></figure><h2 id="20-5-遍历列表"><a href="#20-5-遍历列表" class="headerlink" title="20.5 遍历列表"></a>20.5 遍历列表</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">for</span> x <span class="hljs-keyword">in</span> nums:<br>    <span class="hljs-built_in">print</span>(x)<br></code></pre></td></tr></table></figure><h2 id="20-6-带下标遍历"><a href="#20-6-带下标遍历" class="headerlink" title="20.6 带下标遍历"></a>20.6 带下标遍历</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">for</span> i, x <span class="hljs-keyword">in</span> <span class="hljs-built_in">enumerate</span>(nums):<br>    <span class="hljs-built_in">print</span>(i, x)<br></code></pre></td></tr></table></figure><h2 id="20-7-统计频次"><a href="#20-7-统计频次" class="headerlink" title="20.7 统计频次"></a>20.7 统计频次</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs python">d = &#123;&#125;<br><span class="hljs-keyword">for</span> x <span class="hljs-keyword">in</span> nums:<br>    d[x] = d.get(x, <span class="hljs-number">0</span>) + <span class="hljs-number">1</span><br></code></pre></td></tr></table></figure><h2 id="20-8-排序"><a href="#20-8-排序" class="headerlink" title="20.8 排序"></a>20.8 排序</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python">nums.sort()<br></code></pre></td></tr></table></figure><p>或：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python">nums = <span class="hljs-built_in">sorted</span>(nums)<br></code></pre></td></tr></table></figure><hr><h2 id="21-最容易丢分的地方"><a href="#21-最容易丢分的地方" class="headerlink" title="21. 最容易丢分的地方"></a>21. 最容易丢分的地方</h2><h3 id="21-1-忘记类型转换"><a href="#21-1-忘记类型转换" class="headerlink" title="21.1 忘记类型转换"></a>21.1 忘记类型转换</h3><p>错误：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs python">a = <span class="hljs-built_in">input</span>()<br>b = <span class="hljs-built_in">input</span>()<br><span class="hljs-built_in">print</span>(a + b)<br></code></pre></td></tr></table></figure><p>如果输入：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs text">1<br>2<br></code></pre></td></tr></table></figure><p>输出：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs text">12<br></code></pre></td></tr></table></figure><p>正确：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs python">a = <span class="hljs-built_in">int</span>(<span class="hljs-built_in">input</span>())<br>b = <span class="hljs-built_in">int</span>(<span class="hljs-built_in">input</span>())<br><span class="hljs-built_in">print</span>(a + b)<br></code></pre></td></tr></table></figure><hr><h3 id="21-2-range-忘记右边取不到"><a href="#21-2-range-忘记右边取不到" class="headerlink" title="21.2 range 忘记右边取不到"></a>21.2 range 忘记右边取不到</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">1</span>, <span class="hljs-number">10</span>):<br>    <span class="hljs-built_in">print</span>(i)<br></code></pre></td></tr></table></figure><p>只能输出 1 到 9，不能输出 10。</p><p>如果要 1 到 10：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">1</span>, <span class="hljs-number">11</span>):<br>    <span class="hljs-built_in">print</span>(i)<br></code></pre></td></tr></table></figure><hr><h3 id="21-3-列表下标越界"><a href="#21-3-列表下标越界" class="headerlink" title="21.3 列表下标越界"></a>21.3 列表下标越界</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python">lst = [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>]<br><span class="hljs-built_in">print</span>(lst[<span class="hljs-number">3</span>])  <span class="hljs-comment"># 错误</span><br></code></pre></td></tr></table></figure><p>最大下标是 <code>len(lst) - 1</code>。</p><hr><h3 id="21-4-字典键不存在"><a href="#21-4-字典键不存在" class="headerlink" title="21.4 字典键不存在"></a>21.4 字典键不存在</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python">d = &#123;<span class="hljs-string">&quot;a&quot;</span>: <span class="hljs-number">1</span>&#125;<br><span class="hljs-built_in">print</span>(d[<span class="hljs-string">&quot;b&quot;</span>])  <span class="hljs-comment"># KeyError</span><br></code></pre></td></tr></table></figure><p>安全写法：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-built_in">print</span>(d.get(<span class="hljs-string">&quot;b&quot;</span>, <span class="hljs-number">0</span>))<br></code></pre></td></tr></table></figure><hr><h3 id="21-5-while-死循环"><a href="#21-5-while-死循环" class="headerlink" title="21.5 while 死循环"></a>21.5 while 死循环</h3><p>错误：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs python">i = <span class="hljs-number">1</span><br><span class="hljs-keyword">while</span> i &lt;= <span class="hljs-number">5</span>:<br>    <span class="hljs-built_in">print</span>(i)<br></code></pre></td></tr></table></figure><p>忘记更新 <code>i</code>，会一直循环。</p><p>正确：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs python">i = <span class="hljs-number">1</span><br><span class="hljs-keyword">while</span> i &lt;= <span class="hljs-number">5</span>:<br>    <span class="hljs-built_in">print</span>(i)<br>    i += <span class="hljs-number">1</span><br></code></pre></td></tr></table></figure><hr><h2 id="22-考前-30-分钟速背清单"><a href="#22-考前-30-分钟速背清单" class="headerlink" title="22. 考前 30 分钟速背清单"></a>22. 考前 30 分钟速背清单</h2><ol><li><code>input()</code> 返回字符串，计算前要 <code>int()</code> 或 <code>float()</code>。</li><li><code>range(a, b)</code> 包含 <code>a</code>，不包含 <code>b</code>。</li><li><code>/</code> 是普通除法，<code>//</code> 是整除，<code>%</code> 是取余。</li><li><code>=</code> 是赋值，<code>==</code> 是判断相等。</li><li>列表 <code>list</code> 可修改，元组 <code>tuple</code> 不可修改。</li><li>字符串、列表都能索引和切片。</li><li>字符串不可修改，列表可以修改。</li><li>字典用 <code>key</code> 找 <code>value</code>。</li><li><code>dict.get(key, 默认值)</code> 可以避免键不存在报错。</li><li>函数没有 <code>return</code> 默认返回 <code>None</code>。</li><li><code>break</code> 结束整个循环，<code>continue</code> 跳过本轮循环。</li><li>文件操作推荐使用 <code>with open(...) as f:</code>。</li><li><code>sort()</code> 改原列表，<code>sorted()</code> 返回新列表。</li><li><code>append()</code> 是在列表末尾添加元素。</li><li>判断素数、求和、统计次数、排序、查找是编程题高频。</li></ol><hr><h2 id="23-练习题：自己检查掌握程度"><a href="#23-练习题：自己检查掌握程度" class="headerlink" title="23. 练习题：自己检查掌握程度"></a>23. 练习题：自己检查掌握程度</h2><h3 id="题-1：输出-1-到-100-中所有能被-3-整除的数"><a href="#题-1：输出-1-到-100-中所有能被-3-整除的数" class="headerlink" title="题 1：输出 1 到 100 中所有能被 3 整除的数"></a>题 1：输出 1 到 100 中所有能被 3 整除的数</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">1</span>, <span class="hljs-number">101</span>):<br>    <span class="hljs-keyword">if</span> i % <span class="hljs-number">3</span> == <span class="hljs-number">0</span>:<br>        <span class="hljs-built_in">print</span>(i)<br></code></pre></td></tr></table></figure><hr><h3 id="题-2：输入一个字符串，统计字母-a-出现次数"><a href="#题-2：输入一个字符串，统计字母-a-出现次数" class="headerlink" title="题 2：输入一个字符串，统计字母 a 出现次数"></a>题 2：输入一个字符串，统计字母 a 出现次数</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python">s = <span class="hljs-built_in">input</span>()<br><span class="hljs-built_in">print</span>(s.count(<span class="hljs-string">&quot;a&quot;</span>))<br></code></pre></td></tr></table></figure><hr><h3 id="题-3：输入一行整数，输出最大值、最小值、平均值"><a href="#题-3：输入一行整数，输出最大值、最小值、平均值" class="headerlink" title="题 3：输入一行整数，输出最大值、最小值、平均值"></a>题 3：输入一行整数，输出最大值、最小值、平均值</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs python">nums = <span class="hljs-built_in">list</span>(<span class="hljs-built_in">map</span>(<span class="hljs-built_in">int</span>, <span class="hljs-built_in">input</span>().split()))<br><br><span class="hljs-built_in">print</span>(<span class="hljs-built_in">max</span>(nums))<br><span class="hljs-built_in">print</span>(<span class="hljs-built_in">min</span>(nums))<br><span class="hljs-built_in">print</span>(<span class="hljs-built_in">sum</span>(nums) / <span class="hljs-built_in">len</span>(nums))<br></code></pre></td></tr></table></figure><hr><h3 id="题-4：统计一行字符串中每个字符出现次数"><a href="#题-4：统计一行字符串中每个字符出现次数" class="headerlink" title="题 4：统计一行字符串中每个字符出现次数"></a>题 4：统计一行字符串中每个字符出现次数</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs python">s = <span class="hljs-built_in">input</span>()<br>d = &#123;&#125;<br><br><span class="hljs-keyword">for</span> ch <span class="hljs-keyword">in</span> s:<br>    d[ch] = d.get(ch, <span class="hljs-number">0</span>) + <span class="hljs-number">1</span><br><br><span class="hljs-built_in">print</span>(d)<br></code></pre></td></tr></table></figure><hr><h3 id="题-5：判断回文字符串"><a href="#题-5：判断回文字符串" class="headerlink" title="题 5：判断回文字符串"></a>题 5：判断回文字符串</h3><p>回文：正着读和反着读一样。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs python">s = <span class="hljs-built_in">input</span>()<br><br><span class="hljs-keyword">if</span> s == s[::-<span class="hljs-number">1</span>]:<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;是回文&quot;</span>)<br><span class="hljs-keyword">else</span>:<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;不是回文&quot;</span>)<br></code></pre></td></tr></table></figure><hr><h2 id="24-最后建议：怎么复习最有效？"><a href="#24-最后建议：怎么复习最有效？" class="headerlink" title="24. 最后建议：怎么复习最有效？"></a>24. 最后建议：怎么复习最有效？</h2><p>不要只背语法，最好按这个顺序来：</p><ol><li>先把 <code>input / print / if / for / while</code> 搞熟。</li><li>再重点练 <code>字符串、列表、字典</code>。</li><li>然后背几个常见题模板：素数、水仙花、求和、排序、查找、统计次数。</li><li>考前多看程序阅读题，尤其注意变量变化、循环次数、下标范围。</li><li>遇到不会的代码，逐行写出变量变化表，基本都能看懂。</li></ol><hr><h1 id="附录：超短版语法表"><a href="#附录：超短版语法表" class="headerlink" title="附录：超短版语法表"></a>附录：超短版语法表</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-comment"># 输入</span><br>x = <span class="hljs-built_in">int</span>(<span class="hljs-built_in">input</span>())<br>nums = <span class="hljs-built_in">list</span>(<span class="hljs-built_in">map</span>(<span class="hljs-built_in">int</span>, <span class="hljs-built_in">input</span>().split()))<br><br><span class="hljs-comment"># 输出</span><br><span class="hljs-built_in">print</span>(x)<br><span class="hljs-built_in">print</span>(a, b, sep=<span class="hljs-string">&quot;-&quot;</span>, end=<span class="hljs-string">&quot; &quot;</span>)<br><br><span class="hljs-comment"># 分支</span><br><span class="hljs-keyword">if</span> 条件:<br>    <span class="hljs-keyword">pass</span><br><span class="hljs-keyword">elif</span> 条件:<br>    <span class="hljs-keyword">pass</span><br><span class="hljs-keyword">else</span>:<br>    <span class="hljs-keyword">pass</span><br><br><span class="hljs-comment"># 循环</span><br><span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(n):<br>    <span class="hljs-keyword">pass</span><br><br><span class="hljs-keyword">while</span> 条件:<br>    <span class="hljs-keyword">pass</span><br><br><span class="hljs-comment"># 函数</span><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">f</span>(<span class="hljs-params">a, b</span>):<br>    <span class="hljs-keyword">return</span> a + b<br><br><span class="hljs-comment"># 列表</span><br>lst = []<br>lst.append(<span class="hljs-number">1</span>)<br>lst.sort()<br><br><span class="hljs-comment"># 字典</span><br>d = &#123;&#125;<br>d[key] = value<br>d[key] = d.get(key, <span class="hljs-number">0</span>) + <span class="hljs-number">1</span><br><br><span class="hljs-comment"># 文件</span><br><span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(<span class="hljs-string">&quot;a.txt&quot;</span>, <span class="hljs-string">&quot;r&quot;</span>, encoding=<span class="hljs-string">&quot;utf-8&quot;</span>) <span class="hljs-keyword">as</span> f:<br>    data = f.read()<br></code></pre></td></tr></table></figure><hr><p><strong>一句话记忆：Python 考试最核心就是：输入转类型、循环看范围、列表看下标、字典看键、函数看返回值。</strong></p>]]>
    </content>
    <id>https://cmijohnson.github.io/blog/2026/06/16/python-%E5%B8%B8%E8%A7%81%E8%80%83%E7%82%B9%E5%A4%8D%E4%B9%A0%E6%96%87%E6%A1%A3/</id>
    <link href="https://cmijohnson.github.io/blog/2026/06/16/python-%E5%B8%B8%E8%A7%81%E8%80%83%E7%82%B9%E5%A4%8D%E4%B9%A0%E6%96%87%E6%A1%A3/"/>
    <published>2026-06-16T01:33:00.000Z</published>
    <summary>
      <![CDATA[<h1 id="Python-常见考点复习文档"><a href="#Python-常见考点复习文档" class="headerlink" title="Python 常见考点复习文档"></a>Python 常见考点复习文档</h1><blockquote>
<p>适合期末考]]>
    </summary>
    <title>Python 常见考点复习文档</title>
    <updated>2026-06-26T19:43:40.497Z</updated>
  </entry>
  <entry>
    <author>
      <name>cmijohnson</name>
    </author>
    <content>
      <![CDATA[<div class="team-section"><h2 class="team-section-title">科研项目</h2><p class="team-section-subtitle">Research Projects</p><div class="team-accent-bar team-accent-bar--green"></div><div class="team-research-grid"><div class="team-research-card"><div class="team-research-image green-grad"><i class="fas fa-link" style="font-size:3rem;color:#16a34a;opacity:.4"></i><span class="team-research-status status-ongoing">进行中</span></div><div class="team-research-body"><h3>基于行为指纹的多智能体异常检测与动态权限管控研究</h3><div class="date">2026 — 至今</div><p>MAS动态权限有关。国家级大创+学校重点支持（全校唯二）</p></div></div></div></div><div class="team-section"><h2 class="team-section-title">研究方向</h2><p class="team-section-subtitle">Research Directions</p><div class="team-accent-bar team-accent-bar--blue"></div><div class="team-research-grid"><div class="team-research-card"><div class="team-research-image green-grad"><i class="fas fa-globe" style="font-size:3rem;color:#16a34a;opacity:.4"></i></div><div class="team-research-body"><h3>Web 安全</h3><p>Web 应用漏洞挖掘与防御技术研究，涵盖注入攻击、跨站脚本、服务端请求伪造等经典与新型攻击向量。</p></div></div><div class="team-research-card"><div class="team-research-image blue-grad2"><i class="fas fa-microchip" style="font-size:3rem;color:#2563eb;opacity:.4"></i></div><div class="team-research-body"><h3>Agent安全</h3><p>多智能体安全研究。</p></div></div><div class="team-research-card"><div class="team-research-image green-grad"><i class="fas fa-cubes" style="font-size:3rem;color:#16a34a;opacity:.4"></i></div><div class="team-research-body"><h3>区块链安全</h3><p>智能合约漏洞分析与形式化验证，区块链共识机制安全性评估，去中心化应用安全审计。</p></div></div><div class="team-research-card"><div class="team-research-image blue-grad2"><i class="fas fa-cloud" style="font-size:3rem;color:#2563eb;opacity:.4"></i></div><div class="team-research-body"><h3>云原生安全</h3><p>容器与 Kubernetes 安全、微服务安全架构、云环境下的威胁检测与响应机制研究。</p></div></div></div></div>]]>
    </content>
    <id>https://cmijohnson.github.io/blog/2026/06/15/%E7%A7%91%E7%A0%94%E9%A1%B9%E7%9B%AE/</id>
    <link href="https://cmijohnson.github.io/blog/2026/06/15/%E7%A7%91%E7%A0%94%E9%A1%B9%E7%9B%AE/"/>
    <published>2026-06-15T12:35:49.000Z</published>
    <summary>
      <![CDATA[<div class="team-section">
<h2 class="team-section-title">科研项目</h2>
<p class="team-section-subtitle">Research Projects</p>
<div class="team-]]>
    </summary>
    <title>科研项目</title>
    <updated>2026-06-26T19:43:40.497Z</updated>
  </entry>
  <entry>
    <author>
      <name>cmijohnson</name>
    </author>
    <category term="基础知识" scheme="https://cmijohnson.github.io/blog/categories/%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/"/>
    <category term="docker" scheme="https://cmijohnson.github.io/blog/tags/docker/"/>
    <content>
      <![CDATA[<h1 id="Docker-基础入门教程"><a href="#Docker-基础入门教程" class="headerlink" title="Docker 基础入门教程"></a>Docker 基础入门教程</h1><p><img src="https://usual1009.oss-cn-shanghai.aliyuncs.com/img/20260116155541617.png" alt="img"></p><p>Docker 让开发者可以打包应用及其依赖包到一个可移植的容器中，然后发布到任何流行的 Linux 或 Windows 机器上。本教程将以最通俗易懂的方式，带你掌握 Docker 的核心用法。</p><hr><h2 id="一、-Docker-环境安装"><a href="#一、-Docker-环境安装" class="headerlink" title="一、 Docker 环境安装"></a>一、 Docker 环境安装</h2><h3 id="1-Windows-系统"><a href="#1-Windows-系统" class="headerlink" title="1. Windows 系统"></a>1. Windows 系统</h3><p>在 Windows 上，我们通常安装 <strong>Docker Desktop</strong>。</p><ul><li><strong>下载地址</strong>：<a href="https://www.docker.com/products/docker-desktop/">Docker 官网</a></li><li><strong>注意项</strong>：安装时请确保勾选了 <strong>WSL 2</strong> 支持，这会让 Docker 运行得更加顺畅。</li><li><strong>验证</strong>：打开终端输入 <code>docker --version</code>，看到版本号即安装成功。</li></ul><h3 id="2-Linux-系统（以-Ubuntu-为例）"><a href="#2-Linux-系统（以-Ubuntu-为例）" class="headerlink" title="2. Linux 系统（以 Ubuntu 为例）"></a>2. Linux 系统（以 Ubuntu 为例）</h3><p>Linux 下通常使用命令行安装，最快的方法是使用官方的一键脚本：(选择1,4的命令进行安装)</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><code class="hljs php"><span class="hljs-comment"># To install the latest stable versions of Docker CLI, Docker Engine, and their</span><br><span class="hljs-comment"># dependencies:</span><br><span class="hljs-comment">#</span><br><span class="hljs-comment"># 1. download the script</span><br><span class="hljs-comment">#</span><br><span class="hljs-comment">#   $ curl -fsSL https://get.docker.com -o install-docker.sh</span><br><span class="hljs-comment">#</span><br><span class="hljs-comment"># 2. verify the script&#x27;s content</span><br><span class="hljs-comment">#</span><br><span class="hljs-comment">#   $ cat install-docker.sh</span><br><span class="hljs-comment">#</span><br><span class="hljs-comment"># 3. run the script with --dry-run to verify the steps it executes</span><br><span class="hljs-comment">#</span><br><span class="hljs-comment">#   $ sh install-docker.sh --dry-run</span><br><span class="hljs-comment">#</span><br><span class="hljs-comment"># 4. run the script either as root, or using sudo to perform the installation.</span><br><span class="hljs-comment">#</span><br><span class="hljs-comment">#   $ sudo sh install-docker.sh</span><br></code></pre></td></tr></table></figure><p>记得使用科学的上网方式进行安装哦</p><h3 id="pull异常-教程-切换镜像站"><a href="#pull异常-教程-切换镜像站" class="headerlink" title="pull异常 教程 切换镜像站"></a><strong>pull异常 教程 切换镜像站</strong></h3><h4 id="一键配置脚本"><a href="#一键配置脚本" class="headerlink" title="一键配置脚本"></a>一键配置脚本</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">bash &lt;(wget -qO- https://xuanyuan.cloud/docker.sh)<br></code></pre></td></tr></table></figure><p>**支持系统：**OpenCloudOS、Ubuntu、Debian、CentOS、RHEL、Rocky Linux 等主流发行版。</p><hr><h2 id="二、-核心运行参数详解-docker-run"><a href="#二、-核心运行参数详解-docker-run" class="headerlink" title="二、 核心运行参数详解 (docker run)"></a>二、 核心运行参数详解 (docker run)</h2><p>在使用 Docker 时，最常用的命令就是 <code>docker run</code>。这个命令后面经常跟着一串“英文字母”参数，理解这些参数是入门的关键。</p><p><img src="https://usual1009.oss-cn-shanghai.aliyuncs.com/img/20260116161801764.png" alt="image-20260116161801658"></p><p>以下是常用参数的深度解析：</p><h3 id="1-i：交互式操作-interactive"><a href="#1-i：交互式操作-interactive" class="headerlink" title="1. -i：交互式操作 (interactive)"></a>1. <code>-i</code>：交互式操作 (interactive)</h3><ul><li><strong>通俗解释</strong>：保持容器的标准输入（STDIN）开启。</li><li><strong>为什么要用</strong>：如果你想在容器启动后输入命令，就必须带上这个参数。它就像是连接了容器的“麦克风”，让它能听见你说话。</li></ul><h3 id="2-t：终端-tty"><a href="#2-t：终端-tty" class="headerlink" title="2. -t：终端 (tty)"></a>2. <code>-t</code>：终端 (tty)</h3><ul><li><strong>通俗解释</strong>：为容器分配一个伪终端。</li><li><strong>为什么要用</strong>：它会为你提供一个类似于 Linux 终端的命令行界面。通常与 <code>-i</code> 连用（<code>-it</code>），让你感觉就像直接登录进了另一台电脑的黑色窗口。</li></ul><h3 id="3-d：后台运行-detach"><a href="#3-d：后台运行-detach" class="headerlink" title="3. -d：后台运行 (detach)"></a>3. <code>-d</code>：后台运行 (detach)</h3><ul><li><strong>通俗解释</strong>：容器启动后会在后台运行，不会占用你当前的终端窗口。</li><li><strong>为什么要用</strong>：当你运行一个网站服务器（如 Nginx）或数据库（如 MySQL）时，你不希望它一直霸占着你的屏幕，这时就用 <code>-d</code>。</li></ul><h3 id="4-p：端口映射-publish"><a href="#4-p：端口映射-publish" class="headerlink" title="4. -p：端口映射 (publish)"></a>4. <code>-p</code>：端口映射 (publish)</h3><ul><li><strong>格式</strong>：<code>-p 宿主机端口:容器内端口</code></li><li><strong>通俗解释</strong>：在容器的“围墙”上开扇窗户。</li><li><strong>为什么要用</strong>：容器内部是一个隔离的网络。如果你在容器内部运行了一个 80 端口的 Web 服务，外部是访问不到的。通过 <code>-p 8080:80</code>，你可以访问电脑的 <code>localhost:8080</code>，流量会自动转发到容器内部的 80 端口。</li></ul><h3 id="5-name：指定容器名称"><a href="#5-name：指定容器名称" class="headerlink" title="5. --name：指定容器名称"></a>5. <code>--name</code>：指定容器名称</h3><ul><li><strong>通俗解释</strong>：给你的容器起个“绰号”。</li><li><strong>为什么要用</strong>：如果不指定，Docker 会随机给它起一个类似 <code>determined_shirley</code> 的名字。指定名字（如 <code>--name my-web</code>）方便你后续停止或删除它。</li></ul><h3 id="6-v-挂载卷"><a href="#6-v-挂载卷" class="headerlink" title="6. -v : 挂载卷"></a>6. <code>-v</code> : 挂载卷</h3><p>在掌握了基础的容器运行（<code>-itd</code>）和端口映射（<code>-p</code>）后，另一个至关重要的参数就是 <strong><code>-v</code></strong>。如果你不学会使用 <code>-v</code>，那么你的 Docker 容器就像一个没有硬盘的临时电脑，一旦关机（删除容器），所有数据都会灰飞烟灭。</p><hr><h4 id="1️⃣、-v-是什么？"><a href="#1️⃣、-v-是什么？" class="headerlink" title="1️⃣、 -v 是什么？"></a>1️⃣、 <code>-v</code> 是什么？</h4><p><strong><code>-v</code> 代表 Volume（卷）</strong>，也常被称为 <strong>“挂载”</strong>。</p><ul><li><strong>通俗解释</strong>：它就像是在你的宿主机（真实的 Windows 或 Linux 电脑）和 Docker 容器之间拉了一根“传送带”或者建立了一个“共享文件夹”。</li><li><strong>核心功能</strong>：将宿主机的目录或文件，映射到容器内部。</li></ul><hr><h4 id="2️⃣、-为什么要用-v？（解决两大痛点）"><a href="#2️⃣、-为什么要用-v？（解决两大痛点）" class="headerlink" title="2️⃣、 为什么要用 -v？（解决两大痛点）"></a>2️⃣、 为什么要用 <code>-v</code>？（解决两大痛点）</h4><h6 id="1-数据持久化（防止丢失）"><a href="#1-数据持久化（防止丢失）" class="headerlink" title="1. 数据持久化（防止丢失）"></a>1. 数据持久化（防止丢失）</h6><p>默认情况下，你在容器里创建的任何文件（比如数据库里的数据、用户上传的图片）都保存在容器的层中。<strong>一旦你执行了 <code>docker rm</code> 删除了容器，这些数据会全部消失。</strong><br>通过 <code>-v</code>，你把数据存在宿主机上，即使容器删了，新建一个容器挂载同一个目录，数据依然在。</p><h6 id="2-修改方便（实时同步）"><a href="#2-修改方便（实时同步）" class="headerlink" title="2. 修改方便（实时同步）"></a>2. 修改方便（实时同步）</h6><p>如果你想修改容器里的配置文件（比如 Nginx 的 <code>index.html</code>），你不需要每次都进入容器内部去写代码。你只需要在外面（Windows&#x2F;Linux）修改那个挂载的文件夹，容器内部会<strong>实时同步</strong>生效。</p><hr><h4 id="3️⃣、-v-的语法格式"><a href="#3️⃣、-v-的语法格式" class="headerlink" title="3️⃣、 -v 的语法格式"></a>3️⃣、 <code>-v</code> 的语法格式</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">-v [宿主机绝对路径]:[容器内绝对路径]:[权限]<br></code></pre></td></tr></table></figure><h6 id="1-宿主机路径-Host-Path"><a href="#1-宿主机路径-Host-Path" class="headerlink" title="1. 宿主机路径 (Host Path)"></a>1. 宿主机路径 (Host Path)</h6><p>你电脑上的真实路径，例如 <code>D:\web_data</code> (Windows) 或 <code>/home/user/app</code> (Linux)。</p><h6 id="2-容器内路径-Container-Path"><a href="#2-容器内路径-Container-Path" class="headerlink" title="2. 容器内路径 (Container Path)"></a>2. 容器内路径 (Container Path)</h6><p>镜像中预设的路径，例如 Nginx 存放网页的 <code>/usr/share/nginx/html</code>。</p><h6 id="3-权限-可选"><a href="#3-权限-可选" class="headerlink" title="3. 权限 (可选)"></a>3. 权限 (可选)</h6><ul><li><code>rw</code>: 读写（默认）。</li><li><code>ro</code>: 只读（read-only）。如果你希望容器只能看文件，不能改文件，就加上 <code>:ro</code>。</li></ul><hr><h4 id="4️⃣、-实战案例：一分钟修改网页内容"><a href="#4️⃣、-实战案例：一分钟修改网页内容" class="headerlink" title="4️⃣、 实战案例：一分钟修改网页内容"></a>4️⃣、 实战案例：一分钟修改网页内容</h4><p>假设我们想运行一个 Nginx 容器，但不想用它默认的欢迎页面，而是用我们自己电脑上的 HTML 文件。</p><h5 id="1-在宿主机创建文件"><a href="#1-在宿主机创建文件" class="headerlink" title="1. 在宿主机创建文件"></a>1. 在宿主机创建文件</h5><p>在 Linux 的 <code>/root/html</code> 目录下（或 Windows 的某个文件夹下）创建一个 <code>index.html</code>，内容写上 <code>&lt;h1&gt;Hello Docker Volume!&lt;/h1&gt;</code>。</p><h5 id="2-运行挂载命令"><a href="#2-运行挂载命令" class="headerlink" title="2. 运行挂载命令"></a>2. 运行挂载命令</h5><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run -d \<br>  --name my-nginx-web \<br>  -p 8080:80 \<br>  -v /root/html:/usr/share/nginx/html \<br>  nginx<br></code></pre></td></tr></table></figure><p><strong>命令拆解：</strong></p><ul><li><strong><code>-d</code></strong>: 后台运行。</li><li><strong><code>-p 8080:80</code></strong>: 电脑 8080 端口映射容器 80 端口。</li><li><strong><code>-v /root/html:/usr/share/nginx/html</code></strong>: <ul><li><strong>把外部的</strong> <code>/root/html</code> 文件夹。</li><li><strong>映射到内部的</strong> <code>/usr/share/nginx/html</code>。</li></ul></li><li><strong><code>nginx</code></strong>: 镜像名。</li></ul><h5 id="3-验证结果"><a href="#3-验证结果" class="headerlink" title="3. 验证结果"></a>3. 验证结果</h5><p>现在你访问 <code>http://localhost:8080</code>，看到的不再是 Nginx 默认页面，而是你刚才写的 <code>Hello Docker Volume!</code>。<br><strong>神奇之处：</strong> 此时你修改宿主机 <code>/root/html/index.html</code> 里的内容，刷新浏览器，页面会立刻变化，无需重启容器！</p><hr><h4 id="5️⃣、-匿名卷与具名卷（进阶）"><a href="#5️⃣、-匿名卷与具名卷（进阶）" class="headerlink" title="5️⃣、 匿名卷与具名卷（进阶）"></a>5️⃣、 匿名卷与具名卷（进阶）</h4><p>除了上面这种指定具体路径的“绑定挂载”（Bind Mount），Docker 还有两种常见方式：</p><ol><li><p><strong>匿名卷</strong>：<br><code>-v /data</code><br>（只写了容器内路径。Docker 会自动在宿主机深处创建一个随机名字的文件夹。通常用于不关心数据存在哪，只要能持久化就行的情况。）</p></li><li><p><strong>具名卷</strong>：<br><code>-v my_db_data:/var/lib/mysql</code><br>（<code>my_db_data</code> 是一个名字。Docker 会管理这个卷。你可以通过 <code>docker volume ls</code> 看到它。这种方式最推荐，因为它由 Docker 统一管理，方便备份和迁移。）</p><p>你要学会管理你的“具名卷”，主要靠这几个指令：</p><table><thead><tr><th align="left">命令</th><th align="left">作用</th></tr></thead><tbody><tr><td align="left"><strong><code>docker volume ls</code></strong></td><td align="left">查看当前所有的命名卷（看看有哪些保险柜）</td></tr><tr><td align="left"><strong><code>docker volume inspect &lt;卷名&gt;</code></strong></td><td align="left">查看这个卷在硬盘的什么位置（通常在 <code>/var/lib/docker/volumes/</code>）</td></tr><tr><td align="left"><strong><code>docker volume create &lt;卷名&gt;</code></strong></td><td align="left">手动创建一个卷（可选，通常运行 <code>run</code> 时会自动创建）</td></tr><tr><td align="left"><strong><code>docker volume rm &lt;卷名&gt;</code></strong></td><td align="left">删除一个卷（注意：删了数据就真没了）</td></tr><tr><td align="left"><strong><code>docker volume prune</code></strong></td><td align="left">删除所有没在使用的卷（清理空间）</td></tr></tbody></table></li></ol><hr><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 默认情况（不加 -a）：</span><br>docker volume prune<br><span class="hljs-comment"># 只删除未被任何容器引用的卷</span><br><br><span class="hljs-comment"># 使用 -a 选项：</span><br>docker volume prune -a<br><span class="hljs-comment"># 删除所有未使用的卷，包括：</span><br><span class="hljs-comment"># 1. 未被引用的卷</span><br><span class="hljs-comment"># 2. 匿名卷</span><br><span class="hljs-comment"># 3. 悬空卷</span><br></code></pre></td></tr></table></figure><h5 id="实战演示：如何使用命名卷"><a href="#实战演示：如何使用命名卷" class="headerlink" title="实战演示：如何使用命名卷"></a>实战演示：如何使用命名卷</h5><h6 id="第一步：运行容器并绑定命名卷"><a href="#第一步：运行容器并绑定命名卷" class="headerlink" title="第一步：运行容器并绑定命名卷"></a>第一步：运行容器并绑定命名卷</h6><p>你不需要手动创建卷，直接运行命令，Docker 发现卷不存在会自动创建：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 运行一个 Nginx，把网页存到名为 my_web_data 的卷里</span><br>docker run -d \<br>  --name my_nginx \<br>  -p 8081:80 \<br>  -v my_web_data:/usr/share/nginx/html \<br>  nginx<br></code></pre></td></tr></table></figure><h6 id="第二步：查看卷是否生成"><a href="#第二步：查看卷是否生成" class="headerlink" title="第二步：查看卷是否生成"></a>第二步：查看卷是否生成</h6><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker volume <span class="hljs-built_in">ls</span><br></code></pre></td></tr></table></figure><p>你会看到列表中多了一个 <code>my_web_data</code>。</p><h6 id="第三步：查看卷的真实位置（仅限-Linux）"><a href="#第三步：查看卷的真实位置（仅限-Linux）" class="headerlink" title="第三步：查看卷的真实位置（仅限 Linux）"></a>第三步：查看卷的真实位置（仅限 Linux）</h6><p>如果你想知道 Docker 把数据存哪了：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker volume inspect my_web_data<br></code></pre></td></tr></table></figure><p>在输出的 <code>Mountpoint</code> 字段，你会看到类似 <code>/var/lib/docker/volumes/my_web_data/_data</code> 的路径。</p><hr><h6 id="5-常见困惑：命名卷-vs-绑定挂载"><a href="#5-常见困惑：命名卷-vs-绑定挂载" class="headerlink" title="5. 常见困惑：命名卷 vs 绑定挂载"></a>5. 常见困惑：命名卷 vs 绑定挂载</h6><table><thead><tr><th align="left">特性</th><th align="left">命名卷 (<code>-v my_vol:/app</code>)</th><th align="left">绑定挂载 (<code>-v /root/data:/app</code>)</th></tr></thead><tbody><tr><td align="left"><strong>存储位置</strong></td><td align="left">Docker 管理的特定区域</td><td align="left">你自己指定的任何地方</td></tr><tr><td align="left"><strong>管理方式</strong></td><td align="left">通过 Docker 命令管理</td><td align="left">通过文件浏览器或系统命令管理</td></tr><tr><td align="left"><strong>适用场景</strong></td><td align="left">数据库存储、持久化配置文件</td><td align="left">开发环境（需要实时改代码）</td></tr><tr><td align="left"><strong>对初学者</strong></td><td align="left"><strong>更推荐（不容易写错路径）</strong></td><td align="left">需要搞清楚宿主机绝对路径</td></tr></tbody></table><h4 id="6️⃣、-小结"><a href="#6️⃣、-小结" class="headerlink" title="6️⃣、 小结"></a>6️⃣、 小结</h4><table><thead><tr><th align="left">参数项</th><th align="left">全称</th><th align="left">作用</th><th align="left">就像是…</th></tr></thead><tbody><tr><td align="left"><strong>-v</strong></td><td align="left"><strong>Volume</strong></td><td align="left"><strong>数据挂载</strong></td><td align="left">给容器插了一块“外接硬盘”</td></tr></tbody></table><p><strong>使用建议：</strong></p><ul><li><strong>数据库（MySQL&#x2F;Redis）</strong>：一定要用 <code>-v</code>，否则删容器等于删库跑路。</li><li><strong>配置文件</strong>：建议用 <code>-v</code>，方便在外面改配置。</li><li><strong>日志文件</strong>：建议用 <code>-v</code>，方便在宿主机直接查看日志，不用进容器。</li></ul><hr><p><em>注意：尽管 <code>-v</code> 是 Docker 的标准操作，但在 Windows 环境下使用 WSL 2 挂载路径时，可能会遇到文件权限或路径格式转换的问题，操作时请留意报错信息。</em></p><hr><h3 id="7-e-设置环境变量"><a href="#7-e-设置环境变量" class="headerlink" title="7. -e : 设置环境变量"></a>7. <code>-e</code> : <strong>设置环境变量</strong></h3><h4 id="作用："><a href="#作用：" class="headerlink" title="作用："></a><strong>作用：</strong></h4><p>向容器内部<strong>传递环境变量</strong>，常用于配置应用程序。</p><h4 id="基本语法："><a href="#基本语法：" class="headerlink" title="基本语法："></a><strong>基本语法：</strong></h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run -e KEY=VALUE &lt;镜像&gt;<br></code></pre></td></tr></table></figure><h4 id="使用示例："><a href="#使用示例：" class="headerlink" title="使用示例："></a><strong>使用示例：</strong></h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 设置单个环境变量</span><br>docker run -d -e MYSQL_ROOT_PASSWORD=123456 mysql<br><br><span class="hljs-comment"># 设置多个环境变量</span><br>docker run -d \<br>  -e MYSQL_ROOT_PASSWORD=123456 \<br>  -e MYSQL_DATABASE=mydb \<br>  -e MYSQL_USER=admin \<br>  mysql<br><br><span class="hljs-comment"># 从文件读取环境变量</span><br>docker run -d --env-file .<span class="hljs-built_in">env</span> mysql<br></code></pre></td></tr></table></figure><h4 id="📊-实际应用场景"><a href="#📊-实际应用场景" class="headerlink" title="📊 实际应用场景"></a>📊 <strong>实际应用场景</strong></h4><h5 id="场景1：运行数据库"><a href="#场景1：运行数据库" class="headerlink" title="场景1：运行数据库"></a><strong>场景1：运行数据库</strong></h5><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># MySQL容器需要root密码</span><br>docker run -d \<br>  --name mysql-db \<br>  -e MYSQL_ROOT_PASSWORD=mysecretpassword \<br>  -e MYSQL_DATABASE=appdb \<br>  -p 3306:3306 \<br>  mysql:8.0<br></code></pre></td></tr></table></figure><h5 id="场景2：运行Web应用"><a href="#场景2：运行Web应用" class="headerlink" title="场景2：运行Web应用"></a><strong>场景2：运行Web应用</strong></h5><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># Node.js应用配置</span><br>docker run -d \<br>  --name myapp \<br>  -e NODE_ENV=production \<br>  -e DATABASE_URL=postgres://user:pass@db:5432/db \<br>  -e REDIS_URL=redis://redis:6379 \<br>  -p 3000:3000 \<br>  my-node-app<br></code></pre></td></tr></table></figure><h5 id="场景3：运行Redis"><a href="#场景3：运行Redis" class="headerlink" title="场景3：运行Redis"></a><strong>场景3：运行Redis</strong></h5><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># Redis设置密码</span><br>docker run -d \<br>  --name redis-cache \<br>  -e REDIS_PASSWORD=myredispass \<br>  -p 6379:6379 \<br>  redis:alpine<br></code></pre></td></tr></table></figure><h4 id="🔧-组合使用示例"><a href="#🔧-组合使用示例" class="headerlink" title="🔧 组合使用示例"></a>🔧 <strong>组合使用示例</strong></h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 典型组合：后台运行 + 环境变量 + 端口映射</span><br>docker run -d \<br>  --name webapp \<br>  -e APP_ENV=production \<br>  -e DB_HOST=mysql \<br>  -p 80:80 \<br>  -p 443:443 \<br>  nginx:latest<br><br><span class="hljs-comment"># 分解：</span><br><span class="hljs-comment"># -d          → 后台运行</span><br><span class="hljs-comment"># --name      → 指定容器名称</span><br><span class="hljs-comment"># -e          → 设置环境变量</span><br><span class="hljs-comment"># -p          → 端口映射</span><br></code></pre></td></tr></table></figure><h4 id="📋-常用组合模式"><a href="#📋-常用组合模式" class="headerlink" title="📋 常用组合模式"></a>📋 <strong>常用组合模式</strong></h4><table><thead><tr><th align="left">场景</th><th align="left">典型命令</th><th align="left">说明</th></tr></thead><tbody><tr><td align="left">快速测试</td><td align="left"><code>docker run -it --rm alpine sh</code></td><td align="left">交互式临时容器</td></tr><tr><td align="left">后台服务</td><td align="left"><code>docker run -d -p 80:80 nginx</code></td><td align="left">Web服务器</td></tr><tr><td align="left">数据库</td><td align="left"><code>docker run -d -e VAR=val mysql</code></td><td align="left">需要配置的服务</td></tr><tr><td align="left">开发环境</td><td align="left"><code>docker run -d -v $(pwd):/app node</code></td><td align="left">挂载代码目录</td></tr></tbody></table><h4 id="💡-实用技巧"><a href="#💡-实用技巧" class="headerlink" title="💡 实用技巧"></a>💡 <strong>实用技巧</strong></h4><h5 id="1-查看容器环境变量"><a href="#1-查看容器环境变量" class="headerlink" title="1. 查看容器环境变量"></a><strong>1. 查看容器环境变量</strong></h5><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 查看已设置的环境变量</span><br>docker <span class="hljs-built_in">exec</span> &lt;容器&gt; <span class="hljs-built_in">env</span><br><br><span class="hljs-comment"># 查看单个变量</span><br>docker <span class="hljs-built_in">exec</span> &lt;容器&gt; <span class="hljs-built_in">printenv</span> NODE_ENV<br></code></pre></td></tr></table></figure><h5 id="2-动态修改环境变量"><a href="#2-动态修改环境变量" class="headerlink" title="2. 动态修改环境变量"></a><strong>2. 动态修改环境变量</strong></h5><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 创建时忘记设置？需要重新创建</span><br>docker stop &lt;容器&gt;<br>docker <span class="hljs-built_in">rm</span> &lt;容器&gt;<br>docker run -d -e NEW_VAR=value ...  <span class="hljs-comment"># 重新创建</span><br></code></pre></td></tr></table></figure><h5 id="3-使用环境变量文件"><a href="#3-使用环境变量文件" class="headerlink" title="3. 使用环境变量文件"></a><strong>3. 使用环境变量文件</strong></h5><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># .env 文件内容：</span><br>DB_PASSWORD=secret123<br>API_KEY=abc123xyz<br><br><span class="hljs-comment"># 启动时引用</span><br>docker run -d --env-file .<span class="hljs-built_in">env</span> myapp<br></code></pre></td></tr></table></figure><h4 id="⚠️-注意事项"><a href="#⚠️-注意事项" class="headerlink" title="⚠️ 注意事项"></a>⚠️ <strong>注意事项</strong></h4><h5 id="e-的注意事项："><a href="#e-的注意事项：" class="headerlink" title="-e 的注意事项："></a><strong><code>-e</code> 的注意事项：</strong></h5><ol><li><p><strong>敏感信息</strong>：不要在命令中直接写密码（会出现在history中）</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 不安全（密码在history中可见）</span><br>docker run -e PASSWORD=123456 app<br><br><span class="hljs-comment"># 相对安全（从变量读取）</span><br><span class="hljs-built_in">export</span> DB_PASS=123456<br>docker run -e PASSWORD=<span class="hljs-variable">$DB_PASS</span> app<br><br><span class="hljs-comment"># 最安全（使用Docker Secrets或环境文件）</span><br>docker run --env-file .secrets app<br></code></pre></td></tr></table></figure></li><li><p><strong>变量覆盖</strong>：容器内已有的环境变量会被覆盖</p></li><li><p><strong>特殊字符</strong>：包含空格或特殊字符的值需要引号</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run -e GREETING=<span class="hljs-string">&quot;Hello World&quot;</span> app<br></code></pre></td></tr></table></figure></li></ol><h5 id="🆚-it-与-d-对比"><a href="#🆚-it-与-d-对比" class="headerlink" title="🆚 -it 与 -d 对比"></a>🆚 <strong><code>-it</code> 与 <code>-d</code> 对比</strong></h5><table><thead><tr><th align="left">选项</th><th align="left">用途</th><th align="left">适用场景</th></tr></thead><tbody><tr><td align="left"><code>-it</code></td><td align="left">交互式终端</td><td align="left">调试、进入容器、执行命令</td></tr><tr><td align="left"><code>-d</code></td><td align="left">后台运行</td><td align="left">长期运行的服务（Web、DB等）</td></tr></tbody></table><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 组合使用：先调试，后后台运行</span><br>docker run -it --<span class="hljs-built_in">rm</span> alpine sh      <span class="hljs-comment"># 调试镜像</span><br>docker run -d --name myapp alpine  <span class="hljs-comment"># 正式运行</span><br></code></pre></td></tr></table></figure><ul><li><strong><code>-d</code> *<em>→*</em> D</strong>etached（分离）→ 后台运行</li><li><strong><code>-e</code> *<em>→*</em> E</strong>nvironment（环境）→ 环境变量</li><li><strong><code>-it</code> *<em>→*</em> I*<em>nteractive +*</em> T</strong>TY → 交互式终端</li></ul><h3 id="8-name-自定义容器名称"><a href="#8-name-自定义容器名称" class="headerlink" title="8. --name : 自定义容器名称"></a>8. <code>--name</code> : <strong>自定义容器名称</strong></h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run --name &lt;容器名称&gt; &lt;镜像&gt;<br></code></pre></td></tr></table></figure><h5 id="📚-优点"><a href="#📚-优点" class="headerlink" title="📚 优点"></a>📚 优点</h5><p><strong>不使用 –name 的情况：</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run nginx<br><span class="hljs-comment"># Docker会自动生成一个随机名称，如：</span><br><span class="hljs-comment"># romantic_babbage</span><br><span class="hljs-comment"># angry_goldberg</span><br><span class="hljs-comment"># sleepy_curie</span><br></code></pre></td></tr></table></figure><p><strong>使用 –name 的好处：</strong></p><ol><li><strong>易于记忆</strong>：<code>my-nginx</code> 比 <code>romantic_babbage</code> 好记</li><li><strong>便于管理</strong>：停止、启动、删除时不用记ID</li><li><strong>避免冲突</strong>：明确知道每个容器的用途</li><li><strong>脚本友好</strong>：在脚本中使用名称而不是ID</li></ol><h5 id="🔧-基本用法"><a href="#🔧-基本用法" class="headerlink" title="🔧 基本用法"></a>🔧 <strong>基本用法</strong></h5><h6 id="1-给容器起名字"><a href="#1-给容器起名字" class="headerlink" title="1. 给容器起名字"></a><strong>1. 给容器起名字</strong></h6><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 运行一个名为 &quot;web-server&quot; 的nginx容器</span><br>docker run -d --name web-server nginx<br><br><span class="hljs-comment"># 运行一个名为 &quot;mysql-db&quot; 的MySQL容器</span><br>docker run -d --name mysql-db -e MYSQL_ROOT_PASSWORD=123456 mysql<br></code></pre></td></tr></table></figure><h6 id="2-使用名称管理容器"><a href="#2-使用名称管理容器" class="headerlink" title="2. 使用名称管理容器"></a><strong>2. 使用名称管理容器</strong></h6><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 停止容器</span><br>docker stop web-server<br><br><span class="hljs-comment"># 启动容器</span><br>docker start web-server<br><br><span class="hljs-comment"># 重启容器</span><br>docker restart web-server<br><br><span class="hljs-comment"># 查看容器日志</span><br>docker logs web-server<br><br><span class="hljs-comment"># 进入容器</span><br>docker <span class="hljs-built_in">exec</span> -it web-server bash<br><br><span class="hljs-comment"># 删除容器</span><br>docker <span class="hljs-built_in">rm</span> web-server<br></code></pre></td></tr></table></figure><h6 id="综合实战演示"><a href="#综合实战演示" class="headerlink" title="综合实战演示"></a>综合实战演示</h6><p>让我们把上面的参数串起来，运行一个 Nginx（网页服务器）容器：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run -itd --name my-nginx -p 8888:80 nginx<br></code></pre></td></tr></table></figure><p><strong>这段命令的意思是：</strong></p><ol><li><strong><code>docker run</code></strong>: 启动一个新容器。</li><li><strong><code>-itd</code></strong>: 结合了交互、终端和后台运行。意味着它在后台活着，但如果你想进入它内部，它也为你准备好了终端。</li><li><strong><code>--name my-nginx</code></strong>: 给容器起名叫 <code>my-nginx</code>。</li><li><strong><code>-p 8888:80</code></strong>: 把容器里的 80 端口映射到我电脑的 8888 端口。</li><li><strong><code>nginx</code></strong>: 使用的镜像名称。</li></ol><p>执行完后，你在浏览器输入 <code>localhost:8888</code> 就能看到 Nginx 的欢迎页面了。</p><h3 id="9-restart-重启策略"><a href="#9-restart-重启策略" class="headerlink" title="9. --restart : 重启策略"></a>9. <code>--restart</code> : 重启策略</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run --restart &lt;策略&gt; &lt;镜像&gt;<br></code></pre></td></tr></table></figure><h5 id="📚-四种重启策略"><a href="#📚-四种重启策略" class="headerlink" title="📚 四种重启策略"></a>📚 <strong>四种重启策略</strong></h5><p><strong>1. <code>no</code> - 不自动重启（默认）</strong></p><p>bash</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run --restart no nginx<br><span class="hljs-comment"># 或省略（默认就是no）</span><br>docker run nginx<br></code></pre></td></tr></table></figure><p><strong>特点：</strong></p><ul><li>容器退出后<strong>不会自动重启</strong></li><li>适用于一次性任务、测试容器</li></ul><p><strong>2. <code>always</code> - 总是重启</strong></p><p>bash</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run --restart always nginx<br></code></pre></td></tr></table></figure><p><strong>特点：</strong></p><ul><li>容器退出时<strong>总是重启</strong></li><li>无论退出状态码是什么（0或非0）</li><li>适用于必须保持运行的服务</li></ul><p><strong>3. <code>on-failure</code> - 失败时重启</strong></p><p>bash</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run --restart on-failure nginx<br><span class="hljs-comment"># 或指定最大重试次数</span><br>docker run --restart on-failure:5 nginx<br></code></pre></td></tr></table></figure><p><strong>特点：</strong></p><ul><li>只有<strong>非0状态码退出</strong>时才重启</li><li>可以指定最大重试次数</li><li>适用于可能出错但需要恢复的服务</li></ul><p><strong>4. <code>unless-stopped</code> - 除非手动停止</strong></p><p>bash</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run --restart unless-stopped nginx<br></code></pre></td></tr></table></figure><p><strong>特点：</strong></p><ul><li>容器退出时重启，<strong>除非用户手动停止</strong></li><li>Docker守护进程重启后，容器也会自动启动</li><li><strong>最常用</strong>的生产环境策略</li></ul><h5 id="📊-策略对比表"><a href="#📊-策略对比表" class="headerlink" title="📊 策略对比表"></a>📊 <strong>策略对比表</strong></h5><table><thead><tr><th align="left">策略</th><th align="left">退出时重启</th><th align="left">Docker重启时启动</th><th align="left">手动停止后</th><th align="left">适用场景</th></tr></thead><tbody><tr><td align="left"><code>no</code></td><td align="left">❌ 否</td><td align="left">❌ 否</td><td align="left">-</td><td align="left">测试、一次性任务</td></tr><tr><td align="left"><code>always</code></td><td align="left">✅ 总是</td><td align="left">✅ 是</td><td align="left">✅ 会重启</td><td align="left">必须持续运行的服务</td></tr><tr><td align="left"><code>on-failure</code></td><td align="left">⚠️ 失败时</td><td align="left">✅ 是</td><td align="left">-</td><td align="left">可能出错的服务</td></tr><tr><td align="left"><code>unless-stopped</code></td><td align="left">✅ 总是</td><td align="left">✅ 是</td><td align="left">❌ 不重启</td><td align="left"><strong>生产环境推荐</strong></td></tr></tbody></table><hr><h2 id="四、-常用管理命令"><a href="#四、-常用管理命令" class="headerlink" title="四、 常用管理命令"></a>四、 常用管理命令</h2><h3 id="1-查看容器状态"><a href="#1-查看容器状态" class="headerlink" title="1. 查看容器状态"></a>1. 查看容器状态</h3><ul><li><code>docker ps</code>: 查看当前正在运行的容器。</li><li><code>docker ps -a</code>: 查看所有容器（包括已经停止的）。</li></ul><h3 id="2-停止与启动"><a href="#2-停止与启动" class="headerlink" title="2. 停止与启动"></a>2. 停止与启动</h3><ul><li><code>docker stop my-nginx</code>: 停止名为 <code>my-nginx</code> 的容器。</li><li><code>docker start my-nginx</code>: 再次启动它。</li></ul><h3 id="3-进入容器内部"><a href="#3-进入容器内部" class="headerlink" title="3. 进入容器内部"></a>3. 进入容器内部</h3><p>如果你想进到容器里修改文件，使用：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker <span class="hljs-built_in">exec</span> -it my-nginx /bin/bash<br></code></pre></td></tr></table></figure><h3 id="4-删除容器与镜像"><a href="#4-删除容器与镜像" class="headerlink" title="4. 删除容器与镜像"></a>4. 删除容器与镜像</h3><ul><li><code>docker rm -f my-nginx</code>: 强制删除运行中的容器。</li><li><code>docker rmi nginx</code>: 删除本地的 nginx 镜像。</li></ul><hr><h2 id="五、-Docker-常用命令速查表"><a href="#五、-Docker-常用命令速查表" class="headerlink" title="五、 Docker 常用命令速查表"></a>五、 Docker 常用命令速查表</h2><h3 id="📋-核心命令对比表"><a href="#📋-核心命令对比表" class="headerlink" title="📋 核心命令对比表"></a>📋 核心命令对比表</h3><table><thead><tr><th align="left">命令</th><th align="left">作用</th><th align="left">常用选项</th><th align="left">示例</th><th align="left">说明</th></tr></thead><tbody><tr><td align="left"><strong><code>docker pull</code></strong></td><td align="left">拉取镜像</td><td align="left"><code>-a</code>：所有标签 <code>--platform</code>：指定平台</td><td align="left"><code>docker pull nginx:alpine</code></td><td align="left">只下载镜像，不运行</td></tr><tr><td align="left"><strong><code>docker create</code></strong></td><td align="left">创建容器</td><td align="left"><code>--name</code>：命名 <code>-it</code>：交互终端 <code>-p</code>：端口映射 <code>-v</code>：卷挂载 <code>-e</code>：环境变量</td><td align="left"><code>docker create --name myapp nginx</code></td><td align="left">只创建，不启动</td></tr><tr><td align="left"><strong><code>docker run</code></strong></td><td align="left">创建并启动容器</td><td align="left"><code>-d</code>：后台运行 <code>--rm</code>：退出后删除 <code>--restart</code>：重启策略</td><td align="left"><code>docker run -d -p 80:80 nginx</code></td><td align="left"><strong>最常用</strong>，等于 create + start</td></tr><tr><td align="left"><strong><code>docker start</code></strong></td><td align="left">启动已存在的容器</td><td align="left"><code>-a</code>：附加输出 <code>-i</code>：交互模式</td><td align="left"><code>docker start myapp</code></td><td align="left">启动已停止的容器</td></tr><tr><td align="left"><strong><code>docker stop</code></strong></td><td align="left">停止运行中的容器</td><td align="left"><code>-t</code>：超时时间（秒）</td><td align="left"><code>docker stop myapp</code></td><td align="left">优雅停止（SIGTERM）</td></tr><tr><td align="left"><strong><code>docker restart</code></strong></td><td align="left">重启容器</td><td align="left"><code>-t</code>：超时时间</td><td align="left"><code>docker restart myapp</code></td><td align="left">等于 stop + start</td></tr><tr><td align="left"><strong><code>docker pause</code></strong></td><td align="left">暂停容器</td><td align="left">无</td><td align="left"><code>docker pause myapp</code></td><td align="left">暂停所有进程</td></tr><tr><td align="left"><strong><code>docker unpause</code></strong></td><td align="left">恢复容器</td><td align="left">无</td><td align="left"><code>docker unpause myapp</code></td><td align="left">恢复暂停的容器</td></tr><tr><td align="left"><strong><code>docker rm</code></strong></td><td align="left">删除容器</td><td align="left"><code>-f</code>：强制删除运行中的 <code>-v</code>：同时删除卷</td><td align="left"><code>docker rm -f myapp</code></td><td align="left">删除容器（镜像还在）</td></tr><tr><td align="left"><strong><code>docker rmi</code></strong></td><td align="left">删除镜像</td><td align="left"><code>-f</code>：强制删除</td><td align="left"><code>docker rmi nginx</code></td><td align="left">删除镜像</td></tr></tbody></table><h3 id="🔄-容器生命周期管理"><a href="#🔄-容器生命周期管理" class="headerlink" title="🔄 容器生命周期管理"></a>🔄 容器生命周期管理</h3><h4 id="完整流程示例："><a href="#完整流程示例：" class="headerlink" title="完整流程示例："></a><strong>完整流程示例：</strong></h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 1. 拉取镜像</span><br>docker pull nginx:alpine<br><br><span class="hljs-comment"># 2. 创建容器（不启动）</span><br>docker create --name web -p 80:80 nginx:alpine<br><br><span class="hljs-comment"># 3. 启动容器</span><br>docker start web<br><br><span class="hljs-comment"># 4. 停止容器</span><br>docker stop web<br><br><span class="hljs-comment"># 5. 重启容器</span><br>docker restart web<br><br><span class="hljs-comment"># 6. 删除容器</span><br>docker <span class="hljs-built_in">rm</span> web<br></code></pre></td></tr></table></figure><h4 id="快捷方式："><a href="#快捷方式：" class="headerlink" title="快捷方式："></a><strong>快捷方式：</strong></h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 等于上面1-3步</span><br>docker run -d --name web -p 80:80 nginx:alpine<br></code></pre></td></tr></table></figure><h3 id="📊-状态转换图"><a href="#📊-状态转换图" class="headerlink" title="📊 状态转换图"></a>📊 状态转换图</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs plaintext">docker pull<br>    ↓<br>[镜像仓库] → (镜像本地缓存)<br>    ↓<br>docker create → [容器创建] → docker start → [运行中]<br>    ↓                                   ↓<br>docker rm ← [已停止] ← docker stop      docker pause → [已暂停]<br>                                          ↓<br>                                        docker unpause<br></code></pre></td></tr></table></figure><h3 id="🎯-常用组合命令"><a href="#🎯-常用组合命令" class="headerlink" title="🎯 常用组合命令"></a>🎯 常用组合命令</h3><h4 id="开发测试："><a href="#开发测试：" class="headerlink" title="开发测试："></a><strong>开发测试：</strong></h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 临时运行，退出即删除</span><br>docker run -it --<span class="hljs-built_in">rm</span> alpine sh<br><br><span class="hljs-comment"># 拉取最新镜像并运行</span><br>docker pull node:latest &amp;&amp; docker run node<br></code></pre></td></tr></table></figure><h4 id="生产部署："><a href="#生产部署：" class="headerlink" title="生产部署："></a><strong>生产部署：</strong></h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 完整生产级容器</span><br>docker run -d \<br>  --name app-prod \<br>  --restart unless-stopped \<br>  -p 80:80 \<br>  -v app-data:/data \<br>  -e NODE_ENV=production \<br>  myapp:latest<br></code></pre></td></tr></table></figure><h4 id="批量操作："><a href="#批量操作：" class="headerlink" title="批量操作："></a><strong>批量操作：</strong></h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 停止所有容器</span><br>docker stop $(docker ps -q)<br><br><span class="hljs-comment"># 删除所有停止的容器</span><br>docker container prune<br><br><span class="hljs-comment"># 删除所有未使用的镜像</span><br>docker image prune -a<br></code></pre></td></tr></table></figure><h3 id="⚙️-选项详解表"><a href="#⚙️-选项详解表" class="headerlink" title="⚙️ 选项详解表"></a>⚙️ 选项详解表</h3><table><thead><tr><th>选项</th><th>适用命令</th><th>作用</th><th>示例</th></tr></thead><tbody><tr><td><strong><code>-d</code></strong></td><td><code>run</code></td><td>后台运行</td><td><code>docker run -d nginx</code></td></tr><tr><td><strong><code>-it</code></strong></td><td><code>run</code>, <code>create</code>, <code>exec</code></td><td>交互终端</td><td><code>docker run -it alpine sh</code></td></tr><tr><td><strong><code>--name</code></strong></td><td><code>run</code>, <code>create</code></td><td>容器命名</td><td><code>docker run --name myapp nginx</code></td></tr><tr><td><strong><code>-p</code></strong></td><td><code>run</code>, <code>create</code></td><td>端口映射</td><td><code>docker run -p 8080:80 nginx</code></td></tr><tr><td><strong><code>-v</code></strong></td><td><code>run</code>, <code>create</code></td><td>卷挂载</td><td><code>docker run -v /data:/app nginx</code></td></tr><tr><td><strong><code>-e</code></strong></td><td><code>run</code>, <code>create</code></td><td>环境变量</td><td><code>docker run -e KEY=value nginx</code></td></tr><tr><td><strong><code>--rm</code></strong></td><td><code>run</code></td><td>退出后删除</td><td><code>docker run --rm alpine echo hi</code></td></tr><tr><td><strong><code>--restart</code></strong></td><td><code>run</code>, <code>create</code></td><td>重启策略</td><td><code>docker run --restart always nginx</code></td></tr><tr><td><strong><code>-f</code></strong></td><td><code>rm</code>, <code>rmi</code></td><td>强制操作</td><td><code>docker rm -f myapp</code></td></tr><tr><td><strong><code>-a</code></strong></td><td><code>ps</code>, <code>start</code>, <code>pull</code></td><td>所有&#x2F;附加</td><td><code>docker ps -a</code></td></tr></tbody></table><h3 id="🔍-查看和监控"><a href="#🔍-查看和监控" class="headerlink" title="🔍 查看和监控"></a>🔍 查看和监控</h3><table><thead><tr><th>命令</th><th>作用</th><th>常用选项</th></tr></thead><tbody><tr><td><code>docker ps</code></td><td>查看容器</td><td><code>-a</code>：所有容器<br><code>-q</code>：只显示ID<br><code>--filter</code>：过滤</td></tr><tr><td><code>docker images</code></td><td>查看镜像</td><td><code>-a</code>：所有镜像<br><code>-q</code>：只显示ID</td></tr><tr><td><code>docker logs</code></td><td>查看日志</td><td><code>-f</code>：实时跟踪<br><code>--tail N</code>：最后N行</td></tr><tr><td><code>docker inspect</code></td><td>查看详情</td><td><code>-f</code>：格式化输出</td></tr><tr><td><code>docker stats</code></td><td>实时资源监控</td><td>无</td></tr><tr><td><code>docker top</code></td><td>查看容器进程</td><td>无</td></tr><tr><td><code>docker diff</code></td><td>查看文件变化</td><td>无</td></tr></tbody></table><h3 id="💡-实用技巧-1"><a href="#💡-实用技巧-1" class="headerlink" title="💡 实用技巧"></a>💡 实用技巧</h3><h4 id="1-一键清理"><a href="#1-一键清理" class="headerlink" title="1. 一键清理"></a><strong>1. 一键清理</strong></h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 清理所有未使用的资源</span><br>docker system prune -a<br><br><span class="hljs-comment"># 清理卷</span><br>docker volume prune<br></code></pre></td></tr></table></figure><h4 id="2-查看帮助"><a href="#2-查看帮助" class="headerlink" title="2. 查看帮助"></a><strong>2. 查看帮助</strong></h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 查看命令帮助</span><br>docker run --<span class="hljs-built_in">help</span><br><br><span class="hljs-comment"># 查看Docker版本</span><br>docker version<br><br><span class="hljs-comment"># 查看系统信息</span><br>docker info<br></code></pre></td></tr></table></figure><h4 id="3-导出和导入"><a href="#3-导出和导入" class="headerlink" title="3. 导出和导入"></a><strong>3. 导出和导入</strong></h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 导出容器为镜像</span><br>docker commit myapp myapp:backup<br><br><span class="hljs-comment"># 导出镜像为文件</span><br>docker save myapp:latest &gt; myapp.tar<br><br><span class="hljs-comment"># 从文件导入镜像</span><br>docker load &lt; myapp.tar<br></code></pre></td></tr></table></figure><h3 id="🚨-注意事项"><a href="#🚨-注意事项" class="headerlink" title="🚨 注意事项"></a>🚨 注意事项</h3><ol><li><p><strong><code>docker run</code> ≠ <code>docker create + start</code></strong></p><ul><li><code>run</code> 会应用所有运行时配置</li><li><code>create</code> 只创建，可以后续修改配置</li></ul></li><li><p><strong>停止 vs 删除</strong></p><ul><li><code>stop</code>：容器还在，可以重新启动</li><li><code>rm</code>：容器被删除，数据可能丢失（除非用了卷）</li></ul></li><li><p><strong>镜像 vs 容器</strong></p><ul><li><code>pull/rmi</code>：操作的是<strong>镜像</strong>（模板）</li><li><code>run/stop/rm</code>：操作的是<strong>容器</strong>（实例）</li></ul></li><li><p><strong>生产环境建议</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 总是使用 --name</span><br><span class="hljs-comment"># 总是使用 --restart unless-stopped</span><br><span class="hljs-comment"># 重要数据一定要用 -v 挂载卷</span><br></code></pre></td></tr></table></figure></li></ol><h3 id="📱-快速参考卡片"><a href="#📱-快速参考卡片" class="headerlink" title="📱 快速参考卡片"></a>📱 快速参考卡片</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 最常用组合（记住这个就够了）：</span><br>docker run -d --name &lt;名称&gt; -p &lt;端口&gt; -v &lt;卷&gt; --restart unless-stopped &lt;镜像&gt;<br><br><span class="hljs-comment"># 示例：</span><br>docker run -d --name web -p 80:80 -v html:/usr/share/nginx/html --restart unless-stopped nginx<br></code></pre></td></tr></table></figure><p>这个表格涵盖了 Docker 日常使用中 <strong>90%</strong> 的场景。掌握这些命令，你就能熟练管理 Docker 容器了！</p><h2 id="六、-总结"><a href="#六、-总结" class="headerlink" title="六、 总结"></a>六、 总结</h2><p>Docker 的核心逻辑就是：<strong>拉取镜像 -&gt; 运行容器 -&gt; 管理容器</strong>。</p><ul><li><strong>镜像</strong>是“安装包”。</li><li><strong>容器</strong>是安装好后“正在运行的程序”。</li><li><strong>参数</strong>（<code>-i</code>, <code>-t</code>, <code>-d</code>, <code>-p</code>）是用来控制这个程序运行方式的“开关”。</li></ul><p><img src="https://usual1009.oss-cn-shanghai.aliyuncs.com/img/20260116155604624.png" alt="Image"></p>]]>
    </content>
    <id>https://cmijohnson.github.io/blog/2026/04/25/docker-%E5%9F%BA%E7%A1%80%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B/</id>
    <link href="https://cmijohnson.github.io/blog/2026/04/25/docker-%E5%9F%BA%E7%A1%80%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B/"/>
    <published>2026-04-25T07:17:42.000Z</published>
    <summary>
      <![CDATA[<h1 id="Docker-基础入门教程"><a href="#Docker-基础入门教程" class="headerlink" title="Docker 基础入门教程"></a>Docker 基础入门教程</h1><p><img src="https://usual100]]>
    </summary>
    <title>Docker 基础入门教程</title>
    <updated>2026-06-26T19:43:40.497Z</updated>
  </entry>
  <entry>
    <author>
      <name>cmijohnson</name>
    </author>
    <content>
      <![CDATA[<div class="team-section"><h2 class="team-section-title">核心成员</h2><p class="team-section-subtitle">Core Members</p><div class="team-accent-bar team-accent-bar--blue"></div><div class="team-members-grid"><div class="team-member-card"><div class="team-member-avatar">C</div><h3>cmijohnson</h3><div class="position">队长</div><div class="bio">多领域尝试小登，做事认真负责</div></div><div class="team-member-card"><div class="team-member-avatar">周</div><h3>zyq</h3><div class="position">核心成员</div><div class="bio">多领域尝试小登，做事认真负责</div></div><div class="team-member-card"><div class="team-member-avatar">N</div><h3>NaN</h3><div class="position">核心成员</div><div class="bio">区块链与智能合约安全，参与审计和安全工具建设</div></div><div class="team-member-card"><div class="team-member-avatar">Z</div><h3>ZJC</h3><div class="position">核心成员</div><div class="bio">WEB安全高手</div></div></div></div><div class="team-section"><h2 class="team-section-title">团队发展历程</h2><p class="team-section-subtitle">Our Journey</p><div class="team-accent-bar team-accent-bar--orange"></div><div class="team-timeline"><div class="team-timeline-item"><div class="team-timeline-dot"></div><div class="team-timeline-card"><div class="year">2023 年</div><h4>团队正式成立</h4><p>智链细米安全盾队正式成立</p></div></div><div class="team-timeline-item"><div class="team-timeline-dot"></div><div class="team-timeline-card"><div class="year">2023 年 6 月</div><h4>待补充</h4><p>待补充</p></div></div><div class="team-timeline-item"><div class="team-timeline-dot"></div><div class="team-timeline-card"><div class="year">2026 年</div><h4>微博客上线</h4><p>基于GitHub</p></div></div></div></div>]]>
    </content>
    <id>https://cmijohnson.github.io/blog/2026/04/25/%E5%9B%A2%E9%98%9F%E9%A3%8E%E9%87%87/</id>
    <link href="https://cmijohnson.github.io/blog/2026/04/25/%E5%9B%A2%E9%98%9F%E9%A3%8E%E9%87%87/"/>
    <published>2026-04-25T07:06:54.000Z</published>
    <summary>
      <![CDATA[<div class="team-section">
<h2 class="team-section-title">核心成员</h2>
<p class="team-section-subtitle">Core Members</p>
<div class="team-accen]]>
    </summary>
    <title>团队风采</title>
    <updated>2026-06-26T19:43:40.497Z</updated>
  </entry>
  <entry>
    <author>
      <name>cmijohnson</name>
    </author>
    <category term="基础知识" scheme="https://cmijohnson.github.io/blog/categories/%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/"/>
    <category term="docker" scheme="https://cmijohnson.github.io/blog/tags/docker/"/>
    <content>
      <![CDATA[<h1 id="Docker-基础入门教程"><a href="#Docker-基础入门教程" class="headerlink" title="Docker 基础入门教程"></a>Docker 基础入门教程</h1><p><img src="https://usual1009.oss-cn-shanghai.aliyuncs.com/img/20260116155541617.png" alt="img"></p><p>Docker 让开发者可以打包应用及其依赖包到一个可移植的容器中，然后发布到任何流行的 Linux 或 Windows 机器上。本教程将以最通俗易懂的方式，带你掌握 Docker 的核心用法。</p><hr><h2 id="一、-Docker-环境安装"><a href="#一、-Docker-环境安装" class="headerlink" title="一、 Docker 环境安装"></a>一、 Docker 环境安装</h2><h3 id="1-Windows-系统"><a href="#1-Windows-系统" class="headerlink" title="1. Windows 系统"></a>1. Windows 系统</h3><p>在 Windows 上，我们通常安装 <strong>Docker Desktop</strong>。</p><ul><li><strong>下载地址</strong>：<a href="https://www.docker.com/products/docker-desktop/">Docker 官网</a></li><li><strong>注意项</strong>：安装时请确保勾选了 <strong>WSL 2</strong> 支持，这会让 Docker 运行得更加顺畅。</li><li><strong>验证</strong>：打开终端输入 <code>docker --version</code>，看到版本号即安装成功。</li></ul><h3 id="2-Linux-系统（以-Ubuntu-为例）"><a href="#2-Linux-系统（以-Ubuntu-为例）" class="headerlink" title="2. Linux 系统（以 Ubuntu 为例）"></a>2. Linux 系统（以 Ubuntu 为例）</h3><p>Linux 下通常使用命令行安装，最快的方法是使用官方的一键脚本：(选择1,4的命令进行安装)</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><code class="hljs php"><span class="hljs-comment"># To install the latest stable versions of Docker CLI, Docker Engine, and their</span><br><span class="hljs-comment"># dependencies:</span><br><span class="hljs-comment">#</span><br><span class="hljs-comment"># 1. download the script</span><br><span class="hljs-comment">#</span><br><span class="hljs-comment">#   $ curl -fsSL https://get.docker.com -o install-docker.sh</span><br><span class="hljs-comment">#</span><br><span class="hljs-comment"># 2. verify the script&#x27;s content</span><br><span class="hljs-comment">#</span><br><span class="hljs-comment">#   $ cat install-docker.sh</span><br><span class="hljs-comment">#</span><br><span class="hljs-comment"># 3. run the script with --dry-run to verify the steps it executes</span><br><span class="hljs-comment">#</span><br><span class="hljs-comment">#   $ sh install-docker.sh --dry-run</span><br><span class="hljs-comment">#</span><br><span class="hljs-comment"># 4. run the script either as root, or using sudo to perform the installation.</span><br><span class="hljs-comment">#</span><br><span class="hljs-comment">#   $ sudo sh install-docker.sh</span><br></code></pre></td></tr></table></figure><p>记得使用科学的上网方式进行安装哦</p><h3 id="pull异常-教程-切换镜像站"><a href="#pull异常-教程-切换镜像站" class="headerlink" title="pull异常 教程 切换镜像站"></a><strong>pull异常 教程 切换镜像站</strong></h3><h4 id="一键配置脚本"><a href="#一键配置脚本" class="headerlink" title="一键配置脚本"></a>一键配置脚本</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">bash &lt;(wget -qO- https://xuanyuan.cloud/docker.sh)<br></code></pre></td></tr></table></figure><p>**支持系统：**OpenCloudOS、Ubuntu、Debian、CentOS、RHEL、Rocky Linux 等主流发行版。</p><hr><h2 id="二、-核心运行参数详解-docker-run"><a href="#二、-核心运行参数详解-docker-run" class="headerlink" title="二、 核心运行参数详解 (docker run)"></a>二、 核心运行参数详解 (docker run)</h2><p>在使用 Docker 时，最常用的命令就是 <code>docker run</code>。这个命令后面经常跟着一串“英文字母”参数，理解这些参数是入门的关键。</p><p><img src="https://usual1009.oss-cn-shanghai.aliyuncs.com/img/20260116161801764.png" alt="image-20260116161801658"></p><p>以下是常用参数的深度解析：</p><h3 id="1-i：交互式操作-interactive"><a href="#1-i：交互式操作-interactive" class="headerlink" title="1. -i：交互式操作 (interactive)"></a>1. <code>-i</code>：交互式操作 (interactive)</h3><ul><li><strong>通俗解释</strong>：保持容器的标准输入（STDIN）开启。</li><li><strong>为什么要用</strong>：如果你想在容器启动后输入命令，就必须带上这个参数。它就像是连接了容器的“麦克风”，让它能听见你说话。</li></ul><h3 id="2-t：终端-tty"><a href="#2-t：终端-tty" class="headerlink" title="2. -t：终端 (tty)"></a>2. <code>-t</code>：终端 (tty)</h3><ul><li><strong>通俗解释</strong>：为容器分配一个伪终端。</li><li><strong>为什么要用</strong>：它会为你提供一个类似于 Linux 终端的命令行界面。通常与 <code>-i</code> 连用（<code>-it</code>），让你感觉就像直接登录进了另一台电脑的黑色窗口。</li></ul><h3 id="3-d：后台运行-detach"><a href="#3-d：后台运行-detach" class="headerlink" title="3. -d：后台运行 (detach)"></a>3. <code>-d</code>：后台运行 (detach)</h3><ul><li><strong>通俗解释</strong>：容器启动后会在后台运行，不会占用你当前的终端窗口。</li><li><strong>为什么要用</strong>：当你运行一个网站服务器（如 Nginx）或数据库（如 MySQL）时，你不希望它一直霸占着你的屏幕，这时就用 <code>-d</code>。</li></ul><h3 id="4-p：端口映射-publish"><a href="#4-p：端口映射-publish" class="headerlink" title="4. -p：端口映射 (publish)"></a>4. <code>-p</code>：端口映射 (publish)</h3><ul><li><strong>格式</strong>：<code>-p 宿主机端口:容器内端口</code></li><li><strong>通俗解释</strong>：在容器的“围墙”上开扇窗户。</li><li><strong>为什么要用</strong>：容器内部是一个隔离的网络。如果你在容器内部运行了一个 80 端口的 Web 服务，外部是访问不到的。通过 <code>-p 8080:80</code>，你可以访问电脑的 <code>localhost:8080</code>，流量会自动转发到容器内部的 80 端口。</li></ul><h3 id="5-name：指定容器名称"><a href="#5-name：指定容器名称" class="headerlink" title="5. --name：指定容器名称"></a>5. <code>--name</code>：指定容器名称</h3><ul><li><strong>通俗解释</strong>：给你的容器起个“绰号”。</li><li><strong>为什么要用</strong>：如果不指定，Docker 会随机给它起一个类似 <code>determined_shirley</code> 的名字。指定名字（如 <code>--name my-web</code>）方便你后续停止或删除它。</li></ul><h3 id="6-v-挂载卷"><a href="#6-v-挂载卷" class="headerlink" title="6. -v : 挂载卷"></a>6. <code>-v</code> : 挂载卷</h3><p>在掌握了基础的容器运行（<code>-itd</code>）和端口映射（<code>-p</code>）后，另一个至关重要的参数就是 <strong><code>-v</code></strong>。如果你不学会使用 <code>-v</code>，那么你的 Docker 容器就像一个没有硬盘的临时电脑，一旦关机（删除容器），所有数据都会灰飞烟灭。</p><hr><h4 id="1️⃣、-v-是什么？"><a href="#1️⃣、-v-是什么？" class="headerlink" title="1️⃣、 -v 是什么？"></a>1️⃣、 <code>-v</code> 是什么？</h4><p><strong><code>-v</code> 代表 Volume（卷）</strong>，也常被称为 <strong>“挂载”</strong>。</p><ul><li><strong>通俗解释</strong>：它就像是在你的宿主机（真实的 Windows 或 Linux 电脑）和 Docker 容器之间拉了一根“传送带”或者建立了一个“共享文件夹”。</li><li><strong>核心功能</strong>：将宿主机的目录或文件，映射到容器内部。</li></ul><hr><h4 id="2️⃣、-为什么要用-v？（解决两大痛点）"><a href="#2️⃣、-为什么要用-v？（解决两大痛点）" class="headerlink" title="2️⃣、 为什么要用 -v？（解决两大痛点）"></a>2️⃣、 为什么要用 <code>-v</code>？（解决两大痛点）</h4><h6 id="1-数据持久化（防止丢失）"><a href="#1-数据持久化（防止丢失）" class="headerlink" title="1. 数据持久化（防止丢失）"></a>1. 数据持久化（防止丢失）</h6><p>默认情况下，你在容器里创建的任何文件（比如数据库里的数据、用户上传的图片）都保存在容器的层中。<strong>一旦你执行了 <code>docker rm</code> 删除了容器，这些数据会全部消失。</strong><br>通过 <code>-v</code>，你把数据存在宿主机上，即使容器删了，新建一个容器挂载同一个目录，数据依然在。</p><h6 id="2-修改方便（实时同步）"><a href="#2-修改方便（实时同步）" class="headerlink" title="2. 修改方便（实时同步）"></a>2. 修改方便（实时同步）</h6><p>如果你想修改容器里的配置文件（比如 Nginx 的 <code>index.html</code>），你不需要每次都进入容器内部去写代码。你只需要在外面（Windows&#x2F;Linux）修改那个挂载的文件夹，容器内部会<strong>实时同步</strong>生效。</p><hr><h4 id="3️⃣、-v-的语法格式"><a href="#3️⃣、-v-的语法格式" class="headerlink" title="3️⃣、 -v 的语法格式"></a>3️⃣、 <code>-v</code> 的语法格式</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">-v [宿主机绝对路径]:[容器内绝对路径]:[权限]<br></code></pre></td></tr></table></figure><h6 id="1-宿主机路径-Host-Path"><a href="#1-宿主机路径-Host-Path" class="headerlink" title="1. 宿主机路径 (Host Path)"></a>1. 宿主机路径 (Host Path)</h6><p>你电脑上的真实路径，例如 <code>D:\web_data</code> (Windows) 或 <code>/home/user/app</code> (Linux)。</p><h6 id="2-容器内路径-Container-Path"><a href="#2-容器内路径-Container-Path" class="headerlink" title="2. 容器内路径 (Container Path)"></a>2. 容器内路径 (Container Path)</h6><p>镜像中预设的路径，例如 Nginx 存放网页的 <code>/usr/share/nginx/html</code>。</p><h6 id="3-权限-可选"><a href="#3-权限-可选" class="headerlink" title="3. 权限 (可选)"></a>3. 权限 (可选)</h6><ul><li><code>rw</code>: 读写（默认）。</li><li><code>ro</code>: 只读（read-only）。如果你希望容器只能看文件，不能改文件，就加上 <code>:ro</code>。</li></ul><hr><h4 id="4️⃣、-实战案例：一分钟修改网页内容"><a href="#4️⃣、-实战案例：一分钟修改网页内容" class="headerlink" title="4️⃣、 实战案例：一分钟修改网页内容"></a>4️⃣、 实战案例：一分钟修改网页内容</h4><p>假设我们想运行一个 Nginx 容器，但不想用它默认的欢迎页面，而是用我们自己电脑上的 HTML 文件。</p><h5 id="1-在宿主机创建文件"><a href="#1-在宿主机创建文件" class="headerlink" title="1. 在宿主机创建文件"></a>1. 在宿主机创建文件</h5><p>在 Linux 的 <code>/root/html</code> 目录下（或 Windows 的某个文件夹下）创建一个 <code>index.html</code>，内容写上 <code>&lt;h1&gt;Hello Docker Volume!&lt;/h1&gt;</code>。</p><h5 id="2-运行挂载命令"><a href="#2-运行挂载命令" class="headerlink" title="2. 运行挂载命令"></a>2. 运行挂载命令</h5><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run -d \<br>  --name my-nginx-web \<br>  -p 8080:80 \<br>  -v /root/html:/usr/share/nginx/html \<br>  nginx<br></code></pre></td></tr></table></figure><p><strong>命令拆解：</strong></p><ul><li><strong><code>-d</code></strong>: 后台运行。</li><li><strong><code>-p 8080:80</code></strong>: 电脑 8080 端口映射容器 80 端口。</li><li><strong><code>-v /root/html:/usr/share/nginx/html</code></strong>: <ul><li><strong>把外部的</strong> <code>/root/html</code> 文件夹。</li><li><strong>映射到内部的</strong> <code>/usr/share/nginx/html</code>。</li></ul></li><li><strong><code>nginx</code></strong>: 镜像名。</li></ul><h5 id="3-验证结果"><a href="#3-验证结果" class="headerlink" title="3. 验证结果"></a>3. 验证结果</h5><p>现在你访问 <code>http://localhost:8080</code>，看到的不再是 Nginx 默认页面，而是你刚才写的 <code>Hello Docker Volume!</code>。<br><strong>神奇之处：</strong> 此时你修改宿主机 <code>/root/html/index.html</code> 里的内容，刷新浏览器，页面会立刻变化，无需重启容器！</p><hr><h4 id="5️⃣、-匿名卷与具名卷（进阶）"><a href="#5️⃣、-匿名卷与具名卷（进阶）" class="headerlink" title="5️⃣、 匿名卷与具名卷（进阶）"></a>5️⃣、 匿名卷与具名卷（进阶）</h4><p>除了上面这种指定具体路径的“绑定挂载”（Bind Mount），Docker 还有两种常见方式：</p><ol><li><p><strong>匿名卷</strong>：<br><code>-v /data</code><br>（只写了容器内路径。Docker 会自动在宿主机深处创建一个随机名字的文件夹。通常用于不关心数据存在哪，只要能持久化就行的情况。）</p></li><li><p><strong>具名卷</strong>：<br><code>-v my_db_data:/var/lib/mysql</code><br>（<code>my_db_data</code> 是一个名字。Docker 会管理这个卷。你可以通过 <code>docker volume ls</code> 看到它。这种方式最推荐，因为它由 Docker 统一管理，方便备份和迁移。）</p><p>你要学会管理你的“具名卷”，主要靠这几个指令：</p><table><thead><tr><th align="left">命令</th><th align="left">作用</th></tr></thead><tbody><tr><td align="left"><strong><code>docker volume ls</code></strong></td><td align="left">查看当前所有的命名卷（看看有哪些保险柜）</td></tr><tr><td align="left"><strong><code>docker volume inspect &lt;卷名&gt;</code></strong></td><td align="left">查看这个卷在硬盘的什么位置（通常在 <code>/var/lib/docker/volumes/</code>）</td></tr><tr><td align="left"><strong><code>docker volume create &lt;卷名&gt;</code></strong></td><td align="left">手动创建一个卷（可选，通常运行 <code>run</code> 时会自动创建）</td></tr><tr><td align="left"><strong><code>docker volume rm &lt;卷名&gt;</code></strong></td><td align="left">删除一个卷（注意：删了数据就真没了）</td></tr><tr><td align="left"><strong><code>docker volume prune</code></strong></td><td align="left">删除所有没在使用的卷（清理空间）</td></tr></tbody></table></li></ol><hr><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 默认情况（不加 -a）：</span><br>docker volume prune<br><span class="hljs-comment"># 只删除未被任何容器引用的卷</span><br><br><span class="hljs-comment"># 使用 -a 选项：</span><br>docker volume prune -a<br><span class="hljs-comment"># 删除所有未使用的卷，包括：</span><br><span class="hljs-comment"># 1. 未被引用的卷</span><br><span class="hljs-comment"># 2. 匿名卷</span><br><span class="hljs-comment"># 3. 悬空卷</span><br></code></pre></td></tr></table></figure><h5 id="实战演示：如何使用命名卷"><a href="#实战演示：如何使用命名卷" class="headerlink" title="实战演示：如何使用命名卷"></a>实战演示：如何使用命名卷</h5><h6 id="第一步：运行容器并绑定命名卷"><a href="#第一步：运行容器并绑定命名卷" class="headerlink" title="第一步：运行容器并绑定命名卷"></a>第一步：运行容器并绑定命名卷</h6><p>你不需要手动创建卷，直接运行命令，Docker 发现卷不存在会自动创建：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 运行一个 Nginx，把网页存到名为 my_web_data 的卷里</span><br>docker run -d \<br>  --name my_nginx \<br>  -p 8081:80 \<br>  -v my_web_data:/usr/share/nginx/html \<br>  nginx<br></code></pre></td></tr></table></figure><h6 id="第二步：查看卷是否生成"><a href="#第二步：查看卷是否生成" class="headerlink" title="第二步：查看卷是否生成"></a>第二步：查看卷是否生成</h6><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker volume <span class="hljs-built_in">ls</span><br></code></pre></td></tr></table></figure><p>你会看到列表中多了一个 <code>my_web_data</code>。</p><h6 id="第三步：查看卷的真实位置（仅限-Linux）"><a href="#第三步：查看卷的真实位置（仅限-Linux）" class="headerlink" title="第三步：查看卷的真实位置（仅限 Linux）"></a>第三步：查看卷的真实位置（仅限 Linux）</h6><p>如果你想知道 Docker 把数据存哪了：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker volume inspect my_web_data<br></code></pre></td></tr></table></figure><p>在输出的 <code>Mountpoint</code> 字段，你会看到类似 <code>/var/lib/docker/volumes/my_web_data/_data</code> 的路径。</p><hr><h6 id="5-常见困惑：命名卷-vs-绑定挂载"><a href="#5-常见困惑：命名卷-vs-绑定挂载" class="headerlink" title="5. 常见困惑：命名卷 vs 绑定挂载"></a>5. 常见困惑：命名卷 vs 绑定挂载</h6><table><thead><tr><th align="left">特性</th><th align="left">命名卷 (<code>-v my_vol:/app</code>)</th><th align="left">绑定挂载 (<code>-v /root/data:/app</code>)</th></tr></thead><tbody><tr><td align="left"><strong>存储位置</strong></td><td align="left">Docker 管理的特定区域</td><td align="left">你自己指定的任何地方</td></tr><tr><td align="left"><strong>管理方式</strong></td><td align="left">通过 Docker 命令管理</td><td align="left">通过文件浏览器或系统命令管理</td></tr><tr><td align="left"><strong>适用场景</strong></td><td align="left">数据库存储、持久化配置文件</td><td align="left">开发环境（需要实时改代码）</td></tr><tr><td align="left"><strong>对初学者</strong></td><td align="left"><strong>更推荐（不容易写错路径）</strong></td><td align="left">需要搞清楚宿主机绝对路径</td></tr></tbody></table><h4 id="6️⃣、-小结"><a href="#6️⃣、-小结" class="headerlink" title="6️⃣、 小结"></a>6️⃣、 小结</h4><table><thead><tr><th align="left">参数项</th><th align="left">全称</th><th align="left">作用</th><th align="left">就像是…</th></tr></thead><tbody><tr><td align="left"><strong>-v</strong></td><td align="left"><strong>Volume</strong></td><td align="left"><strong>数据挂载</strong></td><td align="left">给容器插了一块“外接硬盘”</td></tr></tbody></table><p><strong>使用建议：</strong></p><ul><li><strong>数据库（MySQL&#x2F;Redis）</strong>：一定要用 <code>-v</code>，否则删容器等于删库跑路。</li><li><strong>配置文件</strong>：建议用 <code>-v</code>，方便在外面改配置。</li><li><strong>日志文件</strong>：建议用 <code>-v</code>，方便在宿主机直接查看日志，不用进容器。</li></ul><hr><p><em>注意：尽管 <code>-v</code> 是 Docker 的标准操作，但在 Windows 环境下使用 WSL 2 挂载路径时，可能会遇到文件权限或路径格式转换的问题，操作时请留意报错信息。</em></p><hr><h3 id="7-e-设置环境变量"><a href="#7-e-设置环境变量" class="headerlink" title="7. -e : 设置环境变量"></a>7. <code>-e</code> : <strong>设置环境变量</strong></h3><h4 id="作用："><a href="#作用：" class="headerlink" title="作用："></a><strong>作用：</strong></h4><p>向容器内部<strong>传递环境变量</strong>，常用于配置应用程序。</p><h4 id="基本语法："><a href="#基本语法：" class="headerlink" title="基本语法："></a><strong>基本语法：</strong></h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run -e KEY=VALUE &lt;镜像&gt;<br></code></pre></td></tr></table></figure><h4 id="使用示例："><a href="#使用示例：" class="headerlink" title="使用示例："></a><strong>使用示例：</strong></h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 设置单个环境变量</span><br>docker run -d -e MYSQL_ROOT_PASSWORD=123456 mysql<br><br><span class="hljs-comment"># 设置多个环境变量</span><br>docker run -d \<br>  -e MYSQL_ROOT_PASSWORD=123456 \<br>  -e MYSQL_DATABASE=mydb \<br>  -e MYSQL_USER=admin \<br>  mysql<br><br><span class="hljs-comment"># 从文件读取环境变量</span><br>docker run -d --env-file .<span class="hljs-built_in">env</span> mysql<br></code></pre></td></tr></table></figure><h4 id="📊-实际应用场景"><a href="#📊-实际应用场景" class="headerlink" title="📊 实际应用场景"></a>📊 <strong>实际应用场景</strong></h4><h5 id="场景1：运行数据库"><a href="#场景1：运行数据库" class="headerlink" title="场景1：运行数据库"></a><strong>场景1：运行数据库</strong></h5><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># MySQL容器需要root密码</span><br>docker run -d \<br>  --name mysql-db \<br>  -e MYSQL_ROOT_PASSWORD=mysecretpassword \<br>  -e MYSQL_DATABASE=appdb \<br>  -p 3306:3306 \<br>  mysql:8.0<br></code></pre></td></tr></table></figure><h5 id="场景2：运行Web应用"><a href="#场景2：运行Web应用" class="headerlink" title="场景2：运行Web应用"></a><strong>场景2：运行Web应用</strong></h5><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># Node.js应用配置</span><br>docker run -d \<br>  --name myapp \<br>  -e NODE_ENV=production \<br>  -e DATABASE_URL=postgres://user:pass@db:5432/db \<br>  -e REDIS_URL=redis://redis:6379 \<br>  -p 3000:3000 \<br>  my-node-app<br></code></pre></td></tr></table></figure><h5 id="场景3：运行Redis"><a href="#场景3：运行Redis" class="headerlink" title="场景3：运行Redis"></a><strong>场景3：运行Redis</strong></h5><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># Redis设置密码</span><br>docker run -d \<br>  --name redis-cache \<br>  -e REDIS_PASSWORD=myredispass \<br>  -p 6379:6379 \<br>  redis:alpine<br></code></pre></td></tr></table></figure><h4 id="🔧-组合使用示例"><a href="#🔧-组合使用示例" class="headerlink" title="🔧 组合使用示例"></a>🔧 <strong>组合使用示例</strong></h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 典型组合：后台运行 + 环境变量 + 端口映射</span><br>docker run -d \<br>  --name webapp \<br>  -e APP_ENV=production \<br>  -e DB_HOST=mysql \<br>  -p 80:80 \<br>  -p 443:443 \<br>  nginx:latest<br><br><span class="hljs-comment"># 分解：</span><br><span class="hljs-comment"># -d          → 后台运行</span><br><span class="hljs-comment"># --name      → 指定容器名称</span><br><span class="hljs-comment"># -e          → 设置环境变量</span><br><span class="hljs-comment"># -p          → 端口映射</span><br></code></pre></td></tr></table></figure><h4 id="📋-常用组合模式"><a href="#📋-常用组合模式" class="headerlink" title="📋 常用组合模式"></a>📋 <strong>常用组合模式</strong></h4><table><thead><tr><th align="left">场景</th><th align="left">典型命令</th><th align="left">说明</th></tr></thead><tbody><tr><td align="left">快速测试</td><td align="left"><code>docker run -it --rm alpine sh</code></td><td align="left">交互式临时容器</td></tr><tr><td align="left">后台服务</td><td align="left"><code>docker run -d -p 80:80 nginx</code></td><td align="left">Web服务器</td></tr><tr><td align="left">数据库</td><td align="left"><code>docker run -d -e VAR=val mysql</code></td><td align="left">需要配置的服务</td></tr><tr><td align="left">开发环境</td><td align="left"><code>docker run -d -v $(pwd):/app node</code></td><td align="left">挂载代码目录</td></tr></tbody></table><h4 id="💡-实用技巧"><a href="#💡-实用技巧" class="headerlink" title="💡 实用技巧"></a>💡 <strong>实用技巧</strong></h4><h5 id="1-查看容器环境变量"><a href="#1-查看容器环境变量" class="headerlink" title="1. 查看容器环境变量"></a><strong>1. 查看容器环境变量</strong></h5><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 查看已设置的环境变量</span><br>docker <span class="hljs-built_in">exec</span> &lt;容器&gt; <span class="hljs-built_in">env</span><br><br><span class="hljs-comment"># 查看单个变量</span><br>docker <span class="hljs-built_in">exec</span> &lt;容器&gt; <span class="hljs-built_in">printenv</span> NODE_ENV<br></code></pre></td></tr></table></figure><h5 id="2-动态修改环境变量"><a href="#2-动态修改环境变量" class="headerlink" title="2. 动态修改环境变量"></a><strong>2. 动态修改环境变量</strong></h5><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 创建时忘记设置？需要重新创建</span><br>docker stop &lt;容器&gt;<br>docker <span class="hljs-built_in">rm</span> &lt;容器&gt;<br>docker run -d -e NEW_VAR=value ...  <span class="hljs-comment"># 重新创建</span><br></code></pre></td></tr></table></figure><h5 id="3-使用环境变量文件"><a href="#3-使用环境变量文件" class="headerlink" title="3. 使用环境变量文件"></a><strong>3. 使用环境变量文件</strong></h5><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># .env 文件内容：</span><br>DB_PASSWORD=secret123<br>API_KEY=abc123xyz<br><br><span class="hljs-comment"># 启动时引用</span><br>docker run -d --env-file .<span class="hljs-built_in">env</span> myapp<br></code></pre></td></tr></table></figure><h4 id="⚠️-注意事项"><a href="#⚠️-注意事项" class="headerlink" title="⚠️ 注意事项"></a>⚠️ <strong>注意事项</strong></h4><h5 id="e-的注意事项："><a href="#e-的注意事项：" class="headerlink" title="-e 的注意事项："></a><strong><code>-e</code> 的注意事项：</strong></h5><ol><li><p><strong>敏感信息</strong>：不要在命令中直接写密码（会出现在history中）</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 不安全（密码在history中可见）</span><br>docker run -e PASSWORD=123456 app<br><br><span class="hljs-comment"># 相对安全（从变量读取）</span><br><span class="hljs-built_in">export</span> DB_PASS=123456<br>docker run -e PASSWORD=<span class="hljs-variable">$DB_PASS</span> app<br><br><span class="hljs-comment"># 最安全（使用Docker Secrets或环境文件）</span><br>docker run --env-file .secrets app<br></code></pre></td></tr></table></figure></li><li><p><strong>变量覆盖</strong>：容器内已有的环境变量会被覆盖</p></li><li><p><strong>特殊字符</strong>：包含空格或特殊字符的值需要引号</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run -e GREETING=<span class="hljs-string">&quot;Hello World&quot;</span> app<br></code></pre></td></tr></table></figure></li></ol><h5 id="🆚-it-与-d-对比"><a href="#🆚-it-与-d-对比" class="headerlink" title="🆚 -it 与 -d 对比"></a>🆚 <strong><code>-it</code> 与 <code>-d</code> 对比</strong></h5><table><thead><tr><th align="left">选项</th><th align="left">用途</th><th align="left">适用场景</th></tr></thead><tbody><tr><td align="left"><code>-it</code></td><td align="left">交互式终端</td><td align="left">调试、进入容器、执行命令</td></tr><tr><td align="left"><code>-d</code></td><td align="left">后台运行</td><td align="left">长期运行的服务（Web、DB等）</td></tr></tbody></table><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 组合使用：先调试，后后台运行</span><br>docker run -it --<span class="hljs-built_in">rm</span> alpine sh      <span class="hljs-comment"># 调试镜像</span><br>docker run -d --name myapp alpine  <span class="hljs-comment"># 正式运行</span><br></code></pre></td></tr></table></figure><ul><li><strong><code>-d</code> *<em>→*</em> D</strong>etached（分离）→ 后台运行</li><li><strong><code>-e</code> *<em>→*</em> E</strong>nvironment（环境）→ 环境变量</li><li><strong><code>-it</code> *<em>→*</em> I*<em>nteractive +*</em> T</strong>TY → 交互式终端</li></ul><h3 id="8-name-自定义容器名称"><a href="#8-name-自定义容器名称" class="headerlink" title="8. --name : 自定义容器名称"></a>8. <code>--name</code> : <strong>自定义容器名称</strong></h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run --name &lt;容器名称&gt; &lt;镜像&gt;<br></code></pre></td></tr></table></figure><h5 id="📚-优点"><a href="#📚-优点" class="headerlink" title="📚 优点"></a>📚 优点</h5><p><strong>不使用 –name 的情况：</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run nginx<br><span class="hljs-comment"># Docker会自动生成一个随机名称，如：</span><br><span class="hljs-comment"># romantic_babbage</span><br><span class="hljs-comment"># angry_goldberg</span><br><span class="hljs-comment"># sleepy_curie</span><br></code></pre></td></tr></table></figure><p><strong>使用 –name 的好处：</strong></p><ol><li><strong>易于记忆</strong>：<code>my-nginx</code> 比 <code>romantic_babbage</code> 好记</li><li><strong>便于管理</strong>：停止、启动、删除时不用记ID</li><li><strong>避免冲突</strong>：明确知道每个容器的用途</li><li><strong>脚本友好</strong>：在脚本中使用名称而不是ID</li></ol><h5 id="🔧-基本用法"><a href="#🔧-基本用法" class="headerlink" title="🔧 基本用法"></a>🔧 <strong>基本用法</strong></h5><h6 id="1-给容器起名字"><a href="#1-给容器起名字" class="headerlink" title="1. 给容器起名字"></a><strong>1. 给容器起名字</strong></h6><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 运行一个名为 &quot;web-server&quot; 的nginx容器</span><br>docker run -d --name web-server nginx<br><br><span class="hljs-comment"># 运行一个名为 &quot;mysql-db&quot; 的MySQL容器</span><br>docker run -d --name mysql-db -e MYSQL_ROOT_PASSWORD=123456 mysql<br></code></pre></td></tr></table></figure><h6 id="2-使用名称管理容器"><a href="#2-使用名称管理容器" class="headerlink" title="2. 使用名称管理容器"></a><strong>2. 使用名称管理容器</strong></h6><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 停止容器</span><br>docker stop web-server<br><br><span class="hljs-comment"># 启动容器</span><br>docker start web-server<br><br><span class="hljs-comment"># 重启容器</span><br>docker restart web-server<br><br><span class="hljs-comment"># 查看容器日志</span><br>docker logs web-server<br><br><span class="hljs-comment"># 进入容器</span><br>docker <span class="hljs-built_in">exec</span> -it web-server bash<br><br><span class="hljs-comment"># 删除容器</span><br>docker <span class="hljs-built_in">rm</span> web-server<br></code></pre></td></tr></table></figure><h6 id="综合实战演示"><a href="#综合实战演示" class="headerlink" title="综合实战演示"></a>综合实战演示</h6><p>让我们把上面的参数串起来，运行一个 Nginx（网页服务器）容器：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run -itd --name my-nginx -p 8888:80 nginx<br></code></pre></td></tr></table></figure><p><strong>这段命令的意思是：</strong></p><ol><li><strong><code>docker run</code></strong>: 启动一个新容器。</li><li><strong><code>-itd</code></strong>: 结合了交互、终端和后台运行。意味着它在后台活着，但如果你想进入它内部，它也为你准备好了终端。</li><li><strong><code>--name my-nginx</code></strong>: 给容器起名叫 <code>my-nginx</code>。</li><li><strong><code>-p 8888:80</code></strong>: 把容器里的 80 端口映射到我电脑的 8888 端口。</li><li><strong><code>nginx</code></strong>: 使用的镜像名称。</li></ol><p>执行完后，你在浏览器输入 <code>localhost:8888</code> 就能看到 Nginx 的欢迎页面了。</p><h3 id="9-restart-重启策略"><a href="#9-restart-重启策略" class="headerlink" title="9. --restart : 重启策略"></a>9. <code>--restart</code> : 重启策略</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run --restart &lt;策略&gt; &lt;镜像&gt;<br></code></pre></td></tr></table></figure><h5 id="📚-四种重启策略"><a href="#📚-四种重启策略" class="headerlink" title="📚 四种重启策略"></a>📚 <strong>四种重启策略</strong></h5><p><strong>1. <code>no</code> - 不自动重启（默认）</strong></p><p>bash</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run --restart no nginx<br><span class="hljs-comment"># 或省略（默认就是no）</span><br>docker run nginx<br></code></pre></td></tr></table></figure><p><strong>特点：</strong></p><ul><li>容器退出后<strong>不会自动重启</strong></li><li>适用于一次性任务、测试容器</li></ul><p><strong>2. <code>always</code> - 总是重启</strong></p><p>bash</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run --restart always nginx<br></code></pre></td></tr></table></figure><p><strong>特点：</strong></p><ul><li>容器退出时<strong>总是重启</strong></li><li>无论退出状态码是什么（0或非0）</li><li>适用于必须保持运行的服务</li></ul><p><strong>3. <code>on-failure</code> - 失败时重启</strong></p><p>bash</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run --restart on-failure nginx<br><span class="hljs-comment"># 或指定最大重试次数</span><br>docker run --restart on-failure:5 nginx<br></code></pre></td></tr></table></figure><p><strong>特点：</strong></p><ul><li>只有<strong>非0状态码退出</strong>时才重启</li><li>可以指定最大重试次数</li><li>适用于可能出错但需要恢复的服务</li></ul><p><strong>4. <code>unless-stopped</code> - 除非手动停止</strong></p><p>bash</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run --restart unless-stopped nginx<br></code></pre></td></tr></table></figure><p><strong>特点：</strong></p><ul><li>容器退出时重启，<strong>除非用户手动停止</strong></li><li>Docker守护进程重启后，容器也会自动启动</li><li><strong>最常用</strong>的生产环境策略</li></ul><h5 id="📊-策略对比表"><a href="#📊-策略对比表" class="headerlink" title="📊 策略对比表"></a>📊 <strong>策略对比表</strong></h5><table><thead><tr><th align="left">策略</th><th align="left">退出时重启</th><th align="left">Docker重启时启动</th><th align="left">手动停止后</th><th align="left">适用场景</th></tr></thead><tbody><tr><td align="left"><code>no</code></td><td align="left">❌ 否</td><td align="left">❌ 否</td><td align="left">-</td><td align="left">测试、一次性任务</td></tr><tr><td align="left"><code>always</code></td><td align="left">✅ 总是</td><td align="left">✅ 是</td><td align="left">✅ 会重启</td><td align="left">必须持续运行的服务</td></tr><tr><td align="left"><code>on-failure</code></td><td align="left">⚠️ 失败时</td><td align="left">✅ 是</td><td align="left">-</td><td align="left">可能出错的服务</td></tr><tr><td align="left"><code>unless-stopped</code></td><td align="left">✅ 总是</td><td align="left">✅ 是</td><td align="left">❌ 不重启</td><td align="left"><strong>生产环境推荐</strong></td></tr></tbody></table><hr><h2 id="四、-常用管理命令"><a href="#四、-常用管理命令" class="headerlink" title="四、 常用管理命令"></a>四、 常用管理命令</h2><h3 id="1-查看容器状态"><a href="#1-查看容器状态" class="headerlink" title="1. 查看容器状态"></a>1. 查看容器状态</h3><ul><li><code>docker ps</code>: 查看当前正在运行的容器。</li><li><code>docker ps -a</code>: 查看所有容器（包括已经停止的）。</li></ul><h3 id="2-停止与启动"><a href="#2-停止与启动" class="headerlink" title="2. 停止与启动"></a>2. 停止与启动</h3><ul><li><code>docker stop my-nginx</code>: 停止名为 <code>my-nginx</code> 的容器。</li><li><code>docker start my-nginx</code>: 再次启动它。</li></ul><h3 id="3-进入容器内部"><a href="#3-进入容器内部" class="headerlink" title="3. 进入容器内部"></a>3. 进入容器内部</h3><p>如果你想进到容器里修改文件，使用：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker <span class="hljs-built_in">exec</span> -it my-nginx /bin/bash<br></code></pre></td></tr></table></figure><h3 id="4-删除容器与镜像"><a href="#4-删除容器与镜像" class="headerlink" title="4. 删除容器与镜像"></a>4. 删除容器与镜像</h3><ul><li><code>docker rm -f my-nginx</code>: 强制删除运行中的容器。</li><li><code>docker rmi nginx</code>: 删除本地的 nginx 镜像。</li></ul><hr><h2 id="五、-Docker-常用命令速查表"><a href="#五、-Docker-常用命令速查表" class="headerlink" title="五、 Docker 常用命令速查表"></a>五、 Docker 常用命令速查表</h2><h3 id="📋-核心命令对比表"><a href="#📋-核心命令对比表" class="headerlink" title="📋 核心命令对比表"></a>📋 核心命令对比表</h3><table><thead><tr><th align="left">命令</th><th align="left">作用</th><th align="left">常用选项</th><th align="left">示例</th><th align="left">说明</th></tr></thead><tbody><tr><td align="left"><strong><code>docker pull</code></strong></td><td align="left">拉取镜像</td><td align="left"><code>-a</code>：所有标签 <code>--platform</code>：指定平台</td><td align="left"><code>docker pull nginx:alpine</code></td><td align="left">只下载镜像，不运行</td></tr><tr><td align="left"><strong><code>docker create</code></strong></td><td align="left">创建容器</td><td align="left"><code>--name</code>：命名 <code>-it</code>：交互终端 <code>-p</code>：端口映射 <code>-v</code>：卷挂载 <code>-e</code>：环境变量</td><td align="left"><code>docker create --name myapp nginx</code></td><td align="left">只创建，不启动</td></tr><tr><td align="left"><strong><code>docker run</code></strong></td><td align="left">创建并启动容器</td><td align="left"><code>-d</code>：后台运行 <code>--rm</code>：退出后删除 <code>--restart</code>：重启策略</td><td align="left"><code>docker run -d -p 80:80 nginx</code></td><td align="left"><strong>最常用</strong>，等于 create + start</td></tr><tr><td align="left"><strong><code>docker start</code></strong></td><td align="left">启动已存在的容器</td><td align="left"><code>-a</code>：附加输出 <code>-i</code>：交互模式</td><td align="left"><code>docker start myapp</code></td><td align="left">启动已停止的容器</td></tr><tr><td align="left"><strong><code>docker stop</code></strong></td><td align="left">停止运行中的容器</td><td align="left"><code>-t</code>：超时时间（秒）</td><td align="left"><code>docker stop myapp</code></td><td align="left">优雅停止（SIGTERM）</td></tr><tr><td align="left"><strong><code>docker restart</code></strong></td><td align="left">重启容器</td><td align="left"><code>-t</code>：超时时间</td><td align="left"><code>docker restart myapp</code></td><td align="left">等于 stop + start</td></tr><tr><td align="left"><strong><code>docker pause</code></strong></td><td align="left">暂停容器</td><td align="left">无</td><td align="left"><code>docker pause myapp</code></td><td align="left">暂停所有进程</td></tr><tr><td align="left"><strong><code>docker unpause</code></strong></td><td align="left">恢复容器</td><td align="left">无</td><td align="left"><code>docker unpause myapp</code></td><td align="left">恢复暂停的容器</td></tr><tr><td align="left"><strong><code>docker rm</code></strong></td><td align="left">删除容器</td><td align="left"><code>-f</code>：强制删除运行中的 <code>-v</code>：同时删除卷</td><td align="left"><code>docker rm -f myapp</code></td><td align="left">删除容器（镜像还在）</td></tr><tr><td align="left"><strong><code>docker rmi</code></strong></td><td align="left">删除镜像</td><td align="left"><code>-f</code>：强制删除</td><td align="left"><code>docker rmi nginx</code></td><td align="left">删除镜像</td></tr></tbody></table><h3 id="🔄-容器生命周期管理"><a href="#🔄-容器生命周期管理" class="headerlink" title="🔄 容器生命周期管理"></a>🔄 容器生命周期管理</h3><h4 id="完整流程示例："><a href="#完整流程示例：" class="headerlink" title="完整流程示例："></a><strong>完整流程示例：</strong></h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 1. 拉取镜像</span><br>docker pull nginx:alpine<br><br><span class="hljs-comment"># 2. 创建容器（不启动）</span><br>docker create --name web -p 80:80 nginx:alpine<br><br><span class="hljs-comment"># 3. 启动容器</span><br>docker start web<br><br><span class="hljs-comment"># 4. 停止容器</span><br>docker stop web<br><br><span class="hljs-comment"># 5. 重启容器</span><br>docker restart web<br><br><span class="hljs-comment"># 6. 删除容器</span><br>docker <span class="hljs-built_in">rm</span> web<br></code></pre></td></tr></table></figure><h4 id="快捷方式："><a href="#快捷方式：" class="headerlink" title="快捷方式："></a><strong>快捷方式：</strong></h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 等于上面1-3步</span><br>docker run -d --name web -p 80:80 nginx:alpine<br></code></pre></td></tr></table></figure><h3 id="📊-状态转换图"><a href="#📊-状态转换图" class="headerlink" title="📊 状态转换图"></a>📊 状态转换图</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs plaintext">docker pull<br>    ↓<br>[镜像仓库] → (镜像本地缓存)<br>    ↓<br>docker create → [容器创建] → docker start → [运行中]<br>    ↓                                   ↓<br>docker rm ← [已停止] ← docker stop      docker pause → [已暂停]<br>                                          ↓<br>                                        docker unpause<br></code></pre></td></tr></table></figure><h3 id="🎯-常用组合命令"><a href="#🎯-常用组合命令" class="headerlink" title="🎯 常用组合命令"></a>🎯 常用组合命令</h3><h4 id="开发测试："><a href="#开发测试：" class="headerlink" title="开发测试："></a><strong>开发测试：</strong></h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 临时运行，退出即删除</span><br>docker run -it --<span class="hljs-built_in">rm</span> alpine sh<br><br><span class="hljs-comment"># 拉取最新镜像并运行</span><br>docker pull node:latest &amp;&amp; docker run node<br></code></pre></td></tr></table></figure><h4 id="生产部署："><a href="#生产部署：" class="headerlink" title="生产部署："></a><strong>生产部署：</strong></h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 完整生产级容器</span><br>docker run -d \<br>  --name app-prod \<br>  --restart unless-stopped \<br>  -p 80:80 \<br>  -v app-data:/data \<br>  -e NODE_ENV=production \<br>  myapp:latest<br></code></pre></td></tr></table></figure><h4 id="批量操作："><a href="#批量操作：" class="headerlink" title="批量操作："></a><strong>批量操作：</strong></h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 停止所有容器</span><br>docker stop $(docker ps -q)<br><br><span class="hljs-comment"># 删除所有停止的容器</span><br>docker container prune<br><br><span class="hljs-comment"># 删除所有未使用的镜像</span><br>docker image prune -a<br></code></pre></td></tr></table></figure><h3 id="⚙️-选项详解表"><a href="#⚙️-选项详解表" class="headerlink" title="⚙️ 选项详解表"></a>⚙️ 选项详解表</h3><table><thead><tr><th>选项</th><th>适用命令</th><th>作用</th><th>示例</th></tr></thead><tbody><tr><td><strong><code>-d</code></strong></td><td><code>run</code></td><td>后台运行</td><td><code>docker run -d nginx</code></td></tr><tr><td><strong><code>-it</code></strong></td><td><code>run</code>, <code>create</code>, <code>exec</code></td><td>交互终端</td><td><code>docker run -it alpine sh</code></td></tr><tr><td><strong><code>--name</code></strong></td><td><code>run</code>, <code>create</code></td><td>容器命名</td><td><code>docker run --name myapp nginx</code></td></tr><tr><td><strong><code>-p</code></strong></td><td><code>run</code>, <code>create</code></td><td>端口映射</td><td><code>docker run -p 8080:80 nginx</code></td></tr><tr><td><strong><code>-v</code></strong></td><td><code>run</code>, <code>create</code></td><td>卷挂载</td><td><code>docker run -v /data:/app nginx</code></td></tr><tr><td><strong><code>-e</code></strong></td><td><code>run</code>, <code>create</code></td><td>环境变量</td><td><code>docker run -e KEY=value nginx</code></td></tr><tr><td><strong><code>--rm</code></strong></td><td><code>run</code></td><td>退出后删除</td><td><code>docker run --rm alpine echo hi</code></td></tr><tr><td><strong><code>--restart</code></strong></td><td><code>run</code>, <code>create</code></td><td>重启策略</td><td><code>docker run --restart always nginx</code></td></tr><tr><td><strong><code>-f</code></strong></td><td><code>rm</code>, <code>rmi</code></td><td>强制操作</td><td><code>docker rm -f myapp</code></td></tr><tr><td><strong><code>-a</code></strong></td><td><code>ps</code>, <code>start</code>, <code>pull</code></td><td>所有&#x2F;附加</td><td><code>docker ps -a</code></td></tr></tbody></table><h3 id="🔍-查看和监控"><a href="#🔍-查看和监控" class="headerlink" title="🔍 查看和监控"></a>🔍 查看和监控</h3><table><thead><tr><th>命令</th><th>作用</th><th>常用选项</th></tr></thead><tbody><tr><td><code>docker ps</code></td><td>查看容器</td><td><code>-a</code>：所有容器<br><code>-q</code>：只显示ID<br><code>--filter</code>：过滤</td></tr><tr><td><code>docker images</code></td><td>查看镜像</td><td><code>-a</code>：所有镜像<br><code>-q</code>：只显示ID</td></tr><tr><td><code>docker logs</code></td><td>查看日志</td><td><code>-f</code>：实时跟踪<br><code>--tail N</code>：最后N行</td></tr><tr><td><code>docker inspect</code></td><td>查看详情</td><td><code>-f</code>：格式化输出</td></tr><tr><td><code>docker stats</code></td><td>实时资源监控</td><td>无</td></tr><tr><td><code>docker top</code></td><td>查看容器进程</td><td>无</td></tr><tr><td><code>docker diff</code></td><td>查看文件变化</td><td>无</td></tr></tbody></table><h3 id="💡-实用技巧-1"><a href="#💡-实用技巧-1" class="headerlink" title="💡 实用技巧"></a>💡 实用技巧</h3><h4 id="1-一键清理"><a href="#1-一键清理" class="headerlink" title="1. 一键清理"></a><strong>1. 一键清理</strong></h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 清理所有未使用的资源</span><br>docker system prune -a<br><br><span class="hljs-comment"># 清理卷</span><br>docker volume prune<br></code></pre></td></tr></table></figure><h4 id="2-查看帮助"><a href="#2-查看帮助" class="headerlink" title="2. 查看帮助"></a><strong>2. 查看帮助</strong></h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 查看命令帮助</span><br>docker run --<span class="hljs-built_in">help</span><br><br><span class="hljs-comment"># 查看Docker版本</span><br>docker version<br><br><span class="hljs-comment"># 查看系统信息</span><br>docker info<br></code></pre></td></tr></table></figure><h4 id="3-导出和导入"><a href="#3-导出和导入" class="headerlink" title="3. 导出和导入"></a><strong>3. 导出和导入</strong></h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 导出容器为镜像</span><br>docker commit myapp myapp:backup<br><br><span class="hljs-comment"># 导出镜像为文件</span><br>docker save myapp:latest &gt; myapp.tar<br><br><span class="hljs-comment"># 从文件导入镜像</span><br>docker load &lt; myapp.tar<br></code></pre></td></tr></table></figure><h3 id="🚨-注意事项"><a href="#🚨-注意事项" class="headerlink" title="🚨 注意事项"></a>🚨 注意事项</h3><ol><li><p><strong><code>docker run</code> ≠ <code>docker create + start</code></strong></p><ul><li><code>run</code> 会应用所有运行时配置</li><li><code>create</code> 只创建，可以后续修改配置</li></ul></li><li><p><strong>停止 vs 删除</strong></p><ul><li><code>stop</code>：容器还在，可以重新启动</li><li><code>rm</code>：容器被删除，数据可能丢失（除非用了卷）</li></ul></li><li><p><strong>镜像 vs 容器</strong></p><ul><li><code>pull/rmi</code>：操作的是<strong>镜像</strong>（模板）</li><li><code>run/stop/rm</code>：操作的是<strong>容器</strong>（实例）</li></ul></li><li><p><strong>生产环境建议</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 总是使用 --name</span><br><span class="hljs-comment"># 总是使用 --restart unless-stopped</span><br><span class="hljs-comment"># 重要数据一定要用 -v 挂载卷</span><br></code></pre></td></tr></table></figure></li></ol><h3 id="📱-快速参考卡片"><a href="#📱-快速参考卡片" class="headerlink" title="📱 快速参考卡片"></a>📱 快速参考卡片</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 最常用组合（记住这个就够了）：</span><br>docker run -d --name &lt;名称&gt; -p &lt;端口&gt; -v &lt;卷&gt; --restart unless-stopped &lt;镜像&gt;<br><br><span class="hljs-comment"># 示例：</span><br>docker run -d --name web -p 80:80 -v html:/usr/share/nginx/html --restart unless-stopped nginx<br></code></pre></td></tr></table></figure><p>这个表格涵盖了 Docker 日常使用中 <strong>90%</strong> 的场景。掌握这些命令，你就能熟练管理 Docker 容器了！</p><h2 id="六、-总结"><a href="#六、-总结" class="headerlink" title="六、 总结"></a>六、 总结</h2><p>Docker 的核心逻辑就是：<strong>拉取镜像 -&gt; 运行容器 -&gt; 管理容器</strong>。</p><ul><li><strong>镜像</strong>是“安装包”。</li><li><strong>容器</strong>是安装好后“正在运行的程序”。</li><li><strong>参数</strong>（<code>-i</code>, <code>-t</code>, <code>-d</code>, <code>-p</code>）是用来控制这个程序运行方式的“开关”。</li></ul><p><img src="https://usual1009.oss-cn-shanghai.aliyuncs.com/img/20260116155604624.png" alt="Image"></p>]]>
    </content>
    <id>https://cmijohnson.github.io/blog/2026/04/22/selfDay1%20%E5%89%8D%E7%BD%AE%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86-docker%E7%9A%84%E4%BD%BF%E7%94%A8/</id>
    <link href="https://cmijohnson.github.io/blog/2026/04/22/selfDay1%20%E5%89%8D%E7%BD%AE%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86-docker%E7%9A%84%E4%BD%BF%E7%94%A8/"/>
    <published>2026-04-22T14:41:46.000Z</published>
    <summary>
      <![CDATA[<h1 id="Docker-基础入门教程"><a href="#Docker-基础入门教程" class="headerlink" title="Docker 基础入门教程"></a>Docker 基础入门教程</h1><p><img src="https://usual100]]>
    </summary>
    <title>Docker 基础入门教程</title>
    <updated>2026-06-26T19:43:40.497Z</updated>
  </entry>
  <entry>
    <author>
      <name>cmijohnson</name>
    </author>
    <category term="基础" scheme="https://cmijohnson.github.io/blog/categories/%E5%9F%BA%E7%A1%80/"/>
    <category term="docker" scheme="https://cmijohnson.github.io/blog/tags/docker/"/>
    <content>
      <![CDATA[<h1 id="Docker-常用命令速查手册"><a href="#Docker-常用命令速查手册" class="headerlink" title="Docker 常用命令速查手册"></a>Docker 常用命令速查手册</h1><blockquote><p>快速查找 Docker 常用命令，提高工作效率</p></blockquote><hr><h2 id="目录"><a href="#目录" class="headerlink" title="目录"></a>目录</h2><ul><li><a href="#%E9%95%9C%E5%83%8F%E7%AE%A1%E7%90%86">镜像管理</a></li><li><a href="#%E5%AE%B9%E5%99%A8%E7%AE%A1%E7%90%86">容器管理</a></li><li><a href="#%E5%AE%B9%E5%99%A8%E6%93%8D%E4%BD%9C">容器操作</a></li><li><a href="#%E7%BD%91%E7%BB%9C%E7%AE%A1%E7%90%86">网络管理</a></li><li><a href="#%E6%95%B0%E6%8D%AE%E5%8D%B7%E7%AE%A1%E7%90%86">数据卷管理</a></li><li><a href="#%E6%97%A5%E5%BF%97%E4%B8%8E%E7%9B%91%E6%8E%A7">日志与监控</a></li><li><a href="#%E7%B3%BB%E7%BB%9F%E4%BF%A1%E6%81%AF">系统信息</a></li><li><a href="#%E6%B8%85%E7%90%86%E5%91%BD%E4%BB%A4">清理命令</a></li><li><a href="#%E5%AE%9E%E7%94%A8%E6%8A%80%E5%B7%A7">实用技巧</a></li></ul><hr><h2 id="镜像管理"><a href="#镜像管理" class="headerlink" title="镜像管理"></a>镜像管理</h2><h3 id="搜索镜像"><a href="#搜索镜像" class="headerlink" title="搜索镜像"></a>搜索镜像</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 搜索镜像</span><br>docker search &lt;镜像名&gt;<br><br><span class="hljs-comment"># 示例：搜索 nginx</span><br>docker search nginx<br><br><span class="hljs-comment"># 只显示官方镜像</span><br>docker search --filter is-official=<span class="hljs-literal">true</span> nginx<br><br><span class="hljs-comment"># 限制搜索结果数量</span><br>docker search --<span class="hljs-built_in">limit</span> 5 nginx<br></code></pre></td></tr></table></figure><h3 id="拉取镜像"><a href="#拉取镜像" class="headerlink" title="拉取镜像"></a>拉取镜像</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 拉取最新版本</span><br>docker pull &lt;镜像名&gt;<br><br><span class="hljs-comment"># 拉取指定版本</span><br>docker pull &lt;镜像名&gt;:&lt;标签&gt;<br><br><span class="hljs-comment"># 示例</span><br>docker pull nginx<br>docker pull nginx:1.21<br>docker pull nginx:alpine<br>docker pull nginx@sha256:abc123...<br></code></pre></td></tr></table></figure><h3 id="查看镜像"><a href="#查看镜像" class="headerlink" title="查看镜像"></a>查看镜像</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 列出所有镜像</span><br>docker images<br><br><span class="hljs-comment"># 列出所有镜像（包含中间层）</span><br>docker images -a<br><br><span class="hljs-comment"># 只显示镜像ID</span><br>docker images -q<br><br><span class="hljs-comment"># 格式化输出</span><br>docker images --format <span class="hljs-string">&quot;table &#123;&#123;.Repository&#125;&#125;\t&#123;&#123;.Tag&#125;&#125;\t&#123;&#123;.Size&#125;&#125;&quot;</span><br><br><span class="hljs-comment"># 查看镜像详细信息</span><br>docker inspect &lt;镜像名或ID&gt;<br><br><span class="hljs-comment"># 查看镜像历史</span><br>docker <span class="hljs-built_in">history</span> &lt;镜像名&gt;<br></code></pre></td></tr></table></figure><h3 id="构建镜像"><a href="#构建镜像" class="headerlink" title="构建镜像"></a>构建镜像</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 使用 Dockerfile 构建镜像</span><br>docker build -t &lt;镜像名&gt;:&lt;标签&gt; &lt;路径&gt;<br><br><span class="hljs-comment"># 示例</span><br>docker build -t myapp:1.0 .<br>docker build -f Dockerfile.prod -t myapp:prod .<br><br><span class="hljs-comment"># 构建时不使用缓存</span><br>docker build --no-cache -t myapp:1.0 .<br><br><span class="hljs-comment"># 构建时传递构建参数</span><br>docker build --build-arg APP_VERSION=1.0 -t myapp .<br></code></pre></td></tr></table></figure><h3 id="删除镜像"><a href="#删除镜像" class="headerlink" title="删除镜像"></a>删除镜像</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 删除单个镜像</span><br>docker rmi &lt;镜像名或ID&gt;<br><br><span class="hljs-comment"># 强制删除（即使有容器在使用）</span><br>docker rmi -f &lt;镜像名或ID&gt;<br><br><span class="hljs-comment"># 删除多个镜像</span><br>docker rmi &lt;镜像1&gt; &lt;镜像2&gt; &lt;镜像3&gt;<br><br><span class="hljs-comment"># 删除所有未使用的镜像</span><br>docker image prune<br><br><span class="hljs-comment"># 删除所有未使用的镜像（包括未标记的）</span><br>docker image prune -a<br><br><span class="hljs-comment"># 删除所有镜像（危险）</span><br>docker rmi $(docker images -q)<br></code></pre></td></tr></table></figure><h3 id="导出-导入镜像"><a href="#导出-导入镜像" class="headerlink" title="导出&#x2F;导入镜像"></a>导出&#x2F;导入镜像</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 导出镜像到 tar 文件</span><br>docker save -o &lt;文件名&gt;.tar &lt;镜像名&gt;<br><br><span class="hljs-comment"># 示例</span><br>docker save -o nginx.tar nginx:latest<br><br><span class="hljs-comment"># 导入镜像</span><br>docker load -i &lt;文件名&gt;.tar<br><br><span class="hljs-comment"># 示例</span><br>docker load -i nginx.tar<br><br><span class="hljs-comment"># 导出镜像到标准输出</span><br>docker save &lt;镜像名&gt; &gt; &lt;文件名&gt;.tar<br><br><span class="hljs-comment"># 从标准输出导入</span><br>docker load &lt; &lt;文件名&gt;.tar<br></code></pre></td></tr></table></figure><h3 id="标记镜像"><a href="#标记镜像" class="headerlink" title="标记镜像"></a>标记镜像</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 为镜像添加新标签</span><br>docker tag &lt;源镜像&gt; &lt;新镜像名&gt;:&lt;标签&gt;<br><br><span class="hljs-comment"># 示例</span><br>docker tag nginx:latest my-nginx:1.0<br>docker tag nginx:latest registry.example.com/my-nginx:1.0<br></code></pre></td></tr></table></figure><hr><h2 id="容器管理"><a href="#容器管理" class="headerlink" title="容器管理"></a>容器管理</h2><h3 id="创建容器"><a href="#创建容器" class="headerlink" title="创建容器"></a>创建容器</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 创建容器（不启动）</span><br>docker create [选项] &lt;镜像名&gt;<br><br><span class="hljs-comment"># 常用选项</span><br>docker create \<br>  --name my-container \<br>  -p 8080:80 \<br>  -v /host/path:/container/path \<br>  -e KEY=VALUE \<br>  -d \<br>  &lt;镜像名&gt;<br></code></pre></td></tr></table></figure><h3 id="启动容器"><a href="#启动容器" class="headerlink" title="启动容器"></a>启动容器</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 创建并启动容器</span><br>docker run [选项] &lt;镜像名&gt;<br><br><span class="hljs-comment"># 示例：后台运行</span><br>docker run -d --name my-nginx nginx<br><br><span class="hljs-comment"># 示例：交互式运行</span><br>docker run -it --name my-ubuntu ubuntu /bin/bash<br><br><span class="hljs-comment"># 示例：端口映射</span><br>docker run -d -p 8080:80 nginx<br><br><span class="hljs-comment"># 示例：挂载卷</span><br>docker run -d -v /data:/app/data nginx<br><br><span class="hljs-comment"># 示例：环境变量</span><br>docker run -d -e MYSQL_ROOT_PASSWORD=123456 mysql<br><br><span class="hljs-comment"># 示例：自动删除容器（退出后）</span><br>docker run --<span class="hljs-built_in">rm</span> -it ubuntu /bin/bash<br><br><span class="hljs-comment"># 示例：重启策略</span><br>docker run -d --restart=always nginx<br>docker run -d --restart=on-failure:5 nginx<br>docker run -d --restart=unless-stopped nginx<br></code></pre></td></tr></table></figure><h3 id="查看容器"><a href="#查看容器" class="headerlink" title="查看容器"></a>查看容器</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 查看运行中的容器</span><br>docker ps<br><br><span class="hljs-comment"># 查看所有容器（包括已停止）</span><br>docker ps -a<br><br><span class="hljs-comment"># 只显示容器ID</span><br>docker ps -q<br><br><span class="hljs-comment"># 显示容器大小</span><br>docker ps -s<br><br><span class="hljs-comment"># 显示最新创建的容器</span><br>docker ps -l<br><br><span class="hljs-comment"># 格式化输出</span><br>docker ps --format <span class="hljs-string">&quot;table &#123;&#123;.Names&#125;&#125;\t&#123;&#123;.Status&#125;&#125;\t&#123;&#123;.Ports&#125;&#125;&quot;</span><br><br><span class="hljs-comment"># 查看容器详细信息</span><br>docker inspect &lt;容器名或ID&gt;<br><br><span class="hljs-comment"># 查看容器进程</span><br>docker top &lt;容器名或ID&gt;<br><br><span class="hljs-comment"># 查看容器端口映射</span><br>docker port &lt;容器名或ID&gt;<br></code></pre></td></tr></table></figure><h3 id="启动-停止容器"><a href="#启动-停止容器" class="headerlink" title="启动&#x2F;停止容器"></a>启动&#x2F;停止容器</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 启动已停止的容器</span><br>docker start &lt;容器名或ID&gt;<br><br><span class="hljs-comment"># 停止运行中的容器</span><br>docker stop &lt;容器名或ID&gt;<br><br><span class="hljs-comment"># 重启容器</span><br>docker restart &lt;容器名或ID&gt;<br><br><span class="hljs-comment"># 强制停止容器</span><br>docker <span class="hljs-built_in">kill</span> &lt;容器名或ID&gt;<br><br><span class="hljs-comment"># 暂停容器</span><br>docker pause &lt;容器名或ID&gt;<br><br><span class="hljs-comment"># 恢复暂停的容器</span><br>docker unpause &lt;容器名或ID&gt;<br></code></pre></td></tr></table></figure><h3 id="删除容器"><a href="#删除容器" class="headerlink" title="删除容器"></a>删除容器</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 删除已停止的容器</span><br>docker <span class="hljs-built_in">rm</span> &lt;容器名或ID&gt;<br><br><span class="hljs-comment"># 强制删除运行中的容器</span><br>docker <span class="hljs-built_in">rm</span> -f &lt;容器名或ID&gt;<br><br><span class="hljs-comment"># 删除多个容器</span><br>docker <span class="hljs-built_in">rm</span> &lt;容器1&gt; &lt;容器2&gt; &lt;容器3&gt;<br><br><span class="hljs-comment"># 删除所有已停止的容器</span><br>docker container prune<br><br><span class="hljs-comment"># 删除所有容器（危险）</span><br>docker <span class="hljs-built_in">rm</span> -f $(docker ps -aq)<br><br><span class="hljs-comment"># 删除所有已停止的容器</span><br>docker <span class="hljs-built_in">rm</span> $(docker ps -a -q)<br></code></pre></td></tr></table></figure><h3 id="容器重命名"><a href="#容器重命名" class="headerlink" title="容器重命名"></a>容器重命名</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 重命名容器</span><br>docker rename &lt;旧名称&gt; &lt;新名称&gt;<br><br><span class="hljs-comment"># 示例</span><br>docker rename my-container new-container<br></code></pre></td></tr></table></figure><hr><h2 id="容器操作"><a href="#容器操作" class="headerlink" title="容器操作"></a>容器操作</h2><h3 id="进入容器"><a href="#进入容器" class="headerlink" title="进入容器"></a>进入容器</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 使用 bash 进入（推荐）</span><br>docker <span class="hljs-built_in">exec</span> -it &lt;容器名或ID&gt; /bin/bash<br><br><span class="hljs-comment"># 使用 sh 进入（轻量级容器）</span><br>docker <span class="hljs-built_in">exec</span> -it &lt;容器名或ID&gt; /bin/sh<br><br><span class="hljs-comment"># Linux 系统需要 sudo</span><br><span class="hljs-built_in">sudo</span> docker <span class="hljs-built_in">exec</span> -it &lt;容器名或ID&gt; /bin/bash<br><br><span class="hljs-comment"># 以 root 用户进入</span><br>docker <span class="hljs-built_in">exec</span> -it -u root &lt;容器名或ID&gt; /bin/bash<br><br><span class="hljs-comment"># 在指定目录下进入</span><br>docker <span class="hljs-built_in">exec</span> -it -w /app &lt;容器名或ID&gt; /bin/bash<br></code></pre></td></tr></table></figure><h3 id="在容器中执行命令"><a href="#在容器中执行命令" class="headerlink" title="在容器中执行命令"></a>在容器中执行命令</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 执行单条命令</span><br>docker <span class="hljs-built_in">exec</span> &lt;容器名或ID&gt; &lt;命令&gt;<br><br><span class="hljs-comment"># 示例</span><br>docker <span class="hljs-built_in">exec</span> my-nginx <span class="hljs-built_in">ls</span> -la<br>docker <span class="hljs-built_in">exec</span> my-nginx nginx -v<br>docker <span class="hljs-built_in">exec</span> mysql-db mysql -u root -p -e <span class="hljs-string">&quot;SHOW DATABASES;&quot;</span><br><br><span class="hljs-comment"># 交互式执行命令</span><br>docker <span class="hljs-built_in">exec</span> -it &lt;容器名或ID&gt; &lt;命令&gt;<br><br><span class="hljs-comment"># 后台执行命令</span><br>docker <span class="hljs-built_in">exec</span> -d &lt;容器名或ID&gt; &lt;命令&gt;<br><br><span class="hljs-comment"># 执行多条命令</span><br>docker <span class="hljs-built_in">exec</span> &lt;容器名或ID&gt; /bin/sh -c <span class="hljs-string">&quot;cd /tmp &amp;&amp; ls -la&quot;</span><br><br><span class="hljs-comment"># 传递环境变量</span><br>docker <span class="hljs-built_in">exec</span> -e DEBUG=<span class="hljs-literal">true</span> &lt;容器名或ID&gt; &lt;命令&gt;<br></code></pre></td></tr></table></figure><h3 id="查看日志"><a href="#查看日志" class="headerlink" title="查看日志"></a>查看日志</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 查看容器日志</span><br>docker logs &lt;容器名或ID&gt;<br><br><span class="hljs-comment"># 实时跟踪日志</span><br>docker logs -f &lt;容器名或ID&gt;<br><br><span class="hljs-comment"># 显示最后 N 行</span><br>docker logs --<span class="hljs-built_in">tail</span> 100 &lt;容器名或ID&gt;<br><br><span class="hljs-comment"># 显示带时间戳的日志</span><br>docker logs -t &lt;容器名或ID&gt;<br><br><span class="hljs-comment"># 显示最近 N 分钟的日志</span><br>docker logs --since 10m &lt;容器名或ID&gt;<br><br><span class="hljs-comment"># 显示指定时间段的日志</span><br>docker logs --since <span class="hljs-string">&quot;2024-01-01T00:00:00&quot;</span> --<span class="hljs-keyword">until</span> <span class="hljs-string">&quot;2024-01-02T00:00:00&quot;</span> &lt;容器名或ID&gt;<br><br><span class="hljs-comment"># 组合使用</span><br>docker logs -f --<span class="hljs-built_in">tail</span> 50 -t &lt;容器名或ID&gt;<br></code></pre></td></tr></table></figure><h3 id="复制文件"><a href="#复制文件" class="headerlink" title="复制文件"></a>复制文件</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 从容器复制到宿主机</span><br>docker <span class="hljs-built_in">cp</span> &lt;容器名或ID&gt;:&lt;容器内路径&gt; &lt;宿主机路径&gt;<br><br><span class="hljs-comment"># 从宿主机复制到容器</span><br>docker <span class="hljs-built_in">cp</span> &lt;宿主机路径&gt; &lt;容器名或ID&gt;:&lt;容器内路径&gt;<br><br><span class="hljs-comment"># 示例</span><br>docker <span class="hljs-built_in">cp</span> my-nginx:/etc/nginx/nginx.conf ./nginx.conf<br>docker <span class="hljs-built_in">cp</span> ./index.html my-nginx:/usr/share/nginx/html/<br>docker <span class="hljs-built_in">cp</span> my-nginx:/usr/share/nginx/html ./html_backup/<br><br><span class="hljs-comment"># Linux 系统需要 sudo</span><br><span class="hljs-built_in">sudo</span> docker <span class="hljs-built_in">cp</span> my-nginx:/etc/nginx/nginx.conf ./nginx.conf<br></code></pre></td></tr></table></figure><h3 id="附加到容器"><a href="#附加到容器" class="headerlink" title="附加到容器"></a>附加到容器</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 附加到容器主进程</span><br>docker attach &lt;容器名或ID&gt;<br><br><span class="hljs-comment"># 注意：退出时使用 Ctrl+P 然后 Ctrl+Q，否则容器会停止</span><br></code></pre></td></tr></table></figure><h3 id="导出-导入容器"><a href="#导出-导入容器" class="headerlink" title="导出&#x2F;导入容器"></a>导出&#x2F;导入容器</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 导出容器为 tar 文件</span><br>docker <span class="hljs-built_in">export</span> &lt;容器名或ID&gt; &gt; &lt;文件名&gt;.tar<br><br><span class="hljs-comment"># 示例</span><br>docker <span class="hljs-built_in">export</span> my-container &gt; my-container.tar<br><br><span class="hljs-comment"># 导入容器为镜像</span><br>docker import &lt;文件名&gt;.tar &lt;新镜像名&gt;:&lt;标签&gt;<br><br><span class="hljs-comment"># 示例</span><br>docker import my-container.tar my-image:1.0<br></code></pre></td></tr></table></figure><h3 id="更新容器"><a href="#更新容器" class="headerlink" title="更新容器"></a>更新容器</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 更新容器重启策略</span><br>docker update --restart=always &lt;容器名或ID&gt;<br><br><span class="hljs-comment"># 更新容器资源限制</span><br>docker update --memory=<span class="hljs-string">&quot;512m&quot;</span> --cpus=<span class="hljs-string">&quot;1.0&quot;</span> &lt;容器名或ID&gt;<br><br><span class="hljs-comment"># 示例</span><br>docker update --restart=unless-stopped my-nginx<br>docker update --memory=<span class="hljs-string">&quot;1g&quot;</span> --cpus=<span class="hljs-string">&quot;2.0&quot;</span> my-app<br></code></pre></td></tr></table></figure><hr><h2 id="网络管理"><a href="#网络管理" class="headerlink" title="网络管理"></a>网络管理</h2><h3 id="查看网络"><a href="#查看网络" class="headerlink" title="查看网络"></a>查看网络</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 列出所有网络</span><br>docker network <span class="hljs-built_in">ls</span><br><br><span class="hljs-comment"># 查看网络详细信息</span><br>docker network inspect &lt;网络名&gt;<br><br><span class="hljs-comment"># 查看容器连接的网络</span><br>docker network inspect &lt;网络名&gt; --format <span class="hljs-string">&#x27;&#123;&#123;range .Containers&#125;&#125;&#123;&#123;.Name&#125;&#125;&#123;&#123;end&#125;&#125;&#x27;</span><br></code></pre></td></tr></table></figure><h3 id="创建网络"><a href="#创建网络" class="headerlink" title="创建网络"></a>创建网络</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 创建桥接网络（默认）</span><br>docker network create &lt;网络名&gt;<br><br><span class="hljs-comment"># 创建自定义驱动网络</span><br>docker network create -d bridge &lt;网络名&gt;<br><br><span class="hljs-comment"># 指定子网和网关</span><br>docker network create \<br>  --driver=bridge \<br>  --subnet=172.20.0.0/16 \<br>  --gateway=172.20.0.1 \<br>  my-network<br><br><span class="hljs-comment"># 示例</span><br>docker network create my-app-network<br>docker network create --driver bridge --subnet=192.168.100.0/24 my-network<br></code></pre></td></tr></table></figure><h3 id="连接容器到网络"><a href="#连接容器到网络" class="headerlink" title="连接容器到网络"></a>连接容器到网络</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 将容器连接到网络</span><br>docker network connect &lt;网络名&gt; &lt;容器名或ID&gt;<br><br><span class="hljs-comment"># 指定别名</span><br>docker network connect --<span class="hljs-built_in">alias</span> &lt;别名&gt; &lt;网络名&gt; &lt;容器名或ID&gt;<br><br><span class="hljs-comment"># 示例</span><br>docker network connect my-network my-nginx<br>docker network connect --<span class="hljs-built_in">alias</span> web my-network my-nginx<br></code></pre></td></tr></table></figure><h3 id="断开容器网络"><a href="#断开容器网络" class="headerlink" title="断开容器网络"></a>断开容器网络</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 断开容器与网络的连接</span><br>docker network disconnect &lt;网络名&gt; &lt;容器名或ID&gt;<br><br><span class="hljs-comment"># 强制断开</span><br>docker network disconnect -f &lt;网络名&gt; &lt;容器名或ID&gt;<br><br><span class="hljs-comment"># 示例</span><br>docker network disconnect my-network my-nginx<br></code></pre></td></tr></table></figure><h3 id="删除网络"><a href="#删除网络" class="headerlink" title="删除网络"></a>删除网络</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 删除网络</span><br>docker network <span class="hljs-built_in">rm</span> &lt;网络名&gt;<br><br><span class="hljs-comment"># 删除多个网络</span><br>docker network <span class="hljs-built_in">rm</span> &lt;网络1&gt; &lt;网络2&gt;<br><br><span class="hljs-comment"># 删除所有未使用的网络</span><br>docker network prune<br><br><span class="hljs-comment"># 删除所有网络（危险）</span><br>docker network <span class="hljs-built_in">rm</span> $(docker network <span class="hljs-built_in">ls</span> -q)<br></code></pre></td></tr></table></figure><h3 id="网络类型"><a href="#网络类型" class="headerlink" title="网络类型"></a>网络类型</h3><table><thead><tr><th align="left">网络类型</th><th align="left">说明</th><th align="left">用途</th></tr></thead><tbody><tr><td align="left"><strong>bridge</strong></td><td align="left">默认网络，容器间可通过IP通信</td><td align="left">单机多容器通信</td></tr><tr><td align="left"><strong>host</strong></td><td align="left">容器使用宿主机网络栈</td><td align="left">高性能网络需求</td></tr><tr><td align="left"><strong>none</strong></td><td align="left">容器无网络连接</td><td align="left">完全隔离环境</td></tr><tr><td align="left"><strong>overlay</strong></td><td align="left">跨主机网络</td><td align="left">Docker Swarm 集群</td></tr><tr><td align="left"><strong>macvlan</strong></td><td align="left">为容器分配MAC地址</td><td align="left">需要容器像物理设备</td></tr></tbody></table><hr><h2 id="数据卷管理"><a href="#数据卷管理" class="headerlink" title="数据卷管理"></a>数据卷管理</h2><h3 id="查看卷"><a href="#查看卷" class="headerlink" title="查看卷"></a>查看卷</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 列出所有卷</span><br>docker volume <span class="hljs-built_in">ls</span><br><br><span class="hljs-comment"># 查看卷详细信息</span><br>docker volume inspect &lt;卷名&gt;<br><br><span class="hljs-comment"># 查看卷使用情况</span><br>docker volume <span class="hljs-built_in">ls</span> -f dangling=<span class="hljs-literal">true</span><br></code></pre></td></tr></table></figure><h3 id="创建卷"><a href="#创建卷" class="headerlink" title="创建卷"></a>创建卷</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 创建卷</span><br>docker volume create &lt;卷名&gt;<br><br><span class="hljs-comment"># 创建带标签的卷</span><br>docker volume create --label &lt;标签&gt;=&lt;值&gt; &lt;卷名&gt;<br><br><span class="hljs-comment"># 示例</span><br>docker volume create my-data<br>docker volume create --label <span class="hljs-built_in">env</span>=prod my-prod-data<br></code></pre></td></tr></table></figure><h3 id="使用卷"><a href="#使用卷" class="headerlink" title="使用卷"></a>使用卷</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 运行容器时使用卷</span><br>docker run -d -v &lt;卷名&gt;:&lt;容器内路径&gt; &lt;镜像名&gt;<br><br><span class="hljs-comment"># 运行容器时使用绑定挂载</span><br>docker run -d -v &lt;宿主机路径&gt;:&lt;容器内路径&gt; &lt;镜像名&gt;<br><br><span class="hljs-comment"># 只读挂载</span><br>docker run -d -v &lt;卷名&gt;:&lt;容器内路径&gt;:ro &lt;镜像名&gt;<br><br><span class="hljs-comment"># 示例</span><br>docker run -d -v my-data:/app/data nginx<br>docker run -d -v /host/data:/container/data nginx<br>docker run -d -v my-data:/app/data:ro nginx<br></code></pre></td></tr></table></figure><h3 id="删除卷"><a href="#删除卷" class="headerlink" title="删除卷"></a>删除卷</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 删除卷</span><br>docker volume <span class="hljs-built_in">rm</span> &lt;卷名&gt;<br><br><span class="hljs-comment"># 删除多个卷</span><br>docker volume <span class="hljs-built_in">rm</span> &lt;卷1&gt; &lt;卷2&gt;<br><br><span class="hljs-comment"># 删除所有未使用的卷</span><br>docker volume prune<br><br><span class="hljs-comment"># 删除所有未使用的卷（包括匿名卷）</span><br>docker volume prune -a<br><br><span class="hljs-comment"># 删除所有卷（危险）</span><br>docker volume <span class="hljs-built_in">rm</span> $(docker volume <span class="hljs-built_in">ls</span> -q)<br></code></pre></td></tr></table></figure><h3 id="卷备份与恢复"><a href="#卷备份与恢复" class="headerlink" title="卷备份与恢复"></a>卷备份与恢复</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 备份卷到 tar 文件</span><br>docker run --<span class="hljs-built_in">rm</span> -v &lt;卷名&gt;:/data -v $(<span class="hljs-built_in">pwd</span>):/backup alpine tar czf /backup/backup.tar.gz /data<br><br><span class="hljs-comment"># 从 tar 文件恢复卷</span><br>docker run --<span class="hljs-built_in">rm</span> -v &lt;卷名&gt;:/data -v $(<span class="hljs-built_in">pwd</span>):/backup alpine tar xzf /backup/backup.tar.gz -C /<br><br><span class="hljs-comment"># 示例</span><br>docker run --<span class="hljs-built_in">rm</span> -v my-data:/data -v $(<span class="hljs-built_in">pwd</span>):/backup alpine tar czf /backup/my-data-backup.tar.gz /data<br></code></pre></td></tr></table></figure><hr><h2 id="日志与监控"><a href="#日志与监控" class="headerlink" title="日志与监控"></a>日志与监控</h2><h3 id="查看日志-1"><a href="#查看日志-1" class="headerlink" title="查看日志"></a>查看日志</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 查看容器日志</span><br>docker logs &lt;容器名或ID&gt;<br><br><span class="hljs-comment"># 实时跟踪日志</span><br>docker logs -f &lt;容器名或ID&gt;<br><br><span class="hljs-comment"># 显示最后 N 行</span><br>docker logs --<span class="hljs-built_in">tail</span> 100 &lt;容器名或ID&gt;<br><br><span class="hljs-comment"># 显示带时间戳的日志</span><br>docker logs -t &lt;容器名或ID&gt;<br><br><span class="hljs-comment"># 显示最近 N 分钟的日志</span><br>docker logs --since 10m &lt;容器名或ID&gt;<br><br><span class="hljs-comment"># 组合使用</span><br>docker logs -f --<span class="hljs-built_in">tail</span> 50 -t &lt;容器名或ID&gt;<br></code></pre></td></tr></table></figure><h3 id="查看资源使用"><a href="#查看资源使用" class="headerlink" title="查看资源使用"></a>查看资源使用</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 查看容器资源使用情况（实时）</span><br>docker stats<br><br><span class="hljs-comment"># 查看指定容器资源使用</span><br>docker stats &lt;容器名或ID&gt;<br><br><span class="hljs-comment"># 不持续更新（只显示一次）</span><br>docker stats --no-stream<br><br><span class="hljs-comment"># 格式化输出</span><br>docker stats --format <span class="hljs-string">&quot;table &#123;&#123;.Name&#125;&#125;\t&#123;&#123;.CPUPerc&#125;&#125;\t&#123;&#123;.MemUsage&#125;&#125;&quot;</span><br><br><span class="hljs-comment"># 示例</span><br>docker stats my-nginx<br>docker stats --no-stream my-nginx<br></code></pre></td></tr></table></figure><h3 id="查看事件"><a href="#查看事件" class="headerlink" title="查看事件"></a>查看事件</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 查看 Docker 事件</span><br>docker events<br><br><span class="hljs-comment"># 查看最近 N 分钟的事件</span><br>docker events --since 10m<br><br><span class="hljs-comment"># 查看指定容器的事件</span><br>docker events --filter container=&lt;容器名或ID&gt;<br><br><span class="hljs-comment"># 格式化输出</span><br>docker events --format <span class="hljs-string">&quot;&#123;&#123;.Status&#125;&#125; &#123;&#123;.Actor.Attributes.name&#125;&#125;&quot;</span><br></code></pre></td></tr></table></figure><h3 id="健康检查"><a href="#健康检查" class="headerlink" title="健康检查"></a>健康检查</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 查看容器健康状态</span><br>docker inspect --format=<span class="hljs-string">&#x27;&#123;&#123;.State.Health.Status&#125;&#125;&#x27;</span> &lt;容器名或ID&gt;<br><br><span class="hljs-comment"># 运行时指定健康检查</span><br>docker run --health-cmd=<span class="hljs-string">&quot;curl -f http://localhost/ || exit 1&quot;</span> \<br>  --health-interval=5s \<br>  --health-timeout=3s \<br>  --health-retries=3 \<br>  nginx<br></code></pre></td></tr></table></figure><hr><h2 id="系统信息"><a href="#系统信息" class="headerlink" title="系统信息"></a>系统信息</h2><h3 id="查看-Docker-信息"><a href="#查看-Docker-信息" class="headerlink" title="查看 Docker 信息"></a>查看 Docker 信息</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 查看 Docker 系统信息</span><br>docker info<br><br><span class="hljs-comment"># 查看 Docker 版本</span><br>docker version<br><br><span class="hljs-comment"># 查看 Docker 详细版本</span><br>docker version --format <span class="hljs-string">&#x27;&#123;&#123;.Server.Version&#125;&#125;&#x27;</span><br><br><span class="hljs-comment"># 查看客户端和服务端版本</span><br>docker version --format <span class="hljs-string">&#x27;Client: &#123;&#123;.Client.Version&#125;&#125;\nServer: &#123;&#123;.Server.Version&#125;&#125;&#x27;</span><br></code></pre></td></tr></table></figure><h3 id="查看磁盘使用"><a href="#查看磁盘使用" class="headerlink" title="查看磁盘使用"></a>查看磁盘使用</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 查看 Docker 磁盘使用情况</span><br>docker system <span class="hljs-built_in">df</span><br><br><span class="hljs-comment"># 详细查看</span><br>docker system <span class="hljs-built_in">df</span> -v<br><br><span class="hljs-comment"># 查看各部分占用</span><br>docker system <span class="hljs-built_in">df</span> --format <span class="hljs-string">&quot;table &#123;&#123;.Type&#125;&#125;\t&#123;&#123;.TotalCount&#125;&#125;\t&#123;&#123;.Size&#125;&#125;&quot;</span><br></code></pre></td></tr></table></figure><h3 id="登录-登出"><a href="#登录-登出" class="headerlink" title="登录&#x2F;登出"></a>登录&#x2F;登出</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 登录到 Docker Hub</span><br>docker login<br><br><span class="hljs-comment"># 登录到私有仓库</span><br>docker login &lt;仓库地址&gt;<br><br><span class="hljs-comment"># 示例</span><br>docker login registry.example.com<br><br><span class="hljs-comment"># 登出</span><br>docker <span class="hljs-built_in">logout</span><br>docker <span class="hljs-built_in">logout</span> &lt;仓库地址&gt;<br></code></pre></td></tr></table></figure><h3 id="推送镜像"><a href="#推送镜像" class="headerlink" title="推送镜像"></a>推送镜像</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 推送镜像到仓库</span><br>docker push &lt;镜像名&gt;:&lt;标签&gt;<br><br><span class="hljs-comment"># 示例</span><br>docker push my-username/my-image:1.0<br>docker push registry.example.com/my-image:1.0<br></code></pre></td></tr></table></figure><hr><h2 id="清理命令"><a href="#清理命令" class="headerlink" title="清理命令"></a>清理命令</h2><h3 id="清理未使用的资源"><a href="#清理未使用的资源" class="headerlink" title="清理未使用的资源"></a>清理未使用的资源</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 清理所有未使用的镜像、容器、网络、卷</span><br>docker system prune<br><br><span class="hljs-comment"># 清理所有未使用的资源（包括停止的容器和未使用的卷）</span><br>docker system prune -a<br><br><span class="hljs-comment"># 清理所有未使用的资源（包括未使用的镜像）</span><br>docker system prune -a --volumes<br><br><span class="hljs-comment"># 只清理未使用的镜像</span><br>docker image prune<br><br><span class="hljs-comment"># 只清理未使用的容器</span><br>docker container prune<br><br><span class="hljs-comment"># 只清理未使用的网络</span><br>docker network prune<br><br><span class="hljs-comment"># 只清理未使用的卷</span><br>docker volume prune<br><br><span class="hljs-comment"># 清理构建缓存</span><br>docker builder prune<br><br><span class="hljs-comment"># 清理所有构建缓存</span><br>docker builder prune -a<br></code></pre></td></tr></table></figure><h3 id="清理示例"><a href="#清理示例" class="headerlink" title="清理示例"></a>清理示例</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 清理所有停止的容器</span><br>docker container prune<br><br><span class="hljs-comment"># 清理所有未使用的镜像</span><br>docker image prune -a<br><br><span class="hljs-comment"># 清理所有未使用的卷</span><br>docker volume prune<br><br><span class="hljs-comment"># 清理所有未使用的网络</span><br>docker network prune<br><br><span class="hljs-comment"># 清理所有构建缓存</span><br>docker builder prune -a<br><br><span class="hljs-comment"># 完全清理（危险）</span><br>docker system prune -a --volumes --force<br></code></pre></td></tr></table></figure><hr><h2 id="实用技巧"><a href="#实用技巧" class="headerlink" title="实用技巧"></a>实用技巧</h2><h3 id="批量操作"><a href="#批量操作" class="headerlink" title="批量操作"></a>批量操作</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 停止所有运行中的容器</span><br>docker stop $(docker ps -q)<br><br><span class="hljs-comment"># 删除所有已停止的容器</span><br>docker <span class="hljs-built_in">rm</span> $(docker ps -a -q)<br><br><span class="hljs-comment"># 删除所有未使用的镜像</span><br>docker rmi $(docker images -f <span class="hljs-string">&quot;dangling=true&quot;</span> -q)<br><br><span class="hljs-comment"># 删除所有卷</span><br>docker volume <span class="hljs-built_in">rm</span> $(docker volume <span class="hljs-built_in">ls</span> -q)<br><br><span class="hljs-comment"># 批量查看容器日志</span><br><span class="hljs-keyword">for</span> container <span class="hljs-keyword">in</span> $(docker ps -q); <span class="hljs-keyword">do</span><br>    <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;=== <span class="hljs-variable">$container</span> ===&quot;</span><br>    docker logs --<span class="hljs-built_in">tail</span> 10 <span class="hljs-variable">$container</span><br><span class="hljs-keyword">done</span><br><br><span class="hljs-comment"># 批量重启容器</span><br>docker restart $(docker ps -q)<br></code></pre></td></tr></table></figure><h3 id="查找容器"><a href="#查找容器" class="headerlink" title="查找容器"></a>查找容器</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 根据名称查找容器</span><br>docker ps --filter name=my-container<br><br><span class="hljs-comment"># 根据镜像查找容器</span><br>docker ps --filter ancestor=nginx<br><br><span class="hljs-comment"># 根据状态查找容器</span><br>docker ps --filter status=exited<br><br><span class="hljs-comment"># 根据标签查找容器</span><br>docker ps --filter label=com.example.version=1.0<br><br><span class="hljs-comment"># 组合过滤</span><br>docker ps --filter name=my --filter status=running<br></code></pre></td></tr></table></figure><h3 id="资源限制"><a href="#资源限制" class="headerlink" title="资源限制"></a>资源限制</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 限制内存</span><br>docker run -d --memory=<span class="hljs-string">&quot;512m&quot;</span> nginx<br><br><span class="hljs-comment"># 限制 CPU</span><br>docker run -d --cpus=<span class="hljs-string">&quot;1.5&quot;</span> nginx<br><br><span class="hljs-comment"># 限制 CPU 核心数</span><br>docker run -d --cpuset-cpus=<span class="hljs-string">&quot;0,1&quot;</span> nginx<br><br><span class="hljs-comment"># 组合限制</span><br>docker run -d \<br>  --memory=<span class="hljs-string">&quot;1g&quot;</span> \<br>  --cpus=<span class="hljs-string">&quot;2.0&quot;</span> \<br>  --cpuset-cpus=<span class="hljs-string">&quot;0,1,2,3&quot;</span> \<br>  nginx<br></code></pre></td></tr></table></figure><h3 id="端口映射"><a href="#端口映射" class="headerlink" title="端口映射"></a>端口映射</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 映射单个端口</span><br>docker run -d -p 8080:80 nginx<br><br><span class="hljs-comment"># 映射多个端口</span><br>docker run -d -p 8080:80 -p 8443:443 nginx<br><br><span class="hljs-comment"># 映射到随机端口</span><br>docker run -d -p 80 nginx<br><br><span class="hljs-comment"># 映射到特定接口</span><br>docker run -d -p 127.0.0.1:8080:80 nginx<br><br><span class="hljs-comment"># 映射 UDP 端口</span><br>docker run -d -p 53:53/udp nginx<br></code></pre></td></tr></table></figure><h3 id="环境变量"><a href="#环境变量" class="headerlink" title="环境变量"></a>环境变量</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 设置单个环境变量</span><br>docker run -d -e KEY=VALUE nginx<br><br><span class="hljs-comment"># 设置多个环境变量</span><br>docker run -d -e KEY1=VALUE1 -e KEY2=VALUE2 nginx<br><br><span class="hljs-comment"># 从文件读取环境变量</span><br>docker run -d --env-file .<span class="hljs-built_in">env</span> nginx<br><br><span class="hljs-comment"># 从宿主机传递变量</span><br><span class="hljs-built_in">export</span> MY_VAR=<span class="hljs-string">&quot;hello&quot;</span><br>docker run -d -e MY_VAR nginx<br></code></pre></td></tr></table></figure><h3 id="工作目录"><a href="#工作目录" class="headerlink" title="工作目录"></a>工作目录</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 设置工作目录</span><br>docker run -d -w /app nginx<br><br><span class="hljs-comment"># 组合使用</span><br>docker run -d -w /app -v $(<span class="hljs-built_in">pwd</span>):/app nginx<br></code></pre></td></tr></table></figure><h3 id="用户权限"><a href="#用户权限" class="headerlink" title="用户权限"></a>用户权限</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 以特定用户运行</span><br>docker run -d -u nginx nginx<br><br><span class="hljs-comment"># 以特定 UID 和 GID 运行</span><br>docker run -d -u 1000:1000 nginx<br><br><span class="hljs-comment"># 以 root 用户运行</span><br>docker run -d -u root nginx<br></code></pre></td></tr></table></figure><h3 id="时间设置"><a href="#时间设置" class="headerlink" title="时间设置"></a>时间设置</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 设置时区</span><br>docker run -d -e TZ=Asia/Shanghai nginx<br><br><span class="hljs-comment"># 挂载时区文件</span><br>docker run -d -v /etc/localtime:/etc/localtime:ro nginx<br></code></pre></td></tr></table></figure><h3 id="容器互联"><a href="#容器互联" class="headerlink" title="容器互联"></a>容器互联</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 使用 --link 连接容器（已弃用）</span><br>docker run -d --name db postgres<br>docker run -d --<span class="hljs-built_in">link</span> db:db myapp<br><br><span class="hljs-comment"># 使用网络连接容器（推荐）</span><br>docker network create my-network<br>docker run -d --name db --network my-network postgres<br>docker run -d --name myapp --network my-network myapp<br></code></pre></td></tr></table></figure><hr><h2 id="常用组合命令"><a href="#常用组合命令" class="headerlink" title="常用组合命令"></a>常用组合命令</h2><h3 id="快速启动常用服务"><a href="#快速启动常用服务" class="headerlink" title="快速启动常用服务"></a>快速启动常用服务</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># Nginx</span><br>docker run -d --name nginx -p 80:80 -v $(<span class="hljs-built_in">pwd</span>)/html:/usr/share/nginx/html nginx<br><br><span class="hljs-comment"># MySQL</span><br>docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0<br><br><span class="hljs-comment"># Redis</span><br>docker run -d --name redis -p 6379:6379 redis:alpine<br><br><span class="hljs-comment"># MongoDB</span><br>docker run -d --name mongo -p 27017:27017 -e MONGO_INITDB_ROOT_USERNAME=admin -e MONGO_INITDB_ROOT_PASSWORD=123456 mongo<br><br><span class="hljs-comment"># PostgreSQL</span><br>docker run -d --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=123456 postgres<br><br><span class="hljs-comment"># RabbitMQ</span><br>docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:management<br><br><span class="hljs-comment"># Elasticsearch</span><br>docker run -d --name elasticsearch -p 9200:9200 -e <span class="hljs-string">&quot;discovery.type=single-node&quot;</span> elasticsearch:8.0.0<br></code></pre></td></tr></table></figure><h3 id="调试容器"><a href="#调试容器" class="headerlink" title="调试容器"></a>调试容器</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 进入容器调试</span><br>docker <span class="hljs-built_in">exec</span> -it &lt;容器名或ID&gt; /bin/bash<br><br><span class="hljs-comment"># 查看容器日志</span><br>docker logs -f --<span class="hljs-built_in">tail</span> 100 &lt;容器名或ID&gt;<br><br><span class="hljs-comment"># 查看容器进程</span><br>docker top &lt;容器名或ID&gt;<br><br><span class="hljs-comment"># 查看容器资源使用</span><br>docker stats &lt;容器名或ID&gt;<br><br><span class="hljs-comment"># 查看容器详细信息</span><br>docker inspect &lt;容器名或ID&gt;<br></code></pre></td></tr></table></figure><h3 id="备份与恢复"><a href="#备份与恢复" class="headerlink" title="备份与恢复"></a>备份与恢复</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 备份容器</span><br>docker <span class="hljs-built_in">export</span> &lt;容器名或ID&gt; &gt; backup.tar<br><br><span class="hljs-comment"># 备份镜像</span><br>docker save -o backup.tar &lt;镜像名&gt;<br><br><span class="hljs-comment"># 备份卷</span><br>docker run --<span class="hljs-built_in">rm</span> -v &lt;卷名&gt;:/data -v $(<span class="hljs-built_in">pwd</span>):/backup alpine tar czf /backup/backup.tar.gz /data<br><br><span class="hljs-comment"># 恢复容器</span><br>docker import backup.tar &lt;新镜像名&gt;:&lt;标签&gt;<br><br><span class="hljs-comment"># 恢复镜像</span><br>docker load -i backup.tar<br><br><span class="hljs-comment"># 恢复卷</span><br>docker run --<span class="hljs-built_in">rm</span> -v &lt;卷名&gt;:/data -v $(<span class="hljs-built_in">pwd</span>):/backup alpine tar xzf /backup/backup.tar.gz -C /<br></code></pre></td></tr></table></figure><hr><h2 id="快速参考表"><a href="#快速参考表" class="headerlink" title="快速参考表"></a>快速参考表</h2><h3 id="镜像命令"><a href="#镜像命令" class="headerlink" title="镜像命令"></a>镜像命令</h3><table><thead><tr><th align="left">命令</th><th align="left">说明</th></tr></thead><tbody><tr><td align="left"><code>docker search &lt;镜像&gt;</code></td><td align="left">搜索镜像</td></tr><tr><td align="left"><code>docker pull &lt;镜像&gt;</code></td><td align="left">拉取镜像</td></tr><tr><td align="left"><code>docker images</code></td><td align="left">列出镜像</td></tr><tr><td align="left"><code>docker build -t &lt;名&gt; .</code></td><td align="left">构建镜像</td></tr><tr><td align="left"><code>docker rmi &lt;镜像&gt;</code></td><td align="left">删除镜像</td></tr><tr><td align="left"><code>docker save -o file.tar &lt;镜像&gt;</code></td><td align="left">导出镜像</td></tr><tr><td align="left"><code>docker load -i file.tar</code></td><td align="left">导入镜像</td></tr><tr><td align="left"><code>docker tag &lt;源&gt; &lt;目标&gt;</code></td><td align="left">标记镜像</td></tr></tbody></table><h3 id="容器命令"><a href="#容器命令" class="headerlink" title="容器命令"></a>容器命令</h3><table><thead><tr><th align="left">命令</th><th align="left">说明</th></tr></thead><tbody><tr><td align="left"><code>docker run &lt;镜像&gt;</code></td><td align="left">创建并启动容器</td></tr><tr><td align="left"><code>docker ps</code></td><td align="left">列出运行中的容器</td></tr><tr><td align="left"><code>docker ps -a</code></td><td align="left">列出所有容器</td></tr><tr><td align="left"><code>docker start &lt;容器&gt;</code></td><td align="left">启动容器</td></tr><tr><td align="left"><code>docker stop &lt;容器&gt;</code></td><td align="left">停止容器</td></tr><tr><td align="left"><code>docker restart &lt;容器&gt;</code></td><td align="left">重启容器</td></tr><tr><td align="left"><code>docker rm &lt;容器&gt;</code></td><td align="left">删除容器</td></tr><tr><td align="left"><code>docker exec -it &lt;容器&gt; /bin/bash</code></td><td align="left">进入容器</td></tr><tr><td align="left"><code>docker logs &lt;容器&gt;</code></td><td align="left">查看日志</td></tr><tr><td align="left"><code>docker cp &lt;容器&gt;:&lt;路径&gt; .</code></td><td align="left">复制文件</td></tr></tbody></table><h3 id="网络命令"><a href="#网络命令" class="headerlink" title="网络命令"></a>网络命令</h3><table><thead><tr><th align="left">命令</th><th align="left">说明</th></tr></thead><tbody><tr><td align="left"><code>docker network ls</code></td><td align="left">列出网络</td></tr><tr><td align="left"><code>docker network create &lt;名&gt;</code></td><td align="left">创建网络</td></tr><tr><td align="left"><code>docker network connect &lt;网&gt; &lt;容&gt;</code></td><td align="left">连接网络</td></tr><tr><td align="left"><code>docker network disconnect &lt;网&gt; &lt;容&gt;</code></td><td align="left">断开网络</td></tr><tr><td align="left"><code>docker network rm &lt;网&gt;</code></td><td align="left">删除网络</td></tr></tbody></table><h3 id="卷命令"><a href="#卷命令" class="headerlink" title="卷命令"></a>卷命令</h3><table><thead><tr><th align="left">命令</th><th align="left">说明</th></tr></thead><tbody><tr><td align="left"><code>docker volume ls</code></td><td align="left">列出卷</td></tr><tr><td align="left"><code>docker volume create &lt;名&gt;</code></td><td align="left">创建卷</td></tr><tr><td align="left"><code>docker volume inspect &lt;名&gt;</code></td><td align="left">查看卷详情</td></tr><tr><td align="left"><code>docker volume rm &lt;名&gt;</code></td><td align="left">删除卷</td></tr><tr><td align="left"><code>docker volume prune</code></td><td align="left">清理未使用的卷</td></tr></tbody></table><h3 id="系统命令"><a href="#系统命令" class="headerlink" title="系统命令"></a>系统命令</h3><table><thead><tr><th align="left">命令</th><th align="left">说明</th></tr></thead><tbody><tr><td align="left"><code>docker info</code></td><td align="left">查看系统信息</td></tr><tr><td align="left"><code>docker version</code></td><td align="left">查看版本</td></tr><tr><td align="left"><code>docker system df</code></td><td align="left">查看磁盘使用</td></tr><tr><td align="left"><code>docker system prune</code></td><td align="left">清理未使用资源</td></tr><tr><td align="left"><code>docker stats</code></td><td align="left">查看资源使用</td></tr></tbody></table><hr><h2 id="常用参数速查"><a href="#常用参数速查" class="headerlink" title="常用参数速查"></a>常用参数速查</h2><h3 id="docker-run-常用参数"><a href="#docker-run-常用参数" class="headerlink" title="docker run 常用参数"></a>docker run 常用参数</h3><table><thead><tr><th align="left">参数</th><th align="left">说明</th><th align="left">示例</th></tr></thead><tbody><tr><td align="left"><code>-d</code></td><td align="left">后台运行</td><td align="left"><code>docker run -d nginx</code></td></tr><tr><td align="left"><code>-it</code></td><td align="left">交互式终端</td><td align="left"><code>docker run -it ubuntu bash</code></td></tr><tr><td align="left"><code>--name</code></td><td align="left">指定名称</td><td align="left"><code>docker run --name my-nginx nginx</code></td></tr><tr><td align="left"><code>-p</code></td><td align="left">端口映射</td><td align="left"><code>docker run -p 8080:80 nginx</code></td></tr><tr><td align="left"><code>-v</code></td><td align="left">挂载卷</td><td align="left"><code>docker run -v /data:/app nginx</code></td></tr><tr><td align="left"><code>-e</code></td><td align="left">环境变量</td><td align="left"><code>docker run -e KEY=VAL nginx</code></td></tr><tr><td align="left"><code>--rm</code></td><td align="left">退出后删除</td><td align="left"><code>docker run --rm ubuntu bash</code></td></tr><tr><td align="left"><code>--restart</code></td><td align="left">重启策略</td><td align="left"><code>docker run --restart=always nginx</code></td></tr><tr><td align="left"><code>-u</code></td><td align="left">指定用户</td><td align="left"><code>docker run -u nginx nginx</code></td></tr><tr><td align="left"><code>-w</code></td><td align="left">工作目录</td><td align="left"><code>docker run -w /app nginx</code></td></tr></tbody></table><h3 id="docker-exec-常用参数"><a href="#docker-exec-常用参数" class="headerlink" title="docker exec 常用参数"></a>docker exec 常用参数</h3><table><thead><tr><th align="left">参数</th><th align="left">说明</th><th align="left">示例</th></tr></thead><tbody><tr><td align="left"><code>-i</code></td><td align="left">保持输入开启</td><td align="left"><code>docker exec -i my-nginx bash</code></td></tr><tr><td align="left"><code>-t</code></td><td align="left">分配终端</td><td align="left"><code>docker exec -t my-nginx bash</code></td></tr><tr><td align="left"><code>-d</code></td><td align="left">后台执行</td><td align="left"><code>docker exec -d my-nginx sleep 10</code></td></tr><tr><td align="left"><code>-u</code></td><td align="left">指定用户</td><td align="left"><code>docker exec -u root my-nginx bash</code></td></tr><tr><td align="left"><code>-w</code></td><td align="left">工作目录</td><td align="left"><code>docker exec -w /tmp my-nginx ls</code></td></tr><tr><td align="left"><code>-e</code></td><td align="left">环境变量</td><td align="left"><code>docker exec -e DEBUG=1 my-nginx bash</code></td></tr></tbody></table><h3 id="docker-logs-常用参数"><a href="#docker-logs-常用参数" class="headerlink" title="docker logs 常用参数"></a>docker logs 常用参数</h3><table><thead><tr><th align="left">参数</th><th align="left">说明</th><th align="left">示例</th></tr></thead><tbody><tr><td align="left"><code>-f</code></td><td align="left">实时跟踪</td><td align="left"><code>docker logs -f my-nginx</code></td></tr><tr><td align="left"><code>--tail</code></td><td align="left">显示最后N行</td><td align="left"><code>docker logs --tail 100 my-nginx</code></td></tr><tr><td align="left"><code>-t</code></td><td align="left">显示时间戳</td><td align="left"><code>docker logs -t my-nginx</code></td></tr><tr><td align="left"><code>--since</code></td><td align="left">显示最近时间</td><td align="left"><code>docker logs --since 10m my-nginx</code></td></tr></tbody></table><hr><h2 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h2><h3 id="权限问题"><a href="#权限问题" class="headerlink" title="权限问题"></a>权限问题</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># Linux 系统需要 sudo</span><br><span class="hljs-built_in">sudo</span> docker ps<br><span class="hljs-built_in">sudo</span> docker images<br><span class="hljs-built_in">sudo</span> docker run -d nginx<br><br><span class="hljs-comment"># 或将用户添加到 docker 组</span><br><span class="hljs-built_in">sudo</span> usermod -aG docker <span class="hljs-variable">$USER</span><br><span class="hljs-comment"># 需要重新登录生效</span><br></code></pre></td></tr></table></figure><h3 id="容器命名"><a href="#容器命名" class="headerlink" title="容器命名"></a>容器命名</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 使用有意义的名称</span><br>docker run -d --name web-server nginx<br>docker run -d --name db-server mysql<br>docker run -d --name cache-server redis<br></code></pre></td></tr></table></figure><h3 id="数据持久化"><a href="#数据持久化" class="headerlink" title="数据持久化"></a>数据持久化</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 始终使用 -v 挂载数据</span><br>docker run -d -v mysql-data:/var/lib/mysql mysql<br>docker run -d -v $(<span class="hljs-built_in">pwd</span>)/data:/app/data nginx<br></code></pre></td></tr></table></figure><h3 id="资源限制-1"><a href="#资源限制-1" class="headerlink" title="资源限制"></a>资源限制</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 生产环境建议设置资源限制</span><br>docker run -d \<br>  --memory=<span class="hljs-string">&quot;1g&quot;</span> \<br>  --cpus=<span class="hljs-string">&quot;1.0&quot;</span> \<br>  --restart=unless-stopped \<br>  nginx<br></code></pre></td></tr></table></figure><h3 id="安全建议"><a href="#安全建议" class="headerlink" title="安全建议"></a>安全建议</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 不要在命令中直接写密码</span><br>docker run -e PASSWORD=$(<span class="hljs-built_in">cat</span> /path/to/password) myapp<br><br><span class="hljs-comment"># 使用只读文件系统</span><br>docker run --read-only nginx<br><br><span class="hljs-comment"># 使用非 root 用户</span><br>docker run -u nginx nginx<br></code></pre></td></tr></table></figure><hr><h2 id="附录：常用镜像标签"><a href="#附录：常用镜像标签" class="headerlink" title="附录：常用镜像标签"></a>附录：常用镜像标签</h2><table><thead><tr><th align="left">镜像</th><th align="left">常用标签</th><th align="left">说明</th></tr></thead><tbody><tr><td align="left"><strong>nginx</strong></td><td align="left"><code>latest</code>, <code>alpine</code>, <code>1.21</code>, <code>stable</code></td><td align="left">Web 服务器</td></tr><tr><td align="left"><strong>mysql</strong></td><td align="left"><code>latest</code>, <code>8.0</code>, <code>5.7</code></td><td align="left">数据库</td></tr><tr><td align="left"><strong>redis</strong></td><td align="left"><code>latest</code>, <code>alpine</code>, <code>6.2</code></td><td align="left">缓存</td></tr><tr><td align="left"><strong>postgres</strong></td><td align="left"><code>latest</code>, <code>14</code>, <code>13</code></td><td align="left">数据库</td></tr><tr><td align="left"><strong>node</strong></td><td align="left"><code>latest</code>, <code>18</code>, <code>alpine</code></td><td align="left">Node.js 运行时</td></tr><tr><td align="left"><strong>python</strong></td><td align="left"><code>latest</code>, <code>3.11</code>, <code>3.10</code>, <code>alpine</code></td><td align="left">Python 运行时</td></tr><tr><td align="left"><strong>ubuntu</strong></td><td align="left"><code>latest</code>, <code>22.04</code>, <code>20.04</code></td><td align="left">Ubuntu 系统</td></tr><tr><td align="left"><strong>alpine</strong></td><td align="left"><code>latest</code>, <code>3.18</code></td><td align="left">轻量级 Linux</td></tr><tr><td align="left"><strong>centos</strong></td><td align="left"><code>latest</code>, <code>7</code>, <code>8</code></td><td align="left">CentOS 系统</td></tr><tr><td align="left"><strong>debian</strong></td><td align="left"><code>latest</code>, <code>bullseye</code>, <code>buster</code></td><td align="left">Debian 系统</td></tr></tbody></table><hr><p><strong>提示</strong>：将此文档保存为书签，随时查阅 Docker 命令！</p>]]>
    </content>
    <id>https://cmijohnson.github.io/blog/2026/04/22/Docker%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4%E9%80%9F%E6%9F%A5%E6%89%8B%E5%86%8C/</id>
    <link href="https://cmijohnson.github.io/blog/2026/04/22/Docker%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4%E9%80%9F%E6%9F%A5%E6%89%8B%E5%86%8C/"/>
    <published>2026-04-22T14:41:32.000Z</published>
    <summary>
      <![CDATA[<h1 id="Docker-常用命令速查手册"><a href="#Docker-常用命令速查手册" class="headerlink" title="Docker 常用命令速查手册"></a>Docker 常用命令速查手册</h1><blockquote>
<p>快速查找]]>
    </summary>
    <title>Docker 常用命令速查手册</title>
    <updated>2026-06-26T19:43:40.497Z</updated>
  </entry>
  <entry>
    <author>
      <name>cmijohnson</name>
    </author>
    <category term="技术" scheme="https://cmijohnson.github.io/blog/categories/%E6%8A%80%E6%9C%AF/"/>
    <category term="安全" scheme="https://cmijohnson.github.io/blog/tags/%E5%AE%89%E5%85%A8/"/>
    <category term="Vue" scheme="https://cmijohnson.github.io/blog/tags/Vue/"/>
    <category term="Web开发" scheme="https://cmijohnson.github.io/blog/tags/Web%E5%BC%80%E5%8F%91/"/>
    <category term="团队项目" scheme="https://cmijohnson.github.io/blog/tags/%E5%9B%A2%E9%98%9F%E9%A1%B9%E7%9B%AE/"/>
    <content>
      <![CDATA[<h2 id="摘要-Abstract"><a href="#摘要-Abstract" class="headerlink" title="摘要 | Abstract"></a>摘要 | Abstract</h2><p>本文介绍智链细米安全盾队展示系统的设计与实现。该系统采用 Vue 3 + Vite 前端与 PHP + MySQL 后端的全栈架构，为高校网络安全团队提供了一个涵盖成员展示、竞赛成果归档、科研项目管理、指导教师信息及文章发布的综合性展示平台。系统支持前台展示与后台管理双模式，并通过 JWT 鉴权保障管理操作的安全性。</p><p>项目仓库：<a href="https://github.com/cmijohnson/team_UJSEAIIS">github.com&#x2F;cmijohnson&#x2F;team_UJSEAIIS</a></p><h2 id="1-引言-Introduction"><a href="#1-引言-Introduction" class="headerlink" title="1. 引言 | Introduction"></a>1. 引言 | Introduction</h2><p>高校网络安全团队在 CTF 竞赛、攻防演练与安全研究中扮演着重要角色。然而，许多团队缺乏一个系统化的展示平台来记录和传播团队成果。智链细米安全盾队（以下简称”安全盾队”）作为一支专注于网络空间安全的高校团队，其研究方向涵盖 <strong>Web 安全</strong>、<strong>二进制分析</strong>、<strong>区块链安全</strong> 与 <strong>云原生安全</strong> 等领域。</p><p>为提升团队的专业形象与信息透明度，我们设计并实现了一套团队展示系统，旨在以结构化的方式呈现团队成员、竞赛荣誉、科研项目及技术文章。</p><h2 id="2-团队概况-Team-Overview"><a href="#2-团队概况-Team-Overview" class="headerlink" title="2. 团队概况 | Team Overview"></a>2. 团队概况 | Team Overview</h2><h3 id="2-1-核心成员"><a href="#2-1-核心成员" class="headerlink" title="2.1 核心成员"></a>2.1 核心成员</h3><table><thead><tr><th>姓名</th><th>职责</th><th>研究方向</th></tr></thead><tbody><tr><td>张晨</td><td>队长</td><td>Web 安全方向训练与项目统筹，长期参与攻防演练</td></tr><tr><td>李航</td><td>核心成员</td><td>二进制分析与漏洞挖掘，参与多个攻防科研项目</td></tr><tr><td>王越</td><td>开发工程师</td><td>平台开发与自动化工具建设，支撑团队研发交付</td></tr><tr><td>赵宁</td><td>安全研究员</td><td>区块链与智能合约安全，参与审计和安全工具建设</td></tr></tbody></table><h3 id="2-2-竞赛成果"><a href="#2-2-竞赛成果" class="headerlink" title="2.2 竞赛成果"></a>2.2 竞赛成果</h3><table><thead><tr><th>竞赛名称</th><th>时间</th><th>成绩</th></tr></thead><tbody><tr><td>全国大学生信息安全竞赛</td><td>2023-10</td><td>全国一等奖</td></tr><tr><td>XCTF 国际网络安全联赛</td><td>2023-06</td><td>分站赛亚军</td></tr></tbody></table><h3 id="2-3-科研项目"><a href="#2-3-科研项目" class="headerlink" title="2.3 科研项目"></a>2.3 科研项目</h3><p><strong>基于区块链的物联网设备身份认证系统</strong>（进行中）</p><ul><li>面向海量设备场景，探索轻量级可信身份认证方案</li><li>已完成原型设计与核心模块开发</li></ul><p><strong>容器逃逸检测机制研究</strong>（已完成）</p><ul><li>面向云原生环境，研究基于系统调用序列的异常检测方法</li><li>形成可复用检测规则与实验数据集</li></ul><h2 id="3-系统设计-System-Design"><a href="#3-系统设计-System-Design" class="headerlink" title="3. 系统设计 | System Design"></a>3. 系统设计 | System Design</h2><h3 id="3-1-技术架构"><a href="#3-1-技术架构" class="headerlink" title="3.1 技术架构"></a>3.1 技术架构</h3><p>系统采用前后端分离的 SPA + REST API 架构模式：</p><table><thead><tr><th>层级</th><th>技术栈</th></tr></thead><tbody><tr><td>前端框架</td><td>Vue 3.4 + TypeScript</td></tr><tr><td>构建工具</td><td>Vite</td></tr><tr><td>UI 组件库</td><td>Element Plus 2.13</td></tr><tr><td>样式方案</td><td>Tailwind CSS</td></tr><tr><td>状态管理</td><td>Pinia</td></tr><tr><td>路由管理</td><td>Vue Router</td></tr><tr><td>后端语言</td><td>PHP 8.0</td></tr><tr><td>数据库</td><td>MySQL 8.0</td></tr><tr><td>鉴权方案</td><td>JWT (HS256)</td></tr></tbody></table><h3 id="3-2-功能模块"><a href="#3-2-功能模块" class="headerlink" title="3.2 功能模块"></a>3.2 功能模块</h3><p>系统包含前台展示（7 个页面）与后台管理（7 个页面）两大模块：</p><p><strong>前台展示模块：</strong></p><ul><li><strong>首页</strong> — 轮播图、团队简介、最新动态、快速导航</li><li><strong>团队风采</strong> — 核心成员卡片与团队发展时间轴</li><li><strong>竞赛成果</strong> — 按时间线展示竞赛获奖，支持图文混排</li><li><strong>科研项目</strong> — 项目卡片网格，标注进行中 &#x2F; 已完成 &#x2F; 计划中状态</li><li><strong>指导教师</strong> — 教师简介、研究方向与联系方式</li><li><strong>文章列表</strong> — 分页文章列表，支持分类筛选</li><li><strong>文章详情</strong> — Markdown 渲染，支持代码高亮</li></ul><p><strong>后台管理模块：</strong></p><ul><li>管理员登录（JWT 鉴权）</li><li>文章 CRUD（内置 Markdown 编辑器）</li><li>成员管理、竞赛管理、项目管理、时间轴管理</li><li>仪表盘概览（统计数据与快捷操作）</li></ul><h3 id="3-3-数据库设计"><a href="#3-3-数据库设计" class="headerlink" title="3.3 数据库设计"></a>3.3 数据库设计</h3><p>系统共设计 8 张核心数据表：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-comment">-- 核心表结构概要</span><br>admins          <span class="hljs-comment">-- 管理员账户（用户名、密码哈希、JWT）</span><br>articles        <span class="hljs-comment">-- 文章（标题、分类、Markdown 内容、封面、浏览量）</span><br>members         <span class="hljs-comment">-- 团队成员（姓名、职位、头像、简介、排序）</span><br>competitions    <span class="hljs-comment">-- 竞赛成果（名称、日期、成绩、图片）</span><br>projects        <span class="hljs-comment">-- 科研项目（标题、状态、日期、描述、成果）</span><br>advisors        <span class="hljs-comment">-- 指导教师（姓名、职称、研究方向、联系方式）</span><br>timeline_events <span class="hljs-comment">-- 团队发展时间轴</span><br>images          <span class="hljs-comment">-- 图片资源管理</span><br></code></pre></td></tr></table></figure><h2 id="4-实现要点-Implementation-Highlights"><a href="#4-实现要点-Implementation-Highlights" class="headerlink" title="4. 实现要点 | Implementation Highlights"></a>4. 实现要点 | Implementation Highlights</h2><h3 id="4-1-前端-Mock-数据降级"><a href="#4-1-前端-Mock-数据降级" class="headerlink" title="4.1 前端 Mock 数据降级"></a>4.1 前端 Mock 数据降级</h3><p>系统在 API 不可用时自动降级为内置 Mock 数据，确保前端展示的连续性。这一设计使得前端开发可以独立于后端进行，同时也为演示场景提供了便利。</p><h3 id="4-2-JWT-鉴权流程"><a href="#4-2-JWT-鉴权流程" class="headerlink" title="4.2 JWT 鉴权流程"></a>4.2 JWT 鉴权流程</h3><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs typescript"><span class="hljs-comment">// 前端请求拦截器自动附加 Token</span><br>axios.<span class="hljs-property">interceptors</span>.<span class="hljs-property">request</span>.<span class="hljs-title function_">use</span>(<span class="hljs-function"><span class="hljs-params">config</span> =&gt;</span> &#123;<br>  <span class="hljs-keyword">const</span> token = <span class="hljs-variable language_">localStorage</span>.<span class="hljs-title function_">getItem</span>(<span class="hljs-string">&#x27;admin_token&#x27;</span>)<br>  <span class="hljs-keyword">if</span> (token) config.<span class="hljs-property">headers</span>.<span class="hljs-property">Authorization</span> = <span class="hljs-string">`Bearer <span class="hljs-subst">$&#123;token&#125;</span>`</span><br>  <span class="hljs-keyword">return</span> config<br>&#125;)<br></code></pre></td></tr></table></figure><h3 id="4-3-响应式设计"><a href="#4-3-响应式设计" class="headerlink" title="4.3 响应式设计"></a>4.3 响应式设计</h3><p>系统采用移动优先的响应式布局，在桌面端展示为多列网格，在移动端自动折叠为单列布局，导航栏切换为汉堡菜单模式。</p><h2 id="5-结论-Conclusion"><a href="#5-结论-Conclusion" class="headerlink" title="5. 结论 | Conclusion"></a>5. 结论 | Conclusion</h2><p>智链细米安全盾队展示系统为高校网络安全团队提供了一套完整的数字化展示解决方案。系统采用主流的前后端分离架构，具备良好的可维护性与可扩展性。未来计划包括：集成对象存储服务以支持图片云上传、增加评论互动功能、以及对接学校统一身份认证系统。</p><h2 id="参考文献-References"><a href="#参考文献-References" class="headerlink" title="参考文献 | References"></a>参考文献 | References</h2><ol><li>Vue 3 Documentation. [Online]. Available: <a href="https://vuejs.org/">https://vuejs.org/</a></li><li>Element Plus Documentation. [Online]. Available: <a href="https://element-plus.org/">https://element-plus.org/</a></li><li>PHP Official Documentation. [Online]. Available: <a href="https://www.php.net/docs.php">https://www.php.net/docs.php</a></li><li>JSON Web Tokens (JWT). [Online]. Available: <a href="https://jwt.io/">https://jwt.io/</a></li></ol>]]>
    </content>
    <id>https://cmijohnson.github.io/blog/2026/04/22/team-showcase/</id>
    <link href="https://cmijohnson.github.io/blog/2026/04/22/team-showcase/"/>
    <published>2026-04-22T08:00:00.000Z</published>
    <summary>
      <![CDATA[<h2 id="摘要-Abstract"><a href="#摘要-Abstract" class="headerlink" title="摘要 | Abstract"></a>摘要 | Abstract</h2><p>本文介绍智链细米安全盾队展示系统的设计与实现。该系统采用 V]]>
    </summary>
    <title>智链细米安全盾队：团队展示系统的设计与实现 | Team Showcase System Design</title>
    <updated>2026-06-26T19:43:40.497Z</updated>
  </entry>
  <entry>
    <author>
      <name>cmijohnson</name>
    </author>
    <category term="技术" scheme="https://cmijohnson.github.io/blog/categories/%E6%8A%80%E6%9C%AF/"/>
    <category term="Hexo" scheme="https://cmijohnson.github.io/blog/tags/Hexo/"/>
    <category term="GitHub" scheme="https://cmijohnson.github.io/blog/tags/GitHub/"/>
    <category term="教程" scheme="https://cmijohnson.github.io/blog/tags/%E6%95%99%E7%A8%8B/"/>
    <category term="Academic" scheme="https://cmijohnson.github.io/blog/tags/Academic/"/>
    <content>
      <![CDATA[<h2 id="摘要-Abstract"><a href="#摘要-Abstract" class="headerlink" title="摘要 | Abstract"></a>摘要 | Abstract</h2><p>本文系统性地介绍基于 Hexo 静态站点生成器与 GitHub Pages 持续部署服务搭建个人学术博客的完整技术方案。内容涵盖开发环境配置、主题选型与定制、学术化样式改造以及基于 GitHub Actions 的自动化部署流水线搭建等关键环节，旨在为有类似需求的研究者提供可复现的技术参考。</p><h2 id="1-引言-Introduction"><a href="#1-引言-Introduction" class="headerlink" title="1. 引言 | Introduction"></a>1. 引言 | Introduction</h2><p>在学术研究与技术交流中，个人博客作为一种轻量级的知识发布平台，具有建设成本低、维护便捷、内容自主可控等优势。相较于 WordPress 等传统内容管理系统，基于静态站点生成器（Static Site Generator, SSG）的方案在安全性、性能与部署灵活性方面具有显著优势 [1]。</p><p>Hexo 是一款基于 Node.js 的开源静态博客框架，以其丰富的主题生态和简洁的 Markdown 写作工作流著称。配合 GitHub Pages 的免费托管与 GitHub Actions 的持续集成能力，可以构建一套零成本、全自动的学术博客系统。</p><h2 id="2-相关工作-Related-Work"><a href="#2-相关工作-Related-Work" class="headerlink" title="2. 相关工作 | Related Work"></a>2. 相关工作 | Related Work</h2><p>目前主流的静态站点生成方案包括：</p><ul><li><strong>Hugo</strong> — 基于 Go 语言，构建速度极快，但模板语法学习曲线较陡</li><li><strong>Jekyll</strong> — GitHub Pages 原生支持，Ruby 生态成熟，但构建速度较慢</li><li><strong>Next.js &#x2F; Nuxt.js</strong> — 全栈框架的 SSG 模式，功能强大但对纯博客场景过于复杂</li><li><strong>Hexo</strong> — Node.js 生态，主题丰富（如 Butterfly、Fluid），插件体系完善</li></ul><p>本文选择 Hexo + Butterfly 主题的技术方案，主要基于其良好的中文学术社区支持与开箱即用的 KaTeX 数学公式渲染能力。</p><h2 id="3-方法-Methodology"><a href="#3-方法-Methodology" class="headerlink" title="3. 方法 | Methodology"></a>3. 方法 | Methodology</h2><h3 id="3-1-环境配置"><a href="#3-1-环境配置" class="headerlink" title="3.1 环境配置"></a>3.1 环境配置</h3><p>系统要求：Node.js &gt;&#x3D; 18.0，npm 或 yarn 包管理器。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 全局安装 Hexo CLI</span><br>npm install -g hexo-cli<br><br><span class="hljs-comment"># 初始化项目</span><br>hexo init blog &amp;&amp; <span class="hljs-built_in">cd</span> blog<br>npm install<br></code></pre></td></tr></table></figure><h3 id="3-2-主题安装与配置"><a href="#3-2-主题安装与配置" class="headerlink" title="3.2 主题安装与配置"></a>3.2 主题安装与配置</h3><p>Butterfly 主题可通过 npm 直接安装，无需手动克隆仓库：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">npm install hexo-theme-butterfly<br></code></pre></td></tr></table></figure><p>在 <code>_config.yml</code> 中指定主题：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs yaml"><span class="hljs-attr">theme:</span> <span class="hljs-string">butterfly</span><br></code></pre></td></tr></table></figure><h3 id="3-3-学术化定制"><a href="#3-3-学术化定制" class="headerlink" title="3.3 学术化定制"></a>3.3 学术化定制</h3><p>为了赋予博客学术气质，需进行以下定制：</p><ol><li><strong>元信息调整</strong> — 设置正式的站点标题与描述</li><li><strong>菜单结构</strong> — 增加「研究」等学术导航项</li><li><strong>数学公式支持</strong> — 启用 Butterfly 内置的 KaTeX 渲染引擎</li><li><strong>自定义样式</strong> — 添加摘要区块、引用列表等学术排版元素</li></ol><p>KaTeX 的启用仅需在 <code>_config.butterfly.yml</code> 中添加：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs yaml"><span class="hljs-attr">math:</span><br>  <span class="hljs-attr">use:</span> <span class="hljs-string">katex</span><br>  <span class="hljs-attr">per_page:</span> <span class="hljs-literal">true</span><br>  <span class="hljs-attr">katex:</span><br>    <span class="hljs-attr">copy_tex:</span> <span class="hljs-literal">true</span><br></code></pre></td></tr></table></figure><h3 id="3-4-自动化部署"><a href="#3-4-自动化部署" class="headerlink" title="3.4 自动化部署"></a>3.4 自动化部署</h3><p>利用 GitHub Actions 实现推送即部署的 CI&#x2F;CD 流程：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><code class="hljs yaml"><span class="hljs-comment"># .github/workflows/deploy.yml</span><br><span class="hljs-attr">name:</span> <span class="hljs-string">Deploy</span><br><span class="hljs-attr">on:</span><br>  <span class="hljs-attr">push:</span><br>    <span class="hljs-attr">branches:</span> [<span class="hljs-string">main</span>]<br><span class="hljs-attr">jobs:</span><br>  <span class="hljs-attr">build-and-deploy:</span><br>    <span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span><br>    <span class="hljs-attr">steps:</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/checkout@v4</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/setup-node@v4</span><br>        <span class="hljs-attr">with:</span><br>          <span class="hljs-attr">node-version:</span> <span class="hljs-number">20</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-attr">run:</span> <span class="hljs-string">npm</span> <span class="hljs-string">install</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-attr">run:</span> <span class="hljs-string">npx</span> <span class="hljs-string">hexo</span> <span class="hljs-string">generate</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/deploy-pages@v4</span><br></code></pre></td></tr></table></figure><h2 id="4-结果与讨论-Results-Discussion"><a href="#4-结果与讨论-Results-Discussion" class="headerlink" title="4. 结果与讨论 | Results &amp; Discussion"></a>4. 结果与讨论 | Results &amp; Discussion</h2><p>采用上述方案搭建的博客系统具有以下特征：</p><ul><li><strong>构建性能</strong> — Hexo 在中等规模（&lt; 100 篇文章）下的全站构建时间通常在数秒以内</li><li><strong>部署效率</strong> — GitHub Actions 工作流从触发到部署完成约需 1–2 分钟</li><li><strong>维护成本</strong> — 仅需关注 Markdown 内容创作，基础设施由 GitHub 托管</li></ul><p>潜在的改进方向包括：引入评论系统（如 Giscus）、集成学术引用管理（如 DOI 自动解析）、以及支持 LaTeX 长文排版等。</p><h2 id="5-结论-Conclusion"><a href="#5-结论-Conclusion" class="headerlink" title="5. 结论 | Conclusion"></a>5. 结论 | Conclusion</h2><p>本文介绍了基于 Hexo + GitHub Pages + GitHub Actions 搭建个人学术博客的完整技术方案。该方案以零成本实现了从写作到部署的全流程自动化，适合作为研究者个人知识管理与学术交流的基础设施。</p><h2 id="参考文献-References"><a href="#参考文献-References" class="headerlink" title="参考文献 | References"></a>参考文献 | References</h2><ol><li>“Static Site Generator,” <em>Wikipedia</em>, 2026. [Online]. Available: <a href="https://en.wikipedia.org/wiki/Static_site_generator">https://en.wikipedia.org/wiki/Static_site_generator</a></li><li>Hexo Official Documentation. [Online]. Available: <a href="https://hexo.io/docs/">https://hexo.io/docs/</a></li><li>hexo-theme-butterfly Documentation. [Online]. Available: <a href="https://butterfly.js.org/">https://butterfly.js.org/</a></li><li>GitHub Actions Documentation. [Online]. Available: <a href="https://docs.github.com/en/actions">https://docs.github.com/en/actions</a></li></ol>]]>
    </content>
    <id>https://cmijohnson.github.io/blog/2026/04/22/hexo-guide/</id>
    <link href="https://cmijohnson.github.io/blog/2026/04/22/hexo-guide/"/>
    <published>2026-04-22T05:00:00.000Z</published>
    <summary>
      <![CDATA[<h2 id="摘要-Abstract"><a href="#摘要-Abstract" class="headerlink" title="摘要 | Abstract"></a>摘要 | Abstract</h2><p>本文系统性地介绍基于 Hexo 静态站点生成器与 GitHu]]>
    </summary>
    <title>Hexo + GitHub Pages 学术博客搭建：从零到部署 | Building an Academic Blog</title>
    <updated>2026-06-26T19:43:40.497Z</updated>
  </entry>
  <entry>
    <author>
      <name>cmijohnson</name>
    </author>
    <category term="日常" scheme="https://cmijohnson.github.io/blog/categories/%E6%97%A5%E5%B8%B8/"/>
    <category term="随笔" scheme="https://cmijohnson.github.io/blog/tags/%E9%9A%8F%E7%AC%94/"/>
    <category term="Research" scheme="https://cmijohnson.github.io/blog/tags/Research/"/>
    <content>
      <![CDATA[<h2 id="摘要-Abstract"><a href="#摘要-Abstract" class="headerlink" title="摘要 | Abstract"></a>摘要 | Abstract</h2><p>本文作为本学术博客的开篇，系统性地介绍笔者在计算机科学领域的学习背景、核心技术研究方向以及代表性项目实践。通过梳理过往工作，为后续系列技术文章的写作提供上下文框架。</p><h2 id="引言-Introduction"><a href="#引言-Introduction" class="headerlink" title="引言 | Introduction"></a>引言 | Introduction</h2><p>随着信息技术在高等教育和社会生产中的广泛应用，计算机科学的研究与实践日益呈现出跨学科融合的趋势。作为一名就读于江苏大学的全栈开发者，笔者的研究兴趣聚焦于 <strong>Web 系统工程</strong>、<strong>分布式通信</strong> 与 <strong>智能校园应用</strong> 三个方向。</p><p>本博客旨在以学术化的视角记录技术探索过程中的思考、实验与总结，期望为相关领域的研究者和开发者提供参考。</p><h2 id="研究背景-Background"><a href="#研究背景-Background" class="headerlink" title="研究背景 | Background"></a>研究背景 | Background</h2><p>笔者在本科阶段系统学习了计算机科学基础课程，包括数据结构与算法、计算机网络、操作系统以及数据库系统等核心内容。在实践层面，笔者积累了 Vue 3、Python、FastAPI、Electron 等现代技术栈的项目经验，专注于将理论知识转化为可运行的工程系统。</p><h2 id="核心技术方向-Core-Research-Directions"><a href="#核心技术方向-Core-Research-Directions" class="headerlink" title="核心技术方向 | Core Research Directions"></a>核心技术方向 | Core Research Directions</h2><h3 id="1-Web-系统工程"><a href="#1-Web-系统工程" class="headerlink" title="1. Web 系统工程"></a>1. Web 系统工程</h3><p>研究现代 Web 应用的架构设计模式，探索前后端分离架构下的性能优化策略。代表性工作包括基于 Vue 3 + FastAPI 的团队协作系统——智链青鸟，该系统采用轻量化设计哲学，实现了高效的任务管理与团队通信功能。</p><h3 id="2-分布式通信"><a href="#2-分布式通信" class="headerlink" title="2. 分布式通信"></a>2. 分布式通信</h3><p>探索基于 WebRTC 的对等网络通信协议，研究 NAT 穿透、数据通道建立等关键技术问题。代表性工作为基于 Vue + WebRTC 的 P2P 局域网聊天工具，实现了无需中心服务器的端到端加密通信。</p><h3 id="3-智能校园系统"><a href="#3-智能校园系统" class="headerlink" title="3. 智能校园系统"></a>3. 智能校园系统</h3><p>针对高校场景下的数字化需求，设计并实现了一系列实用工具，包括宿舍用电查询系统、校园文件打印管理平台等。这些工作体现了将技术应用于解决实际校园生活问题的工程实践能力。</p><h2 id="代表性工作-Selected-Projects"><a href="#代表性工作-Selected-Projects" class="headerlink" title="代表性工作 | Selected Projects"></a>代表性工作 | Selected Projects</h2><table><thead><tr><th>项目</th><th>描述</th><th>技术栈</th></tr></thead><tbody><tr><td>智链青鸟</td><td>轻量级团队协作系统</td><td>Vue 3, FastAPI</td></tr><tr><td>P2P 局域网聊天</td><td>端到端加密内网通信</td><td>Vue, WebRTC</td></tr><tr><td>文件管理器</td><td>跨平台桌面文件管理器</td><td>React, Electron</td></tr><tr><td>细米兰阁导航</td><td>Web 导航与工具箱平台</td><td>Vue, Vite</td></tr></tbody></table><h2 id="结语-Conclusion"><a href="#结语-Conclusion" class="headerlink" title="结语 | Conclusion"></a>结语 | Conclusion</h2><p>本博客后续将围绕上述研究方向，持续发布技术分析、系统设计与实验总结类文章。欢迎通过 <a href="https://github.com/cmijohnson">GitHub</a> 与笔者交流讨论。</p>]]>
    </content>
    <id>https://cmijohnson.github.io/blog/2026/04/22/welcome/</id>
    <link href="https://cmijohnson.github.io/blog/2026/04/22/welcome/"/>
    <published>2026-04-22T04:00:00.000Z</published>
    <summary>
      <![CDATA[<h2 id="摘要-Abstract"><a href="#摘要-Abstract" class="headerlink" title="摘要 | Abstract"></a>摘要 | Abstract</h2><p>本文作为本学术博客的开篇，系统性地介绍笔者在计算机科学领域的]]>
    </summary>
    <title>
      <![CDATA[博客启刊：个人简介与研究方向 | Inaugural Post: Introduction & Research Directions]]>
    </title>
    <updated>2026-06-26T19:43:40.497Z</updated>
  </entry>
</feed>
