<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Sowevo的博客</title>
  
  
  <link href="https://sowevo.com/atom.xml" rel="self"/>
  
  <link href="https://sowevo.com/"/>
  <updated>2026-04-17T12:31:00.000Z</updated>
  <id>https://sowevo.com/</id>
  
  <author>
    <name>Sowevo</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>从Docker Desktop迁移到Colima记录</title>
    <link href="https://sowevo.com/%E4%BB%8EDocker%20Desktop%E8%BF%81%E7%A7%BB%E5%88%B0Colima%E8%AE%B0%E5%BD%95/"/>
    <id>https://sowevo.com/%E4%BB%8EDocker%20Desktop%E8%BF%81%E7%A7%BB%E5%88%B0Colima%E8%AE%B0%E5%BD%95/</id>
    <published>2026-04-17T12:31:00.000Z</published>
    <updated>2026-04-17T12:31:00.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="从Docker-Desktop迁移到Colima记录"><a href="#从Docker-Desktop迁移到Colima记录" class="headerlink" title="从Docker Desktop迁移到Colima记录"></a>从Docker Desktop迁移到Colima记录</h1><p>最近折腾了一把，把本机 Docker Desktop 卸掉，切到了 Colima。</p><p>主要原因很简单：公司合规策略不允许继续使用 Docker Desktop。</p><p>这篇就当个流水账，给未来的自己留个复盘。</p><span id="more"></span><h2 id="1-背景"><a href="#1-背景" class="headerlink" title="1. 背景"></a>1. 背景</h2><ul><li>公司对 Docker Desktop 的使用有合规限制。</li><li>本机需要保留容器开发能力（至少能跑 Redis &#x2F; MariaDB）。</li><li>目标是：<ul><li>不用 Docker Desktop</li><li>用 Colima + Docker CLI</li><li><code>docker compose</code> 可用</li></ul></li></ul><h2 id="2-卸载-Docker-Desktop"><a href="#2-卸载-Docker-Desktop" class="headerlink" title="2. 卸载 Docker Desktop"></a>2. 卸载 Docker Desktop</h2><p>先确认：</p><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><span class="line">brew list | grep -i docker</span><br><span class="line">ps -ef | grep -i docker | grep -v grep</span><br></pre></td></tr></table></figure><p>如果还有残留进程，先停掉再卸载。Homebrew 卸载命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">brew uninstall --cask docker-desktop</span><br></pre></td></tr></table></figure><p>如果卡在系统权限（<code>com.docker.vmnetd</code> 之类），可以手动处理系统残留：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> pkill -f com.docker.vmnetd || <span class="literal">true</span></span><br></pre></td></tr></table></figure><p>最后再次确认：</p><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><span class="line">brew list | grep -i docker || <span class="built_in">echo</span> <span class="string">&quot;已无 docker&quot;</span></span><br><span class="line">ps -ef | grep -i docker | grep -v grep || <span class="built_in">echo</span> <span class="string">&quot;已无 docker 进程&quot;</span></span><br></pre></td></tr></table></figure><h2 id="3-安装-Colima"><a href="#3-安装-Colima" class="headerlink" title="3. 安装 Colima"></a>3. 安装 Colima</h2><p>安装并启动：</p><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><span class="line">brew install colima docker</span><br><span class="line">colima start --cpu 4 --memory 8 --disk 60</span><br></pre></td></tr></table></figure><blockquote><p>说明：资源参数只需要首次（或改配置时）设置，之后日常 <code>colima start</code> 即可。</p></blockquote><p>确认 context：</p><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><span class="line">docker context <span class="built_in">ls</span></span><br><span class="line">docker context use colima</span><br></pre></td></tr></table></figure><p>如果看到当前是 <code>colima *</code>，并且 endpoint 是 <code>~/.colima/default/docker.sock</code>，就对了。</p><h2 id="4-docker-compose-报-unknown-command-的坑"><a href="#4-docker-compose-报-unknown-command-的坑" class="headerlink" title="4. docker compose 报 unknown command 的坑"></a>4. <code>docker compose</code> 报 unknown command 的坑</h2><p>现象：</p><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><span class="line">docker compose version</span><br><span class="line"><span class="comment"># docker: unknown command: docker compose</span></span><br></pre></td></tr></table></figure><p>原因：安装了 <code>docker-compose</code> 插件，但 Docker CLI 没扫描到 Homebrew 插件目录。</p><p>修复：在 <code>~/.docker/config.json</code> 增加：</p><figure class="highlight json"><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><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;cliPluginsExtraDirs&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="string">&quot;/opt/homebrew/lib/docker/cli-plugins&quot;</span></span><br><span class="line">  <span class="punctuation">]</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>验证：</p><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><span class="line">docker compose version</span><br><span class="line"><span class="comment"># Docker Compose version x.x.x</span></span><br></pre></td></tr></table></figure><p>兼容旧命令（可选）：</p><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><span class="line"><span class="comment"># ~/.zshrc</span></span><br><span class="line"><span class="built_in">alias</span> docker-compose=<span class="string">&#x27;docker compose&#x27;</span></span><br></pre></td></tr></table></figure><h2 id="5-防止忘记先启动-Colima"><a href="#5-防止忘记先启动-Colima" class="headerlink" title="5. 防止忘记先启动 Colima"></a>5. 防止忘记先启动 Colima</h2><p>在 <code>~/.zshrc</code> 里加一个轻量保护：</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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="title">docker</span></span>() &#123;</span><br><span class="line">  <span class="keyword">if</span> ! colima status &gt;/dev/null 2&gt;&amp;1; <span class="keyword">then</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;Colima 未启动，先执行: colima start&quot;</span></span><br><span class="line">    <span class="built_in">return</span> 1</span><br><span class="line">  <span class="keyword">fi</span></span><br><span class="line">  <span class="built_in">command</span> docker <span class="string">&quot;<span class="variable">$@</span>&quot;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>这样你直接敲 <code>docker ...</code> 时，如果 Colima 没启动，会给明确提示，不会莫名其妙报 socket 错误。</p><h2 id="6-Docker-Hello-验证启动"><a href="#6-Docker-Hello-验证启动" class="headerlink" title="6. Docker Hello 验证启动"></a>6. Docker Hello 验证启动</h2><p>迁移完成后，先用一个无状态容器做最小验证，确认 Docker CLI 与 Colima 已正常联通。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker run --<span class="built_in">rm</span> hello-world</span><br></pre></td></tr></table></figure><p>如果输出里看到 <code>Hello from Docker!</code>，说明容器运行链路已经正常。</p><p>也可以再补一条查看运行时信息：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker info</span><br></pre></td></tr></table></figure><h2 id="7-小结"><a href="#7-小结" class="headerlink" title="7. 小结"></a>7. 小结</h2><p>这次迁移的关键点其实就三个：</p><ol><li>不要混淆 Docker Desktop socket 和 Colima socket。</li><li><code>docker compose</code> 不可用时，优先检查插件目录是否被 Docker CLI 扫描。</li><li>给 shell 加一个“Colima 未启动提醒”，能省很多排查时间。</li></ol><p>到这里，本机容器环境已经完全不依赖 Docker Desktop 了，日常开发够用。</p>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;从Docker-Desktop迁移到Colima记录&quot;&gt;&lt;a href=&quot;#从Docker-Desktop迁移到Colima记录&quot; class=&quot;headerlink&quot; title=&quot;从Docker Desktop迁移到Colima记录&quot;&gt;&lt;/a&gt;从Docker Desktop迁移到Colima记录&lt;/h1&gt;&lt;p&gt;最近折腾了一把，把本机 Docker Desktop 卸掉，切到了 Colima。&lt;/p&gt;
&lt;p&gt;主要原因很简单：公司合规策略不允许继续使用 Docker Desktop。&lt;/p&gt;
&lt;p&gt;这篇就当个流水账，给未来的自己留个复盘。&lt;/p&gt;</summary>
    
    
    
    
    <category term="Docker" scheme="https://sowevo.com/tags/Docker/"/>
    
    <category term="macOS" scheme="https://sowevo.com/tags/macOS/"/>
    
    <category term="Colima" scheme="https://sowevo.com/tags/Colima/"/>
    
  </entry>
  
  <entry>
    <title>Mackup 使用指南</title>
    <link href="https://sowevo.com/Mackup%E4%BD%BF%E7%94%A8%E8%AE%B0%E5%BD%95/"/>
    <id>https://sowevo.com/Mackup%E4%BD%BF%E7%94%A8%E8%AE%B0%E5%BD%95/</id>
    <published>2025-11-27T00:22:01.000Z</published>
    <updated>2025-11-27T00:55:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>Mackup 是一个用于备份和同步应用配置（dotfiles）的工具，支持 iCloud、Dropbox 等云存储。<br>自 macOS Sonoma 起，Mackup 的旧的 link 教程很多都不再适用，因此非常有必要重新梳理一套“安全且可用”的最佳实践。</p><p>本文基于最新 macOS 行为，整理了一套 <strong>仅同步 CLI 工具（如 Codex）的最佳方案</strong>，同时避免同步 GUI 应用偏好造成的问题。</p><h2 id="Mackup-是什么？"><a href="#Mackup-是什么？" class="headerlink" title="Mackup 是什么？"></a>Mackup 是什么？</h2><p>Mackup 可以将应用配置文件同步到云盘，在多台电脑之间保持统一环境。<br>尤其适合 CLI 工具，例如：</p><ul><li>git</li><li>zsh</li><li>ssh</li><li>Codex（本文示例）<span id="more"></span></li></ul><h2 id="copy-模式-vs-link-模式"><a href="#copy-模式-vs-link-模式" class="headerlink" title="copy 模式 vs link 模式"></a>copy 模式 vs link 模式</h2><table><thead><tr><th>模式</th><th>行为</th><th>实时同步</th><th>安全性</th></tr></thead><tbody><tr><td><strong>copy 模式</strong></td><td>复制文件到云盘，再从云盘恢复</td><td>否</td><td>安全</td></tr><tr><td><strong>link 模式</strong></td><td>文件替换为 symlink 指向云盘</td><td>是</td><td>对GUI应用可能有风险</td></tr></tbody></table><h3 id="GUI应用可能有风险"><a href="#GUI应用可能有风险" class="headerlink" title="GUI应用可能有风险"></a>GUI应用可能有风险</h3><p>macOS Sonoma 起，系统偏好设置（<code>~/Library/Preferences/*.plist</code>）必须写入本地真实文件，不能放 symlink 后面。<br>一旦 GUI 应用的 plist 用了 symlink：</p><ul><li><p>偏好保存失败</p></li><li><p>自动恢复默认</p></li><li><p>偏好文件损坏</p></li><li><p>应用可能无法启动</p></li></ul><h3 id="终端应用没问题"><a href="#终端应用没问题" class="headerlink" title="终端应用没问题"></a>终端应用没问题</h3><p>git,zsh,ssh等终端应用没有问题</p><p>这些应用使用的都是普通 JSON &#x2F; TOML 文件：</p><figure class="highlight arcade"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">~<span class="regexp">/.codex/</span>auth.json</span><br><span class="line">~<span class="regexp">/.codex/</span>config.toml</span><br></pre></td></tr></table></figure><p>不属于 plist，不受系统限制，可放心使用 link 模式。</p><h2 id="配置-Mackup-的例子"><a href="#配置-Mackup-的例子" class="headerlink" title="配置 Mackup 的例子"></a>配置 Mackup 的例子</h2><p>下面先给出最小化、安全的 Codex 配置</p><h3 id="mackup配置"><a href="#mackup配置" class="headerlink" title="mackup配置"></a>mackup配置</h3><p>编辑：<code>~/.mackup.cfg</code></p><figure class="highlight ini"><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><span class="line"><span class="section">[storage]</span></span><br><span class="line"><span class="comment"># 使用的存储引擎</span></span><br><span class="line"><span class="attr">engine</span> = icloud</span><br><span class="line"><span class="comment"># 存储目录</span></span><br><span class="line"><span class="attr">directory</span> = Mackup</span><br><span class="line"></span><br><span class="line"><span class="section">[applications_to_sync]</span></span><br><span class="line"><span class="comment"># 你要同步的应用</span></span><br><span class="line">codex</span><br><span class="line"></span><br><span class="line"><span class="section">[applications_to_ignore]</span></span><br><span class="line"><span class="comment"># 可选：排除你不想同步的应用</span></span><br><span class="line"><span class="comment"># ssh</span></span><br><span class="line"><span class="comment"># git</span></span><br><span class="line"><span class="comment"># vscode</span></span><br></pre></td></tr></table></figure><p>这样能确保：</p><ul><li>Mackup 只管 Codex</li><li>不会误操作任何 GUI 应用</li><li>不会触发 Sonoma 的偏好限制</li></ul><h3 id="自定义同步文件配置"><a href="#自定义同步文件配置" class="headerlink" title="自定义同步文件配置"></a>自定义同步文件配置</h3><p>如果你想让 Mackup 管理更多 Codex 文件（如脚本、文档），可在<code>~/.mackup</code>下面新建文件<code>codex.cfg</code>，内容如下：</p><figure class="highlight ini"><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><span class="line"><span class="section">[application]</span></span><br><span class="line"><span class="attr">name</span> = Codex</span><br><span class="line"></span><br><span class="line"><span class="section">[configuration_files]</span></span><br><span class="line">.codex/auth.json</span><br><span class="line">.codex/config.toml</span><br><span class="line">.codex/notify_on_finish.sh</span><br><span class="line">.codex/AGENTS.md</span><br></pre></td></tr></table></figure><p>⚠️ 非常重要：</p><blockquote><p><code>~/.mackup/codex.cfg</code> 会<strong>覆盖</strong>内置规则，不是追加。<br>所有要同步的文件必须自己写全。</p></blockquote><p>这样你就可以自由扩展 Codex 的同步文件范围。</p><h2 id="使用流程"><a href="#使用流程" class="headerlink" title="使用流程"></a>使用流程</h2><h3 id="主力机：首次安装-link-模式"><a href="#主力机：首次安装-link-模式" class="headerlink" title="主力机：首次安装 link 模式"></a>主力机：首次安装 link 模式</h3><ol><li>安装 Mackup</li></ol><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">brew install mackup</span><br></pre></td></tr></table></figure><ol start="2"><li><p>编写配置文件：就上面例子中的配置文件</p></li><li><p>在主力机上初始化：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mackup link install</span><br></pre></td></tr></table></figure></li></ol><p>它会进行如下操作</p><blockquote><ul><li>将 Codex 配置复制到云盘</li><li>删除本地原始文件</li><li>生成 symlink 指向云端文件</li></ul></blockquote><ol start="4"><li>最后检查：<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ls -l ~/.codex</span><br></pre></td></tr></table></figure></li></ol><p>应看到：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">auth.json -&gt; ~/Library/.../Mackup/.codex/auth.json</span><br><span class="line">config.toml -&gt; ~/Library/.../Mackup/.codex/config.toml</span><br></pre></td></tr></table></figure><p>这说明 link 模式已成功启用。</p><h3 id="新电脑：如何恢复"><a href="#新电脑：如何恢复" class="headerlink" title="新电脑：如何恢复"></a>新电脑：如何恢复</h3><ol><li><p>安装 Mackup</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">brew install mackup</span><br></pre></td></tr></table></figure></li><li><p>等待 iCloud&#x2F;Dropbox 同步完整的 Codex 备份</p></li><li><p>编写配置文件：还是上面例子中的配置文件</p><blockquote><p>⚠️Mackup不会同步自己的配置文件<br>需要自己处理配置文件的同步</p></blockquote></li><li><p>执行恢复</p></li></ol>  <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mackup link</span><br></pre></td></tr></table></figure><ol start="5"><li>检查</li></ol>  <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ls -l ~/.codex</span><br></pre></td></tr></table></figure><p>应看到：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">auth.json -&gt; ~/Library/.../Mackup/.codex/auth.json</span><br><span class="line">config.toml -&gt; ~/Library/.../Mackup/.codex/config.toml</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;p&gt;Mackup 是一个用于备份和同步应用配置（dotfiles）的工具，支持 iCloud、Dropbox 等云存储。&lt;br&gt;自 macOS Sonoma 起，Mackup 的旧的 link 教程很多都不再适用，因此非常有必要重新梳理一套“安全且可用”的最佳实践。&lt;/p&gt;
&lt;p&gt;本文基于最新 macOS 行为，整理了一套 &lt;strong&gt;仅同步 CLI 工具（如 Codex）的最佳方案&lt;/strong&gt;，同时避免同步 GUI 应用偏好造成的问题。&lt;/p&gt;
&lt;h2 id=&quot;Mackup-是什么？&quot;&gt;&lt;a href=&quot;#Mackup-是什么？&quot; class=&quot;headerlink&quot; title=&quot;Mackup 是什么？&quot;&gt;&lt;/a&gt;Mackup 是什么？&lt;/h2&gt;&lt;p&gt;Mackup 可以将应用配置文件同步到云盘，在多台电脑之间保持统一环境。&lt;br&gt;尤其适合 CLI 工具，例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;git&lt;/li&gt;
&lt;li&gt;zsh&lt;/li&gt;
&lt;li&gt;ssh&lt;/li&gt;
&lt;li&gt;Codex（本文示例）</summary>
    
    
    
    
    <category term="Mackup" scheme="https://sowevo.com/tags/Mackup/"/>
    
    <category term="macOS" scheme="https://sowevo.com/tags/macOS/"/>
    
    <category term="Dotfiles" scheme="https://sowevo.com/tags/Dotfiles/"/>
    
  </entry>
  
  <entry>
    <title>禁用VIM的鼠标模式</title>
    <link href="https://sowevo.com/%E7%A6%81%E7%94%A8VIM%E7%9A%84%E9%BC%A0%E6%A0%87%E6%A8%A1%E5%BC%8F/"/>
    <id>https://sowevo.com/%E7%A6%81%E7%94%A8VIM%E7%9A%84%E9%BC%A0%E6%A0%87%E6%A8%A1%E5%BC%8F/</id>
    <published>2025-09-30T22:58:25.000Z</published>
    <updated>2025-09-30T22:58:25.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="禁用VIM的鼠标模式"><a href="#禁用VIM的鼠标模式" class="headerlink" title="禁用VIM的鼠标模式"></a>禁用VIM的鼠标模式</h1><p>VIM 是一个功能强大的文本编辑器，但是在某些情况下，鼠标模式可能会导致问题。例如，当你在 VIM 中编辑&#x2F;选择代码时，鼠标点击可能会导致光标跳转到错误的位置。</p><p>为了解决这个问题，你可以禁用 VIM 的鼠标模式。以下是详细步骤：</p><ol><li>编辑 VIM 配置文件<br>首先，需要编辑你的 VIM 配置文件 <code>~/.vimrc</code>。</li><li>添加配置<br>在 <code>~/.vimrc</code> 文件中添加以下配置：<figure class="highlight vim"><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><span class="line"><span class="comment">&quot; 加载系统默认配置,确保基础功能正常</span></span><br><span class="line"><span class="keyword">source</span> $VIMRUNTIME/defaults.<span class="keyword">vim</span></span><br><span class="line"><span class="comment">&quot; 禁用鼠标</span></span><br><span class="line"><span class="keyword">set</span> mouse=</span><br></pre></td></tr></table></figure>这将禁用 VIM 的鼠标模式。</li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;禁用VIM的鼠标模式&quot;&gt;&lt;a href=&quot;#禁用VIM的鼠标模式&quot; class=&quot;headerlink&quot; title=&quot;禁用VIM的鼠标模式&quot;&gt;&lt;/a&gt;禁用VIM的鼠标模式&lt;/h1&gt;&lt;p&gt;VIM 是一个功能强大的文本编辑器，但是在某些情况下，鼠标模式可能会导致问题</summary>
      
    
    
    
    
    <category term="linux" scheme="https://sowevo.com/tags/linux/"/>
    
    <category term="vim" scheme="https://sowevo.com/tags/vim/"/>
    
  </entry>
  
  <entry>
    <title>代理无法提交git</title>
    <link href="https://sowevo.com/%E4%BB%A3%E7%90%86%E6%97%A0%E6%B3%95%E6%8F%90%E4%BA%A4git/"/>
    <id>https://sowevo.com/%E4%BB%A3%E7%90%86%E6%97%A0%E6%B3%95%E6%8F%90%E4%BA%A4git/</id>
    <published>2024-10-29T02:04:25.000Z</published>
    <updated>2024-10-29T02:04:25.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="通过-HTTPS-端口使用-SSH"><a href="#通过-HTTPS-端口使用-SSH" class="headerlink" title="通过 HTTPS 端口使用 SSH"></a>通过 HTTPS 端口使用 SSH</h1><p>在某些网络环境中（奇怪的代理工具），22 端口可能被屏蔽，导致无法使用 SSH 进行 Git 推送。</p><p>这时，我们可以利用 SSH over HTTPS 的方法，通过 443 端口实现推送。以下是详细步骤：</p><ol><li><p>编辑 SSH 配置文件<br>首先，需要编辑你的 SSH 配置文件 <code>~/.ssh/config</code>。<br>将以下配置加到该文件中：</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></pre></td><td class="code"><pre><span class="line">Host github.com</span><br><span class="line">Hostname ssh.github.com</span><br><span class="line">     Port 443</span><br><span class="line">     User git</span><br></pre></td></tr></table></figure><p>也可以使用以下命令一键添加</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> -e <span class="string">&quot;Host github.com\n\tHostName ssh.github.com\n\tPort 443\n\tUser git&quot;</span> &gt;&gt; ~/.ssh/config</span><br></pre></td></tr></table></figure><p>这条命令将指定 GitHub 的主机名为 ssh.github.com， 并将端口设置为 443，用户为 git。</p></li><li><p>确保配置生效<br>配置完成后，可以通过以下命令验证设置是否生效：</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><span class="line">$ ssh -T git@github.com</span><br><span class="line"><span class="comment"># Hi USERNAME! You&#x27;ve successfully authenticated, but GitHub does not</span></span><br><span class="line"><span class="comment"># provide shell access.</span></span><br></pre></td></tr></table></figure></li><li><p>使用 Git 推送<br>现在，你可以正常使用 Git 命令进行推送。例如：</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><span class="line">git add .</span><br><span class="line">git commit -m <span class="string">&quot;Your commit message&quot;</span></span><br><span class="line">git push origin main</span><br></pre></td></tr></table></figure><p>由于你已经将 SSH 流量封装在 HTTPS 中，推送操作应该能够顺利完成。</p></li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;通过-HTTPS-端口使用-SSH&quot;&gt;&lt;a href=&quot;#通过-HTTPS-端口使用-SSH&quot; class=&quot;headerlink&quot; title=&quot;通过 HTTPS 端口使用 SSH&quot;&gt;&lt;/a&gt;通过 HTTPS 端口使用 SSH&lt;/h1&gt;&lt;p&gt;在某些网络环境中（奇</summary>
      
    
    
    
    
    <category term="linux" scheme="https://sowevo.com/tags/linux/"/>
    
    <category term="git" scheme="https://sowevo.com/tags/git/"/>
    
  </entry>
  
  <entry>
    <title>命令行图片处理</title>
    <link href="https://sowevo.com/%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%9B%BE%E7%89%87%E5%A4%84%E7%90%86/"/>
    <id>https://sowevo.com/%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%9B%BE%E7%89%87%E5%A4%84%E7%90%86/</id>
    <published>2023-11-23T13:02:46.000Z</published>
    <updated>2023-11-23T13:02:46.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="ImageMagick"><a href="#ImageMagick" class="headerlink" title="ImageMagick"></a>ImageMagick</h2><p>ImageMagick是一个开源的图像处理工具集，能够在命令行下执行多种图像处理操作。以下是一些常见的ImageMagick用法，包括图像格式转换、压缩、裁剪等</p><h3 id="安装ImageMagick"><a href="#安装ImageMagick" class="headerlink" title="安装ImageMagick"></a>安装ImageMagick</h3><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">Ubuntu</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash"><span class="built_in">sudo</span> apt-get update</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash"><span class="built_in">sudo</span> apt-get install imagemagick</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">CentOS/RHEL</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash"><span class="built_in">sudo</span> yum install ImageMagick</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">macOS</span></span><br><span class="line">brew install imagemagick</span><br></pre></td></tr></table></figure><h3 id="用法"><a href="#用法" class="headerlink" title="用法"></a>用法</h3><ul><li><p>转换为WebP</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">convert input.jpg output.webp</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">GIF动画需要增加-coalesce才能转换</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">convert -coalesce input.gif output.webp</span></span><br></pre></td></tr></table></figure></li><li><p>有损转换为WebP  </p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">压缩率80</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">convert -quality 80 input.jpg output.webp</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">convert -quality 80 -coalesce input.gif output.webp</span></span><br></pre></td></tr></table></figure></li><li><p>有损转换为JPG</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">压缩率80</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">convert -quality 80 input.png output.jpg</span></span><br></pre></td></tr></table></figure></li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;ImageMagick&quot;&gt;&lt;a href=&quot;#ImageMagick&quot; class=&quot;headerlink&quot; title=&quot;ImageMagick&quot;&gt;&lt;/a&gt;ImageMagick&lt;/h2&gt;&lt;p&gt;ImageMagick是一个开源的图像处理工具集，能够在命令行下执行</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>小螺</title>
    <link href="https://sowevo.com/%E5%B0%8F%E8%9E%BA/"/>
    <id>https://sowevo.com/%E5%B0%8F%E8%9E%BA/</id>
    <published>2023-11-23T02:01:10.000Z</published>
    <updated>2023-11-23T02:01:10.000Z</updated>
    
    <content type="html"><![CDATA[<p><img data-src="https://up.sowevo.com/2023/1700676670096.jpeg" alt="IMG_6520"></p><p>粗糙的小公猫,性格温和,随便撸</p><p>吃的特别多,是我家的 “没头脑”</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img data-src=&quot;https://up.sowevo.com/2023/1700676670096.jpeg&quot; alt=&quot;IMG_6520&quot;&gt;&lt;/p&gt;
&lt;p&gt;粗糙的小公猫,性格温和,随便撸&lt;/p&gt;
&lt;p&gt;吃的特别多,是我家的 “没头脑”&lt;/p&gt;
</summary>
      
    
    
    
    
    <category term="猫" scheme="https://sowevo.com/tags/%E7%8C%AB/"/>
    
  </entry>
  
  <entry>
    <title>小蜗</title>
    <link href="https://sowevo.com/%E5%B0%8F%E8%9C%97/"/>
    <id>https://sowevo.com/%E5%B0%8F%E8%9C%97/</id>
    <published>2023-11-22T23:09:47.000Z</published>
    <updated>2023-11-22T23:09:47.000Z</updated>
    
    <content type="html"><![CDATA[<p><img data-src="https://up.sowevo.com/2023/1700675376837.jpeg" alt="1700675376837"></p><p>漂亮的小母猫,性格高冷,不给撸</p><p>挑食又软便,是我家的 “不高兴”</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img data-src=&quot;https://up.sowevo.com/2023/1700675376837.jpeg&quot; alt=&quot;1700675376837&quot;&gt;&lt;/p&gt;
&lt;p&gt;漂亮的小母猫,性格高冷,不给撸&lt;/p&gt;
&lt;p&gt;挑食又软便,是我家的 “不高兴”&lt;/p&gt;
</summary>
      
    
    
    
    
    <category term="猫" scheme="https://sowevo.com/tags/%E7%8C%AB/"/>
    
  </entry>
  
  <entry>
    <title>docker2375端口开启TLS和CA认证</title>
    <link href="https://sowevo.com/docker2375%E7%AB%AF%E5%8F%A3%E5%BC%80%E5%90%AFTLS%E5%92%8CCA%E8%AE%A4%E8%AF%81/"/>
    <id>https://sowevo.com/docker2375%E7%AB%AF%E5%8F%A3%E5%BC%80%E5%90%AFTLS%E5%92%8CCA%E8%AE%A4%E8%AF%81/</id>
    <published>2022-12-28T12:44:43.000Z</published>
    <updated>2022-12-28T12:44:43.000Z</updated>
    
    <content type="html"><![CDATA[<ul><li><p>进入工作目录</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">证书文件将生成到此文件夹中</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash"><span class="built_in">cd</span> /etc/docker/cert</span></span><br></pre></td></tr></table></figure></li><li><p>运行生成脚本</p><figure class="highlight shell"><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><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">!/bin/bash</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">一键生成TLS和CA证书</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">This script should be run via curl:</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">  sh -c <span class="string">&quot;<span class="subst">$(curl -fsSL https://raw.githubusercontent.com/Sowevo/my_script/main/shell/auto-generate-docker-tls-ca.sh)</span>&quot;</span></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">  sh -c <span class="string">&quot;<span class="subst">$(curl -fsSL https://ghproxy.com/https://raw.githubusercontent.com/Sowevo/my_script/main/shell/auto-generate-docker-tls-ca.sh)</span>&quot;</span></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">or via wget:</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">  sh -c <span class="string">&quot;<span class="subst">$(wget -qO- https://raw.githubusercontent.com/Sowevo/my_script/main/shell/auto-generate-docker-tls-ca.sh)</span>&quot;</span></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">  sh -c <span class="string">&quot;<span class="subst">$(wget -qO- https://ghproxy.com/https://raw.githubusercontent.com/Sowevo/my_script/main/shell/auto-generate-docker-tls-ca.sh)</span>&quot;</span></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">or via fetch:</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">  sh -c <span class="string">&quot;<span class="subst">$(fetch -o - https://raw.githubusercontent.com/Sowevo/my_script/main/shell/auto-generate-docker-tls-ca.sh)</span>&quot;</span></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">  sh -c <span class="string">&quot;<span class="subst">$(fetch -o - https://ghproxy.com/https://raw.githubusercontent.com/Sowevo/my_script/main/shell/auto-generate-docker-tls-ca.sh)</span>&quot;</span></span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">需要自己更改下以下配置</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">服务器主机名</span></span><br><span class="line">SERVER=&quot;10.0.8.11&quot;</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">密码</span></span><br><span class="line">PASSWORD=&quot;Super#Geostar,5&quot;</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">国家</span></span><br><span class="line">COUNTRY=&quot;CN&quot;</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">/etc/pki/tls/openssl.cnf，即 openssl 的配置文件路径并不一定适合所有系统</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">可以使用 find 命令找出自己系统中 openssl.cnf 的位置：</span></span><br><span class="line">OPENSSL_CONF=&quot;/etc/pki/tls/openssl.cnf&quot;</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">省份</span></span><br><span class="line">STATE=&quot;北京市&quot;</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">城市</span></span><br><span class="line">CITY=&quot;北京市&quot;</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">机构名称</span></span><br><span class="line">ORGANIZATION=&quot;大白兔技术股份有限公司&quot;</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">机构单位</span></span><br><span class="line">ORGANIZATIONAL_UNIT=&quot;大白兔技术股份有限公司&quot;</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">邮箱</span></span><br><span class="line">EMAIL=&quot;x@sowevo.com&quot;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">生成CA密钥</span></span><br><span class="line">openssl genrsa -aes256 -passout pass:$PASSWORD  -out ca-key.pem 4096</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">生成CA证书</span></span><br><span class="line">openssl req -utf8 -new -x509 -passin &quot;pass:$PASSWORD&quot; -days 3650 -key ca-key.pem -sha256 -out ca-cert.pem -subj &quot;/C=$COUNTRY/ST=$STATE/L=$CITY/O=$ORGANIZATION/OU=$ORGANIZATIONAL_UNIT/CN=$SERVER/emailAddress=$EMAIL&quot;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">生成服务端密钥</span></span><br><span class="line">openssl genrsa -out server-key.pem 4096</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">生成服务端证书签名的请求文件</span></span><br><span class="line">openssl req -subj &quot;/CN=$SERVER&quot; -new -key server-key.pem -out server-req.csr -reqexts SAN -config &lt;(cat $OPENSSL_CONF &lt;(printf &quot;\n[SAN]\nsubjectAltName=IP:$SERVER&quot;))</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">生成服务端证书</span></span><br><span class="line">openssl x509 -req -days 3650 -in server-req.csr -CA ca-cert.pem -CAkey ca-key.pem -passin &quot;pass:$PASSWORD&quot; -CAcreateserial -out server-cert.pem -extensions SAN -extfile &lt;(cat $OPENSSL_CONF &lt;(printf &quot;[SAN]\nsubjectAltName=IP:$SERVER&quot;))</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">生成客户端密钥</span></span><br><span class="line">openssl genrsa -out client-key.pem 4096</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">生成客户端证书签名的请求文件</span></span><br><span class="line">openssl req -subj &#x27;/CN=client&#x27; -new -key client-key.pem -out client-req.csr</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">生成客户端证书</span></span><br><span class="line">sh -c &#x27;echo &quot;extendedKeyUsage=clientAuth&quot; &gt;&gt; extfile.cnf&#x27;</span><br><span class="line">openssl x509 -req -days 3650 -in client-req.csr -CA ca-cert.pem -CAkey ca-key.pem  -passin &quot;pass:$PASSWORD&quot; -CAcreateserial -out client-cert.pem -extfile extfile.cnf</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">更改密钥权限</span></span><br><span class="line">chmod 0400 ca-key.pem server-key.pem client-key.pem</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">更改证书权限</span></span><br><span class="line">chmod 0444 ca-cert.pem server-cert.pem client-cert.pem</span><br></pre></td></tr></table></figure></li><li><p>运行脚本后,检查下文件是否存在</p><ul><li><code>ca-cert.pem</code></li><li><code>server-cert.pem</code></li><li><code>server-key.pem</code></li></ul></li><li><p>修改docker配置文件<code>/usr/lib/systemd/system/docker.service</code></p><p>在ExecStart属性后追加</p><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">--tlsverify --tlscacert=<span class="regexp">/etc/</span>docker<span class="regexp">/cert/</span>ca-cert.pem --tlscert=<span class="regexp">/etc/</span>docker<span class="regexp">/cert/</span>server-cert.pem --tlskey=<span class="regexp">/etc/</span>docker<span class="regexp">/cert/</span>server-key.pem -H tcp:<span class="regexp">//</span><span class="number">0.0</span>.<span class="number">0.0</span>:<span class="number">2376</span> -H unix:<span class="regexp">//</span>var<span class="regexp">/run/</span>docker.sock </span><br></pre></td></tr></table></figure></li><li><p>重启docker</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">systemctl daemon-reload</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">systemctl restart docker</span></span><br></pre></td></tr></table></figure></li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;ul&gt;
&lt;li&gt;&lt;p&gt;进入工作目录&lt;/p&gt;
&lt;figure class=&quot;highlight shell&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;</summary>
      
    
    
    
    
    <category term="Linux" scheme="https://sowevo.com/tags/Linux/"/>
    
    <category term="Docker" scheme="https://sowevo.com/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>威联通申请证书</title>
    <link href="https://sowevo.com/%E5%A8%81%E8%81%94%E9%80%9A%E7%94%B3%E8%AF%B7%E8%AF%81%E4%B9%A6/"/>
    <id>https://sowevo.com/%E5%A8%81%E8%81%94%E9%80%9A%E7%94%B3%E8%AF%B7%E8%AF%81%E4%B9%A6/</id>
    <published>2022-08-10T10:50:02.000Z</published>
    <updated>2024-01-25T18:30:49.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="威联通申请证书"><a href="#威联通申请证书" class="headerlink" title="威联通申请证书"></a>威联通申请证书</h1><ul><li><p>首先通过<a href="https://qnapclub.eu/en/howto/1">qnapclub</a>安装git命令</p></li><li><p><code>ssh</code>连接威联通</p></li><li><p><code>sudo -i</code>切换到admin(root)用户</p></li><li><p>写一个重载脚本<code>/share/Public/Script/acme/reloadcmd.sh</code>,用于证书申请后重启服务</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">建文件夹</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash"><span class="built_in">mkdir</span> -p /share/Public/Script/acme/</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">写入文件</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash"><span class="built_in">cat</span> &gt; /share/Public/Script/acme/reloadcmd.sh &lt;&lt;<span class="string">EOF</span></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash"><span class="string">!/bin/sh</span></span></span><br><span class="line">/etc/init.d/Qthttpd.sh stop</span><br><span class="line">/etc/init.d/stunnel.sh stop</span><br><span class="line">cat /etc/stunnel/backup.cert \</span><br><span class="line">/etc/stunnel/backup.key &gt; \</span><br><span class="line">/etc/stunnel/stunnel.pem</span><br><span class="line">/etc/init.d/stunnel.sh start</span><br><span class="line">/etc/init.d/Qthttpd.sh start</span><br><span class="line">EOF</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"><span class="string">授权</span></span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash"><span class="string">chmod -R 777 /share/Public/Script/acme/reloadcmd.sh</span></span></span><br></pre></td></tr></table></figure></li></ul><span id="more"></span><ul><li><p>安装**<a href="https://github.com/acmesh-official/acme.sh">ACME</a>**</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">在用户目录下操作</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash"><span class="built_in">cd</span> ~</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">克隆</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">git <span class="built_in">clone</span> https://mirror.ghproxy.com/https://github.com/acmesh-official/acme.sh.git</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git <span class="built_in">clone</span> https://github.com/acmesh-official/acme.sh.git</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">安装</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash"><span class="built_in">cd</span> ./acme.sh &amp;&amp; ./acme.sh --install</span></span><br></pre></td></tr></table></figure></li><li><p>执行申请</p><p>按顺序执行以下脚本 </p><ul><li><p>切换到admin(root)用户</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash"><span class="built_in">sudo</span> -i</span></span><br></pre></td></tr></table></figure></li><li><p>进入acme目录</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash"><span class="built_in">cd</span> ~/.acme.sh</span></span><br></pre></td></tr></table></figure></li><li><p>看情况是不是要升级一下</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">./acme.sh --upgrade --force</span></span><br></pre></td></tr></table></figure></li><li><p>证书颁发机构改为letsencrypt</p><ul><li>目前新版本的acme.sh默认证书分发机构为ZeroSSL,有点不好用<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">./acme.sh --set-default-ca --server letsencrypt</span></span><br></pre></td></tr></table></figure></li></ul></li><li><p>写入参数<br>按照自己的情况填写下面的参数</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_">$ </span><span class="language-bash"><span class="built_in">export</span> CF_Key=<span class="string">&quot;example_key&quot;</span></span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash"><span class="built_in">export</span> CF_Email=<span class="string">&quot;example@example.com&quot;</span></span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash"><span class="built_in">export</span> CF_Domain=<span class="string">&quot;*.example.com&quot;</span></span></span><br></pre></td></tr></table></figure></li><li><p>注册账号</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">./acme.sh --register-account -m <span class="variable">$CF_Email</span> --force</span> </span><br></pre></td></tr></table></figure></li><li><p>申请证书</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">./acme.sh --issue --dns dns_cf -d <span class="string">&quot;<span class="variable">$CF_Domain</span>&quot;</span>  --force</span> </span><br></pre></td></tr></table></figure></li><li><p>安装证书(需要调用之前的重载脚本)</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">./acme.sh --install-cert -d <span class="string">&quot;<span class="variable">$CF_Domain</span>&quot;</span> \</span></span><br><span class="line"><span class="language-bash">--cert-file /etc/stunnel/backup.cert \</span></span><br><span class="line"><span class="language-bash">--key-file /etc/stunnel/backup.key \</span></span><br><span class="line"><span class="language-bash">--reloadcmd <span class="string">&quot;/share/Public/Script/acme/reloadcmd.sh&quot;</span> \</span></span><br><span class="line"><span class="language-bash">--<span class="built_in">log</span> /share/Public/Script/acme/acme.sh.log \</span></span><br><span class="line"><span class="language-bash">--force</span> </span><br></pre></td></tr></table></figure></li></ul></li></ul>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;威联通申请证书&quot;&gt;&lt;a href=&quot;#威联通申请证书&quot; class=&quot;headerlink&quot; title=&quot;威联通申请证书&quot;&gt;&lt;/a&gt;威联通申请证书&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;首先通过&lt;a href=&quot;https://qnapclub.eu/en/howto/1&quot;&gt;qnapclub&lt;/a&gt;安装git命令&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;ssh&lt;/code&gt;连接威联通&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;sudo -i&lt;/code&gt;切换到admin(root)用户&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;写一个重载脚本&lt;code&gt;/share/Public/Script/acme/reloadcmd.sh&lt;/code&gt;,用于证书申请后重启服务&lt;/p&gt;
&lt;figure class=&quot;highlight shell&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;17&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;# &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;建文件夹&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;&lt;span class=&quot;built_in&quot;&gt;mkdir&lt;/span&gt; -p /share/Public/Script/acme/&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;# &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;写入文件&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;&lt;span class=&quot;built_in&quot;&gt;cat&lt;/span&gt; &amp;gt; /share/Public/Script/acme/reloadcmd.sh &amp;lt;&amp;lt;&lt;span class=&quot;string&quot;&gt;EOF&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;&lt;span class=&quot;string&quot;&gt;!/bin/sh&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;/etc/init.d/Qthttpd.sh stop&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;/etc/init.d/stunnel.sh stop&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;cat /etc/stunnel/backup.cert &#92;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;/etc/stunnel/backup.key &amp;gt; &#92;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;/etc/stunnel/stunnel.pem&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;/etc/init.d/stunnel.sh start&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;/etc/init.d/Qthttpd.sh start&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;EOF&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;# &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;&lt;span class=&quot;string&quot;&gt;授权&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;&lt;span class=&quot;string&quot;&gt;chmod -R 777 /share/Public/Script/acme/reloadcmd.sh&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;/li&gt;
&lt;/ul&gt;</summary>
    
    
    
    
    <category term="linux" scheme="https://sowevo.com/tags/linux/"/>
    
    <category term="威联通" scheme="https://sowevo.com/tags/%E5%A8%81%E8%81%94%E9%80%9A/"/>
    
    <category term="证书" scheme="https://sowevo.com/tags/%E8%AF%81%E4%B9%A6/"/>
    
  </entry>
  
  <entry>
    <title>Git多用户配置</title>
    <link href="https://sowevo.com/Git%E5%A4%9A%E7%94%A8%E6%88%B7%E9%85%8D%E7%BD%AE/"/>
    <id>https://sowevo.com/Git%E5%A4%9A%E7%94%A8%E6%88%B7%E9%85%8D%E7%BD%AE/</id>
    <published>2021-05-08T22:36:41.000Z</published>
    <updated>2022-08-10T11:18:00.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Git多用户配置"><a href="#Git多用户配置" class="headerlink" title="Git多用户配置"></a>Git多用户配置</h1><h2 id="问题"><a href="#问题" class="headerlink" title="问题"></a>问题</h2><p>在工作与生活中,我们难免会遇到同时使用多个Git账号的情况</p><ul><li><p>私人的项目在Github上托管,使用的user.name配置是Sowevo,使用的user.email是<a href="mailto:&#117;&#x73;&#101;&#114;&#64;&#x73;&#x6f;&#x77;&#x65;&#118;&#x6f;&#x2e;&#99;&#111;&#109;">&#117;&#x73;&#101;&#114;&#64;&#x73;&#x6f;&#x77;&#x65;&#118;&#x6f;&#x2e;&#99;&#111;&#109;</a></p></li><li><p>公司的项目在Gitlab上托管,使用的user.name配置是lisi,使用的user.email是<a href="mailto:&#108;&#x69;&#115;&#105;&#x40;&#103;&#105;&#116;&#108;&#97;&#x62;&#x2e;&#x63;&#x6f;&#109;">&#108;&#x69;&#115;&#105;&#x40;&#103;&#105;&#116;&#108;&#97;&#x62;&#x2e;&#x63;&#x6f;&#109;</a></p></li></ul><p>这时就会遇到这样的问题,提交到Gitlab的代码署名确是<Sowevo><a href="mailto:&#x75;&#x73;&#101;&#x72;&#x40;&#x73;&#111;&#x77;&#101;&#x76;&#x6f;&#x2e;&#99;&#111;&#x6d;">&#x75;&#x73;&#101;&#x72;&#x40;&#x73;&#111;&#x77;&#101;&#x76;&#x6f;&#x2e;&#99;&#111;&#x6d;</a>,经常用混</p><h2 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h2><h3 id="按工程配置"><a href="#按工程配置" class="headerlink" title="按工程配置"></a>按工程配置</h3><p>git的配置可以放在三个地方：</p><ul><li><p><code>/etc/gitconfig</code> 系统配置,对所有用户有效,一般不用</p></li><li><p><code>~/.gitconfig</code> 用户配置,仅对当前用户生有效</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">全局配置</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git config --global user.name <span class="string">&quot;Sowevo&quot;</span></span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git config --global user.email <span class="string">&quot;user@sowevo.com&quot;</span></span></span><br></pre></td></tr></table></figure></li><li><p><code>projectPath/.git/config</code> 项目配置，仅对当前项目生效</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">项目配置</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git config user.name <span class="string">&quot;lisi&quot;</span></span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git config user.email <span class="string">&quot;lisi@gitlab.com&quot;</span></span></span><br></pre></td></tr></table></figure></li></ul><p>三种配置的优先级为 <code>项目配置&gt;用户配置&gt;系统配置</code></p><p>此时可以利用项目配置优先的规则,对公司项目单独设置user.name与user.email,但是项目如果比较多的话,每一个都要设置,比较繁琐</p><p>可以使用下一种方式配置</p><span id="more"></span><h3 id="按目录配置"><a href="#按目录配置" class="headerlink" title="按目录配置"></a>按目录配置</h3><p>Git的2.13.0之后的版本包含了一个新的功能,<code>includeIf</code>配置可以通过路径匹配不同的配置文件</p><p>以下操作以macOS为例</p><ul><li><p>新建或编辑<code>~/.gitconfig</code>,确保其中存在以下内容</p><figure class="highlight ini"><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><span class="line"><span class="section">[user]</span></span><br><span class="line">    <span class="attr">name</span> = sowevo</span><br><span class="line">    <span class="attr">email</span> = user@sowevo.com</span><br><span class="line"><span class="section">[includeIf &quot;gitdir:~/git/gitlab/&quot;]</span></span><br><span class="line">    <span class="attr">path</span> = .gitconfig-work</span><br></pre></td></tr></table></figure></li><li><p>新建<code>~/.gitconfig-work</code>文件</p><figure class="highlight ini"><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><span class="line"><span class="section">[user]</span></span><br><span class="line">    <span class="attr">name</span> = lisi</span><br><span class="line">    <span class="attr">email</span> = lisi@gitlab.com</span><br></pre></td></tr></table></figure></li></ul><p>此时<code>~/git/gitlab/</code>路径下的git项目全部都会使用<code>.gitconfig-work</code>的配置</p><p>此路径下的配置优先级为<code>项目配置&gt;.gitconfig-work配置&gt;用户配置&gt;系统配置</code></p><p>其他路径下的配置优先级为<code>项目配置&gt;用户配置&gt;系统配置</code></p><h4 id="注意-公司项目只能克隆到-git-gitlab-路径下"><a href="#注意-公司项目只能克隆到-git-gitlab-路径下" class="headerlink" title="注意:公司项目只能克隆到~/git/gitlab/路径下"></a><strong>注意</strong>:公司项目只能克隆到<code>~/git/gitlab/</code>路径下</h4>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;Git多用户配置&quot;&gt;&lt;a href=&quot;#Git多用户配置&quot; class=&quot;headerlink&quot; title=&quot;Git多用户配置&quot;&gt;&lt;/a&gt;Git多用户配置&lt;/h1&gt;&lt;h2 id=&quot;问题&quot;&gt;&lt;a href=&quot;#问题&quot; class=&quot;headerlink&quot; title=&quot;问题&quot;&gt;&lt;/a&gt;问题&lt;/h2&gt;&lt;p&gt;在工作与生活中,我们难免会遇到同时使用多个Git账号的情况&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;私人的项目在Github上托管,使用的user.name配置是Sowevo,使用的user.email是&lt;a href=&quot;mailto:&amp;#117;&amp;#x73;&amp;#101;&amp;#114;&amp;#64;&amp;#x73;&amp;#x6f;&amp;#x77;&amp;#x65;&amp;#118;&amp;#x6f;&amp;#x2e;&amp;#99;&amp;#111;&amp;#109;&quot;&gt;&amp;#117;&amp;#x73;&amp;#101;&amp;#114;&amp;#64;&amp;#x73;&amp;#x6f;&amp;#x77;&amp;#x65;&amp;#118;&amp;#x6f;&amp;#x2e;&amp;#99;&amp;#111;&amp;#109;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;公司的项目在Gitlab上托管,使用的user.name配置是lisi,使用的user.email是&lt;a href=&quot;mailto:&amp;#108;&amp;#x69;&amp;#115;&amp;#105;&amp;#x40;&amp;#103;&amp;#105;&amp;#116;&amp;#108;&amp;#97;&amp;#x62;&amp;#x2e;&amp;#x63;&amp;#x6f;&amp;#109;&quot;&gt;&amp;#108;&amp;#x69;&amp;#115;&amp;#105;&amp;#x40;&amp;#103;&amp;#105;&amp;#116;&amp;#108;&amp;#97;&amp;#x62;&amp;#x2e;&amp;#x63;&amp;#x6f;&amp;#109;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这时就会遇到这样的问题,提交到Gitlab的代码署名确是&lt;Sowevo&gt;&lt;a href=&quot;mailto:&amp;#x75;&amp;#x73;&amp;#101;&amp;#x72;&amp;#x40;&amp;#x73;&amp;#111;&amp;#x77;&amp;#101;&amp;#x76;&amp;#x6f;&amp;#x2e;&amp;#99;&amp;#111;&amp;#x6d;&quot;&gt;&amp;#x75;&amp;#x73;&amp;#101;&amp;#x72;&amp;#x40;&amp;#x73;&amp;#111;&amp;#x77;&amp;#101;&amp;#x76;&amp;#x6f;&amp;#x2e;&amp;#99;&amp;#111;&amp;#x6d;&lt;/a&gt;,经常用混&lt;/p&gt;
&lt;h2 id=&quot;解决方案&quot;&gt;&lt;a href=&quot;#解决方案&quot; class=&quot;headerlink&quot; title=&quot;解决方案&quot;&gt;&lt;/a&gt;解决方案&lt;/h2&gt;&lt;h3 id=&quot;按工程配置&quot;&gt;&lt;a href=&quot;#按工程配置&quot; class=&quot;headerlink&quot; title=&quot;按工程配置&quot;&gt;&lt;/a&gt;按工程配置&lt;/h3&gt;&lt;p&gt;git的配置可以放在三个地方：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;/etc/gitconfig&lt;/code&gt; 系统配置,对所有用户有效,一般不用&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;~/.gitconfig&lt;/code&gt; 用户配置,仅对当前用户生有效&lt;/p&gt;
&lt;figure class=&quot;highlight shell&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;# &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;全局配置&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;git config --global user.name &lt;span class=&quot;string&quot;&gt;&amp;quot;Sowevo&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;git config --global user.email &lt;span class=&quot;string&quot;&gt;&amp;quot;user@sowevo.com&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;projectPath/.git/config&lt;/code&gt; 项目配置，仅对当前项目生效&lt;/p&gt;
&lt;figure class=&quot;highlight shell&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;# &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;项目配置&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;git config user.name &lt;span class=&quot;string&quot;&gt;&amp;quot;lisi&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;git config user.email &lt;span class=&quot;string&quot;&gt;&amp;quot;lisi@gitlab.com&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;三种配置的优先级为 &lt;code&gt;项目配置&amp;gt;用户配置&amp;gt;系统配置&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;此时可以利用项目配置优先的规则,对公司项目单独设置user.name与user.email,但是项目如果比较多的话,每一个都要设置,比较繁琐&lt;/p&gt;
&lt;p&gt;可以使用下一种方式配置&lt;/p&gt;</summary>
    
    
    
    
    <category term="linux" scheme="https://sowevo.com/tags/linux/"/>
    
    <category term="git" scheme="https://sowevo.com/tags/git/"/>
    
  </entry>
  
  <entry>
    <title>PicGo-Core搭配Typora自动插入图片</title>
    <link href="https://sowevo.com/PicGo-Core%E6%90%AD%E9%85%8DTypora%E8%87%AA%E5%8A%A8%E6%8F%92%E5%85%A5%E5%9B%BE%E7%89%87/"/>
    <id>https://sowevo.com/PicGo-Core%E6%90%AD%E9%85%8DTypora%E8%87%AA%E5%8A%A8%E6%8F%92%E5%85%A5%E5%9B%BE%E7%89%87/</id>
    <published>2021-04-23T15:35:49.000Z</published>
    <updated>2021-04-28T22:34:47.000Z</updated>
    
    <content type="html"><![CDATA[<p>使用Typora写笔记的时候经常需要贴个图</p><p>Typora支持自动上传图片到图床,需要搭配一些第三方的图床工具</p><p>这里选择了PicGo-Core</p><h1 id="设置PicGo-Core"><a href="#设置PicGo-Core" class="headerlink" title="设置PicGo-Core"></a>设置PicGo-Core</h1><ul><li><p>安装PicGo-Core</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">依赖node</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">npm install picgo -g</span> </span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">or</span> </span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">yarn global add picgo</span></span><br></pre></td></tr></table></figure></li><li><p>配置PicGo-Core</p><p>我使用的是腾讯云COS,不同的图床配置不一样,具体<a href="https://picgo.github.io/PicGo-Core-Doc/zh/guide/config.html#picbed-tcyun">参考文档</a></p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">设置图床</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">picgo <span class="built_in">set</span> uploader</span> </span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">选择默认图床</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">picgo use uploader</span> </span><br></pre></td></tr></table></figure></li><li><p>测试上传</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">上传具体路径图片</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">picgo upload /xxx/xxx.jpg</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">上传剪贴板里的第一张图片（上传时会将格式转成png）</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">picgo upload</span></span><br></pre></td></tr></table></figure></li></ul><h1 id="设置Typora"><a href="#设置Typora" class="headerlink" title="设置Typora"></a>设置Typora</h1><h2 id="Mac设置步骤"><a href="#Mac设置步骤" class="headerlink" title="Mac设置步骤"></a>Mac设置步骤</h2><ul><li><p>获取node与picgo的绝对路径</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">获取node的路径 我的是 /usr/local/bin/node</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash"><span class="built_in">which</span> node</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">获取picgo的路径 我的是 /usr/local/bin/picgo</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash"><span class="built_in">which</span> picgo</span></span><br></pre></td></tr></table></figure></li><li><p>设置Typora的上传</p><ul><li>打开<strong>偏好设置</strong>–&gt;<strong>图像</strong></li><li><strong>插入图片时</strong>选择<strong>上传图片</strong></li><li><strong>上传图片设定</strong>选择<strong>Custom Command</strong></li><li>命令填入<code>[your node path] [your picgo-core path] upload</code>,使用上一步获取的路径替换,例如我的是<code>/usr/local/bin/node /usr/local/bin/picgo upload</code></li></ul><p><img data-src="https://up.sowevo.com/img/image-20210426162439566.png" alt="image-20210426162439566"></p></li></ul><h2 id="Winsdows设置步骤"><a href="#Winsdows设置步骤" class="headerlink" title="Winsdows设置步骤"></a>Winsdows设置步骤</h2><ul><li><p>设置Typora的上传</p><ul><li><p>打开<strong>偏好设置</strong>–&gt;<strong>图像</strong></p></li><li><p><strong>插入图片时</strong>选择<strong>上传图片</strong></p></li><li><p><strong>上传图片设定</strong>选择<strong>Custom Command</strong></p></li><li><p>命令填入<code>picgo upload</code></p><p><img data-src="https://up.sowevo.com/img/image-20210428223155681.png" alt="image-20210428223155681"></p></li></ul></li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;使用Typora写笔记的时候经常需要贴个图&lt;/p&gt;
&lt;p&gt;Typora支持自动上传图片到图床,需要搭配一些第三方的图床工具&lt;/p&gt;
&lt;p&gt;这里选择了PicGo-Core&lt;/p&gt;
&lt;h1 id=&quot;设置PicGo-Core&quot;&gt;&lt;a href=&quot;#设置PicGo-Core&quot; cl</summary>
      
    
    
    
    
    <category term="linux" scheme="https://sowevo.com/tags/linux/"/>
    
    <category term="图床" scheme="https://sowevo.com/tags/%E5%9B%BE%E5%BA%8A/"/>
    
  </entry>
  
  <entry>
    <title>Openwrt开启外网访问并配置SSL</title>
    <link href="https://sowevo.com/openwrt%E5%BC%80%E5%90%AF%E5%A4%96%E7%BD%91%E8%AE%BF%E9%97%AE%E5%B9%B6%E9%85%8D%E7%BD%AESSL/"/>
    <id>https://sowevo.com/openwrt%E5%BC%80%E5%90%AF%E5%A4%96%E7%BD%91%E8%AE%BF%E9%97%AE%E5%B9%B6%E9%85%8D%E7%BD%AESSL/</id>
    <published>2021-03-18T22:43:11.000Z</published>
    <updated>2021-03-18T22:43:11.000Z</updated>
    
    <content type="html"><![CDATA[<p>记录一下OpenWrt开启外网访问并绑定SSL证书的操作</p><h3 id="外网访问"><a href="#外网访问" class="headerlink" title="外网访问"></a>外网访问</h3><ul><li>关闭只允许内网访问的设置(去掉勾选)<br><img data-src="https://up.sowevo.com/img/20210318224657.png"></li><li>防火墙&#x3D;&#x3D;&gt;端口转发 中添加端口转发,将外网5500应设置OpenWrt的80端口<br><img data-src="https://up.sowevo.com/img/20210318225037.png"></li><li>通过域名+5500端口即可访问</li></ul><h3 id="添加SSL证书"><a href="#添加SSL证书" class="headerlink" title="添加SSL证书"></a>添加SSL证书</h3><ul><li><p>编辑uHTTPd的配置文件,打开路由器的SSL 443端口</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">vi /etc/config/uhttpd</span></span><br></pre></td></tr></table></figure><p>在原有配置 list listen_http ‘0.0.0.0:80’下面加入以下两行</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">注意是https</span></span><br><span class="line">list listen_https &#x27;0.0.0.0:443&#x27;</span><br><span class="line">list listen_https &#x27;[::]:443&#x27;</span><br></pre></td></tr></table></figure></li><li><p>输入以下命令安装 acme.sh</p>  <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">curl  https://get.acme.sh | sh</span></span><br></pre></td></tr></table></figure><p>  可以看到此时已经添加了定时任务</p><p>  <img data-src="https://up.sowevo.com/img/20210318225615.png"></p></li><li><p>此处使用 cloudflare  接口进行自动认证</p><ul><li>获取CF_Email,CF_Key两个参数,并执行以下命令<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">export CF_Email=&quot;abcde@126.com&quot;</span><br><span class="line">export CF_Key=&quot;de6132435csofe45464650w4646464602&quot;</span><br></pre></td></tr></table></figure></li></ul></li><li><p>输入以下命令,运行acme.sh生成证书,并将生成的证书放到uHTTPd的默认存储位置,最后自动重启uHTTPd</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">/root/.acme.sh/acme.sh --issue --dns dns_cf -d sowevo.com -d *.sowevo.com --keypath /etc/uhttpd.key --fullchainpath /etc/uhttpd.crt --reloadcmd <span class="string">&quot;/etc/init.d/uhttpd restart&quot;</span></span></span><br></pre></td></tr></table></figure><p>稍等一会命令执行完成(不同的dns厂商时间会有不同),证书就申请完毕</p></li><li><p>将路由器的443端口映射到外网<br><img data-src="https://up.sowevo.com/img/20210318231508.png"><br>家宽的443端口竟然没有封,就先使着吧…</p></li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;记录一下OpenWrt开启外网访问并绑定SSL证书的操作&lt;/p&gt;
&lt;h3 id=&quot;外网访问&quot;&gt;&lt;a href=&quot;#外网访问&quot; class=&quot;headerlink&quot; title=&quot;外网访问&quot;&gt;&lt;/a&gt;外网访问&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;关闭只允许内网访问的设置(去掉勾选)&lt;b</summary>
      
    
    
    
    
    <category term="openwrt" scheme="https://sowevo.com/tags/openwrt/"/>
    
  </entry>
  
  <entry>
    <title>Docker进阶</title>
    <link href="https://sowevo.com/Docker%E8%BF%9B%E9%98%B6/"/>
    <id>https://sowevo.com/Docker%E8%BF%9B%E9%98%B6/</id>
    <published>2021-02-05T17:08:40.000Z</published>
    <updated>2021-02-05T17:08:40.000Z</updated>
    
    <content type="html"><![CDATA[<p><img data-src="https://up.sowevo.com/img/20201224162029.png" alt="img"></p><h1 id="Docker-Compose"><a href="#Docker-Compose" class="headerlink" title="Docker Compose"></a>Docker Compose</h1><h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><p>Docker</p><p>DockerFile build run 手动操作,单个容器!</p><p>微服务,服务多,相互依赖</p><p>使用Docker Compose来高效管理,定义多个容器</p><ul><li><p>官方介绍</p><p>定义运行多个容器</p><p>使用yaml配置文件</p><p>所有环境都可以使用</p></li></ul><span id="more"></span><p>&#x3D;&#x3D;就是批量容器编排&#x3D;&#x3D;</p><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">要去git上确认下最新的版本</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash"><span class="built_in">sudo</span> curl -L <span class="string">&quot;https://github.com/docker/compose/releases/download/1.27.4/docker-compose-<span class="subst">$(uname -s)</span>-<span class="subst">$(uname -m)</span>&quot;</span> -o /usr/local/bin/docker-compose</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">加上权限</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash"><span class="built_in">sudo</span> <span class="built_in">chmod</span> +x /usr/local/bin/docker-compose</span></span><br></pre></td></tr></table></figure><h2 id="初体验"><a href="#初体验" class="headerlink" title="初体验!"></a>初体验!</h2><p>官方的例子</p><ol><li><p>创建文件夹</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash"><span class="built_in">mkdir</span> composetest</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash"><span class="built_in">cd</span> composetest</span></span><br></pre></td></tr></table></figure></li><li><p>新建一个<code>app.py</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><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> time</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> redis</span><br><span class="line"><span class="keyword">from</span> flask <span class="keyword">import</span> Flask</span><br><span class="line"></span><br><span class="line">app = Flask(__name__)</span><br><span class="line">cache = redis.Redis(host=<span class="string">&#x27;redis&#x27;</span>, port=<span class="number">6379</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_hit_count</span>():</span><br><span class="line">    retries = <span class="number">5</span></span><br><span class="line">    <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            <span class="keyword">return</span> cache.incr(<span class="string">&#x27;hits&#x27;</span>)</span><br><span class="line">        <span class="keyword">except</span> redis.exceptions.ConnectionError <span class="keyword">as</span> exc:</span><br><span class="line">            <span class="keyword">if</span> retries == <span class="number">0</span>:</span><br><span class="line">                <span class="keyword">raise</span> exc</span><br><span class="line">            retries -= <span class="number">1</span></span><br><span class="line">            time.sleep(<span class="number">0.5</span>)</span><br><span class="line"></span><br><span class="line"><span class="meta">@app.route(<span class="params"><span class="string">&#x27;/&#x27;</span></span>)</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">hello</span>():</span><br><span class="line">    count = get_hit_count()</span><br><span class="line">    <span class="keyword">return</span> <span class="string">&#x27;Hello World! I have been seen &#123;&#125; times.\n&#x27;</span>.<span class="built_in">format</span>(count)</span><br></pre></td></tr></table></figure></li><li><p>新建一个<code>requirements.txt</code>文件</p><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">flask</span></span><br><span class="line"><span class="attribute">redis</span></span><br></pre></td></tr></table></figure></li><li><p>创建<code>Dockerfile</code>文件</p><figure class="highlight dockerfile"><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><span class="line"><span class="keyword">FROM</span> python:<span class="number">3.7</span>-alpine       <span class="comment"># 从Python3.7映像开始构建</span></span><br><span class="line"><span class="keyword">WORKDIR</span><span class="language-bash"> /code                <span class="comment"># 将工作目录设置为/code</span></span></span><br><span class="line"><span class="keyword">ENV</span> FLASK_APP=app.py         <span class="comment"># 设置flask使用的环境变量</span></span><br><span class="line"><span class="keyword">ENV</span> FLASK_RUN_HOST=<span class="number">0.0</span>.<span class="number">0.0</span>   </span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> apk add --no-cache gcc musl-dev linux-headers <span class="comment"># 安装gcc和其他依赖项</span></span></span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> requirements.txt requirements.txt</span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> pip install -r requirements.txt               <span class="comment"># 使用requirements安装依赖</span></span></span><br><span class="line"><span class="keyword">EXPOSE</span> <span class="number">5000</span>                                       <span class="comment"># 监听5000端口</span></span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> . .</span></span><br><span class="line"><span class="keyword">CMD</span><span class="language-bash"> [<span class="string">&quot;flask&quot;</span>, <span class="string">&quot;run&quot;</span>]                              <span class="comment"># 执行flask命令</span></span></span><br></pre></td></tr></table></figure></li><li><p>创建<code>docker-compose.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><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">version:</span> <span class="string">&quot;3.9&quot;</span></span><br><span class="line"><span class="attr">services:</span></span><br><span class="line">  <span class="attr">web:</span></span><br><span class="line">    <span class="attr">build:</span> <span class="string">.</span></span><br><span class="line">    <span class="attr">ports:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;5000:5000&quot;</span></span><br><span class="line">  <span class="attr">redis:</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">&quot;redis:alpine&quot;</span></span><br></pre></td></tr></table></figure></li><li><p>使用compose构建并运行你的app</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">如果compose文件名不是标准的docker-compose.yml,可以使用-f指定文件</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">docker-compose -f docker-compose-dev.yml up</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker-compose up</span></span><br></pre></td></tr></table></figure></li><li><p>使用compose停止你的app</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker-compose down</span></span><br></pre></td></tr></table></figure></li></ol><h2 id="都干了些什么"><a href="#都干了些什么" class="headerlink" title="都干了些什么"></a>都干了些什么</h2><ol><li>根据Dockerfile构建镜像,下载镜像</li><li>容器名称的的处理</li><li>新建一个网络给这个<code>项目</code>使用</li></ol><h2 id="配置文件的编写"><a href="#配置文件的编写" class="headerlink" title="配置文件的编写"></a>配置文件的编写</h2><p><strong><a href="https://docs.docker.com/compose/compose-file/compose-file-v3/#compose-file-structure-and-examples">官方文档链接</a></strong></p><p>瞅瞅开源项目的<code>docker-compose.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><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></pre></td><td class="code"><pre><span class="line"><span class="attr">version:</span> <span class="string">&quot;3.9&quot;</span>           <span class="comment"># 1.compose版本</span></span><br><span class="line"><span class="comment">#======================================    </span></span><br><span class="line"><span class="attr">services:</span>                <span class="comment"># 2.服务</span></span><br><span class="line">  <span class="attr">web:</span>                   <span class="comment">#   服务名</span></span><br><span class="line">    <span class="attr">build:</span> <span class="string">.</span>             <span class="comment">#   服务构建目录,会在这个目录下找Dockerfile开始构建</span></span><br><span class="line">    <span class="attr">ports:</span>               <span class="comment">#   端口映射</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;5000:5000&quot;</span> </span><br><span class="line">    <span class="attr">depends_on:</span>          <span class="comment">#   多个服务依赖的情况,被依赖的会先启动</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">redis</span>            <span class="comment">#   web依赖redis</span></span><br><span class="line">    <span class="attr">environment:</span>         <span class="comment">#   一些环境变量</span></span><br><span class="line">      <span class="attr">RACK_ENV:</span> <span class="string">development</span></span><br><span class="line">      <span class="attr">SHOW:</span> <span class="string">&#x27;true&#x27;</span>  </span><br><span class="line">  <span class="attr">redis:</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">&quot;redis:alpine&quot;</span> <span class="comment"># 指定一个镜像</span></span><br><span class="line">    <span class="attr">expose:</span>              <span class="comment"># 暴露一些端口</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;3000&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;8000&quot;</span></span><br><span class="line"><span class="comment">#======================================</span></span><br><span class="line"><span class="attr">networks:</span>               <span class="comment"># 3.其他配置</span></span><br><span class="line">  <span class="attr">frontend:</span></span><br><span class="line">  <span class="attr">backend:</span></span><br><span class="line"><span class="attr">volumes:</span></span><br><span class="line">  <span class="attr">db-data:</span>    </span><br></pre></td></tr></table></figure><h2 id="再体验-WordPress"><a href="#再体验-WordPress" class="headerlink" title="再体验-WordPress"></a>再体验-WordPress</h2><p>部署WordPress</p><ol><li><p>建个文件夹</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">cd</span> my_wordpress/</span><br></pre></td></tr></table></figure></li><li><p>编写<code>docker-compose.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><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></pre></td><td class="code"><pre><span class="line"><span class="attr">version:</span> <span class="string">&#x27;3.3&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="attr">services:</span></span><br><span class="line">   <span class="attr">db:</span></span><br><span class="line">     <span class="attr">image:</span> <span class="string">mysql:5.7</span></span><br><span class="line">     <span class="attr">volumes:</span></span><br><span class="line">       <span class="bullet">-</span> <span class="string">db_data:/var/lib/mysql</span></span><br><span class="line">     <span class="attr">restart:</span> <span class="string">always</span></span><br><span class="line">     <span class="attr">environment:</span></span><br><span class="line">       <span class="attr">MYSQL_ROOT_PASSWORD:</span> <span class="string">somewordpress</span></span><br><span class="line">       <span class="attr">MYSQL_DATABASE:</span> <span class="string">wordpress</span></span><br><span class="line">       <span class="attr">MYSQL_USER:</span> <span class="string">wordpress</span></span><br><span class="line">       <span class="attr">MYSQL_PASSWORD:</span> <span class="string">wordpress</span></span><br><span class="line"></span><br><span class="line">   <span class="attr">wordpress:</span></span><br><span class="line">     <span class="attr">depends_on:</span></span><br><span class="line">       <span class="bullet">-</span> <span class="string">db</span></span><br><span class="line">     <span class="attr">image:</span> <span class="string">wordpress:latest</span></span><br><span class="line">     <span class="attr">ports:</span></span><br><span class="line">       <span class="bullet">-</span> <span class="string">&quot;8000:80&quot;</span></span><br><span class="line">     <span class="attr">restart:</span> <span class="string">always</span></span><br><span class="line">     <span class="attr">environment:</span></span><br><span class="line">       <span class="attr">WORDPRESS_DB_HOST:</span> <span class="string">db:3306</span></span><br><span class="line">       <span class="attr">WORDPRESS_DB_USER:</span> <span class="string">wordpress</span></span><br><span class="line">       <span class="attr">WORDPRESS_DB_PASSWORD:</span> <span class="string">wordpress</span></span><br><span class="line">       <span class="attr">WORDPRESS_DB_NAME:</span> <span class="string">wordpress</span></span><br><span class="line"><span class="attr">volumes:</span></span><br><span class="line">    <span class="attr">db_data:</span> &#123;&#125;</span><br></pre></td></tr></table></figure></li><li><p>启动项目</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">后台那运行</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker-compose up -d</span></span><br></pre></td></tr></table></figure></li></ol><h2 id="再再体验-SpringBoot"><a href="#再再体验-SpringBoot" class="headerlink" title="再再体验-SpringBoot"></a>再再体验-SpringBoot</h2><ol><li><p>SpringBoot写个项目</p></li><li><p>编写Dockerfile</p><figure class="highlight dockerfile"><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><span class="line"><span class="keyword">FROM</span> java:<span class="number">8</span></span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> ./target/*.jar /app.jar</span></span><br><span class="line"><span class="keyword">EXPOSE</span> <span class="number">8080</span></span><br><span class="line"><span class="keyword">CMD</span><span class="language-bash"> [<span class="string">&quot;--server.port=8080&quot;</span>]</span></span><br><span class="line"><span class="keyword">ENTRYPOINT</span><span class="language-bash"> [<span class="string">&quot;java&quot;</span>,<span class="string">&quot;-jar&quot;</span>,<span class="string">&quot;/app.jar&quot;</span>]</span></span><br></pre></td></tr></table></figure></li><li><p>编写<code>docker-compose.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><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><span class="line"><span class="attr">version:</span> <span class="string">&quot;3.9&quot;</span></span><br><span class="line"><span class="attr">services:</span></span><br><span class="line">  <span class="attr">spring-boot:</span></span><br><span class="line">    <span class="attr">build:</span> <span class="string">.</span></span><br><span class="line">    <span class="attr">ports:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&quot;8080:8080&quot;</span></span><br><span class="line">    <span class="attr">depends_on:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">redis</span></span><br><span class="line">  <span class="attr">redis:</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">redis</span></span><br></pre></td></tr></table></figure></li><li><p>启动</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">后台运行</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker-compose up -d</span></span><br></pre></td></tr></table></figure></li></ol><h1 id="Docker-Swarm"><a href="#Docker-Swarm" class="headerlink" title="Docker Swarm"></a>Docker Swarm</h1><h2 id="搞几台服务器"><a href="#搞几台服务器" class="headerlink" title="搞几台服务器"></a>搞几台服务器</h2><p>搞4台(1核2G)</p><p>并安装Docker</p><h2 id="工作模式"><a href="#工作模式" class="headerlink" title="工作模式"></a>工作模式</h2><p><img data-src="https://up.sowevo.com/img/20201226145356.png" alt="Swarm mode cluster"></p><h3 id="Swarm-两种角色"><a href="#Swarm-两种角色" class="headerlink" title="Swarm 两种角色"></a>Swarm 两种角色</h3><p><strong>Manager</strong>：接收客户端服务定义，将任务发送到worker节点；维护集群期望状态和集群管理功能及Leader选举。默认情况下manager节点也会运行任务，也可以配置只做管理任务。</p><p><strong>Worker</strong>：接收并执行从管理节点分配的任务，并报告任务当前状态，以便管理节点维护每个服务期望状态。</p><hr><h2 id="搭建集群"><a href="#搭建集群" class="headerlink" title="搭建集群"></a>搭建集群</h2><p>使用Docker Swarm命令</p><ol><li><p>初始化一个manager节点</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">初始化一个管理节点</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker swarm init --advertise-addr=172.17.88.237</span></span><br><span class="line">Swarm initialized: current node (84jg51t5nr7ywlqku2uwpkcm3) is now a manager.</span><br><span class="line"></span><br><span class="line">To add a worker to this swarm, run the following command:</span><br><span class="line"></span><br><span class="line">    docker swarm join --token SWMTKN-1-55o9kohbport6z73roe1m0532kl55ihc712tt6nrd1mupt0n3q-axx5fxz310o6t237m7dbxvt52 172.17.88.237:2377</span><br><span class="line"></span><br><span class="line">To add a manager to this swarm, run &#x27;docker swarm join-token manager&#x27; and follow the instructions.</span><br></pre></td></tr></table></figure></li><li><p>manager节点生成token</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">生成加入工作节点(worker)的token,会直接输出可用的命令,人性化</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker swarm join-token worker</span> </span><br><span class="line">To add a worker to this swarm, run the following command:</span><br><span class="line"></span><br><span class="line">    docker swarm join --token SWMTKN-1-55o9kohbport6z73roe1m0532kl55ihc712tt6nrd1mupt0n3q-axx5fxz310o6t237m7dbxvt52 172.17.88.237:2377</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">===#</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">生成加入管理节点(manager)的token,会直接输出可用的命令,人性化</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker swarm join-token manager</span> </span><br><span class="line">To add a manager to this swarm, run the following command:</span><br><span class="line"></span><br><span class="line">    docker swarm join --token SWMTKN-1-55o9kohbport6z73roe1m0532kl55ihc712tt6nrd1mupt0n3q-brfqx08svxov16vbdi4jolpmc 172.17.88.237:2377</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure></li><li><p>其他节点加入</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">根据token的不同注册过去会有不同的权限~</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker swarm <span class="built_in">join</span> --token SWMTKN-1-55o9kohbport6z73roe1m0532kl55ihc712tt6nrd1mupt0n3q-axx5fxz310o6t237m7dbxvt52 172.17.88.237:2377 --advertise-addr=192.168.32.32</span></span><br></pre></td></tr></table></figure></li></ol><p>命令的相关用法</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker swarm COMMAND</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">   ca</span>              </span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">   init                       初始化swarm集群</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">         --advertise-addr     &lt;ip|interface&gt;[:port]</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">                              广播地址,本机的IP地址</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">   <span class="built_in">join</span>                       加入swarm集群</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">   join-token                 (worker|manager)</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">                              生成一个加入的令牌,指定令牌的类型,其他机器加入集群时需要</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">   leave                      离开swarm集群</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">   unlock</span>      </span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">   unlock-key</span>  </span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">   update</span>      </span><br></pre></td></tr></table></figure><h2 id="Raft协议"><a href="#Raft协议" class="headerlink" title="Raft协议"></a>Raft协议</h2><p>Raft协议:保证大多数管理节点(manager)存活,集群才能可用</p><p>当只有两台管理节点(manager)时,如果挂掉一个,会导致集群不可用</p><p>所以一个高可用的Swarm集群至少要有3台管理节点(manager),一台工作节点(Worker)</p><h2 id="Swarm集群中运行项目"><a href="#Swarm集群中运行项目" class="headerlink" title="Swarm集群中运行项目"></a>Swarm集群中运行项目</h2><h3 id="docker-service"><a href="#docker-service" class="headerlink" title="docker service"></a>docker service</h3><ul><li><p>与docker的区别</p><ul><li><p>docker run :容器启动,不具有扩容容器的功能</p></li><li><p>docker service :服务启动,具有扩容功能,滚动更新</p></li></ul></li><li><p><strong>docker service create</strong>部署服务</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">--name 服务名 -p 端口映射</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">部署后四个服务的8080端口都可以访问到这个服务...厉害了我的哥</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker service create -p 8080:80 --name my-nginx nginx</span></span><br></pre></td></tr></table></figure></li><li><p><strong>docker service ps</strong>查看服务</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看某个服务运行状态</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">docker service ps 服务名</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker service ps my-nginx</span> </span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看已经在运行的服务</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker service <span class="built_in">ls</span></span></span><br></pre></td></tr></table></figure></li><li><p><strong>docker service scale</strong>服务扩缩容</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">将my-nginx服务扩容到3个节点</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker service update --replicas 3 my-nginx</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">两个命令等价</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker service scale my-nginx=1</span></span><br></pre></td></tr></table></figure><p>服务集群中的任意节点都可以访问,有多个副本可以动态伸缩,实现服务的高可用</p></li><li><p><strong>docker service rm</strong>服务删除</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">讲一个服务删除</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker service <span class="built_in">rm</span> my-nginx</span></span><br></pre></td></tr></table></figure></li></ul><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><ul><li><strong>swarm</strong>:集群的管理和编排.Docker开一初始化一个swarm集群,其他节点可以以<strong>Manager</strong>或者<strong>Worker</strong>身份加入进来</li><li><strong>Node</strong>:就是一个Docker节点,多个节点组成一个集群</li><li><strong>Services</strong>:任务,可以在管理节点或者工作节点来运行,是核心,用户访问的.</li><li><strong>task</strong>:容器内的命令</li></ul><p><img data-src="https://up.sowevo.com/img/20201226205204.png" alt="image-20201226205204563"></p><p>命令&#x3D;&gt;管理&#x3D;&gt;API&#x3D;&gt;调度&#x3D;&gt;工作节点(创建Task容器,维护运行)</p><h1 id="DockerStack"><a href="#DockerStack" class="headerlink" title="DockerStack"></a>DockerStack</h1><p>Dockercompose的集群版</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_">#</span><span class="language-bash">单机</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker-compose up -d workpress.yaml</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">集群</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker stack deploy workpress.yaml</span></span><br></pre></td></tr></table></figure><h1 id="Docker-Secret"><a href="#Docker-Secret" class="headerlink" title="Docker Secret"></a>Docker Secret</h1><p>安全,配置密码加密证书</p><h1 id="Docker-Config"><a href="#Docker-Config" class="headerlink" title="Docker Config"></a>Docker Config</h1><p>配置</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;&lt;img data-src=&quot;https://up.sowevo.com/img/20201224162029.png&quot; alt=&quot;img&quot;&gt;&lt;/p&gt;
&lt;h1 id=&quot;Docker-Compose&quot;&gt;&lt;a href=&quot;#Docker-Compose&quot; class=&quot;headerlink&quot; title=&quot;Docker Compose&quot;&gt;&lt;/a&gt;Docker Compose&lt;/h1&gt;&lt;h2 id=&quot;简介&quot;&gt;&lt;a href=&quot;#简介&quot; class=&quot;headerlink&quot; title=&quot;简介&quot;&gt;&lt;/a&gt;简介&lt;/h2&gt;&lt;p&gt;Docker&lt;/p&gt;
&lt;p&gt;DockerFile build run 手动操作,单个容器!&lt;/p&gt;
&lt;p&gt;微服务,服务多,相互依赖&lt;/p&gt;
&lt;p&gt;使用Docker Compose来高效管理,定义多个容器&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;官方介绍&lt;/p&gt;
&lt;p&gt;定义运行多个容器&lt;/p&gt;
&lt;p&gt;使用yaml配置文件&lt;/p&gt;
&lt;p&gt;所有环境都可以使用&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</summary>
    
    
    
    
    <category term="Linux" scheme="https://sowevo.com/tags/Linux/"/>
    
    <category term="Docker" scheme="https://sowevo.com/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>Docker入门</title>
    <link href="https://sowevo.com/Docker%E5%85%A5%E9%97%A8/"/>
    <id>https://sowevo.com/Docker%E5%85%A5%E9%97%A8/</id>
    <published>2021-02-05T17:04:41.000Z</published>
    <updated>2021-02-05T17:04:41.000Z</updated>
    
    <content type="html"><![CDATA[<p><img data-src="https://up.sowevo.com/img/20201224162029.png" alt="img"></p><h1 id="Docker概述"><a href="#Docker概述" class="headerlink" title="Docker概述"></a>Docker概述</h1><h2 id="Docker为什么会出现"><a href="#Docker为什么会出现" class="headerlink" title="Docker为什么会出现?"></a>Docker为什么会出现?</h2><p>环境配置的难题:开发环境,测试环境,模拟环境</p><p>开发者常常会说:它在我的机器可以跑了(It works on my machine),言下之意就是,其他机器很可能跑不了.</p><p>安装的时候,可不可以把原始环境一模一样地复制过来.</p><p><strong>Docker</strong>针对上面的问题,提出了解决方案</p><span id="more"></span><p>通过隔离机制将服务器压榨到极致</p><h2 id="Docker的历史"><a href="#Docker的历史" class="headerlink" title="Docker的历史"></a>Docker的历史</h2><p>2010年,几个年轻人开了家公司<code>dotCloud</code></p><p>做一些pass的云计算技术,容器的技术</p><p>他们的技术命名为Docker</p><p>后来干不下去了…要倒闭</p><p>2013年Docker就开源了,就火了</p><p>2014年4月9日Docker1.0发布了</p><p>为什么这么火🔥?十分的轻巧!</p><p>容器技术之前,都是用的VMware虚拟机,十分笨重</p><p>Docker容器,也是一种虚拟机</p><blockquote><p>Docker是基于Go语言开发的</p></blockquote><p>官网<a href="https://www.docker.com/">https://www.docker.com/</a></p><p>文档<a href="https://docs.docker.com/">https://docs.docker.com/</a></p><p>仓库<a href="https://hub.docker.com/">https://hub.docker.com/</a></p><h2 id="Docker能干啥"><a href="#Docker能干啥" class="headerlink" title="Docker能干啥!"></a>Docker能干啥!</h2><ul><li><p>虚拟机技术缺点:</p><ol><li>资源占用多</li><li>冗余步骤多</li><li>启动慢</li></ol></li><li><p>容器技术</p><ul><li>容器化技术模拟的不是一台完整的电脑</li></ul></li><li><p>Docke与虚拟机技术的不同</p><ul><li>传统虚拟机:虚拟一堆硬件,运行一个完整的系统,然后再这个系统上安装和运行软件</li><li>Docker容器:直接使用宿主机的内核,容器没有自己的内核</li><li>每个容器间是相互隔离的,没个容器都都有一个自己的文件系统</li></ul></li></ul><blockquote><p>DevOps(开发,运维)</p></blockquote><p><strong>应用更快的交付和部署</strong></p><p>传统:一堆帮助文档,安装程序</p><p>Docker:打包镜像,发布测试,一键运行</p><p><strong>更便捷的升级和扩缩容</strong></p><p>使用了Docker后,项目部署就像搭积木</p><p>项目打包为一个镜像,直接在服务器A,服务器B上部署</p><p><strong>更简单的系统运维</strong></p><p>容器化之后,开发,测试,环境高度一致</p><p><strong>更高效的计算资源利用</strong></p><p>Docker是内核级的虚拟化,可以在一个物理机上运行很多实例!服务器的性能被压榨到极致!</p><h1 id="Docker-的安装"><a href="#Docker-的安装" class="headerlink" title="Docker 的安装"></a>Docker 的安装</h1><h2 id="Docker的基本组成"><a href="#Docker的基本组成" class="headerlink" title="Docker的基本组成"></a>Docker的基本组成</h2><p><img data-src="https://up.sowevo.com/img/20201224173423.png" alt="img"></p><ul><li>镜像(Image):<ul><li>Docker镜像相当于一个模板,可以通过这个模板来创建容器,镜像&#x3D;&#x3D;&gt;run&#x3D;&#x3D;&gt;容器,通过一个镜像可以常见多个容器</li></ul></li><li>容器(container)<ul><li>Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的</li><li>启动,停止,删除等命令</li><li>可以理解为一个建议的linux系统</li></ul></li><li>仓库(repository)<ul><li>仓库就是存放镜像的地方</li><li>仓库分为公有仓库和私有仓库</li><li>默认是国外的仓库,可以配置为国内的镜像</li></ul></li></ul><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><ul><li><p>安装</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun</span><br></pre></td></tr></table></figure><p>安装完成后，Docker 服务将会自动启动。输入下面的命令来验证：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">systemctl status docker</span></span><br></pre></td></tr></table></figure><p>查看安装的Docker的版本</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker version</span>  </span><br></pre></td></tr></table></figure><p><img data-src="https://up.sowevo.com/img/20201224175422.png" alt="image-20201224175422903"></p></li><li><p>Zsh插件的使用</p><ol><li><p>确认安装了Zsh</p></li><li><p>修改<code>~/.zshrc</code>文件</p></li><li><p>找到插件配置项<code>plugins=()</code>，增加<code>docker docker-compose</code>两个插件</p><p><img data-src="https://up.sowevo.com/img/20201224180153.png" alt="image-20201224180153473"></p></li><li><p><code>source ~/.zshrc</code></p></li></ol></li><li><p>使用</p><ul><li><p>运行hello-world</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker run hello-world</span></span><br></pre></td></tr></table></figure><p><img data-src="https://up.sowevo.com/img/20201224175629.png" alt="image-20201224175629771"></p></li><li><p>查看安装的镜像</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker images</span></span><br><span class="line">REPOSITORY    TAG       IMAGE ID       CREATED         SIZE</span><br><span class="line">hello-world   latest    bf756fb1ae65   11 months ago   13.3kB</span><br></pre></td></tr></table></figure></li></ul></li></ul><h2 id="容器加速镜像"><a href="#容器加速镜像" class="headerlink" title="容器加速镜像"></a>容器加速镜像</h2><figure class="highlight shell"><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><span class="line"><span class="meta prompt_">$ </span><span class="language-bash"><span class="built_in">mkdir</span> -p /etc/docker</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash"><span class="built_in">cat</span> &gt; /etc/docker/daemon.json &lt;&lt;<span class="string">EOF</span></span></span><br><span class="line">&#123;</span><br><span class="line">  &quot;registry-mirrors&quot;: [</span><br><span class="line">   &quot;https://ro9g7idi.mirror.aliyuncs.com&quot;</span><br><span class="line">  ]</span><br><span class="line">&#125;</span><br><span class="line">EOF</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash"><span class="string">systemctl daemon-reload</span></span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash"><span class="string">systemctl restart docker</span></span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"><span class="string">腾讯云可以用这个   https://mirror.ccs.tencentyun.com 地址</span></span></span><br></pre></td></tr></table></figure><h2 id="底层原理"><a href="#底层原理" class="headerlink" title="底层原理"></a>底层原理</h2><h3 id="Docker是怎么工作的"><a href="#Docker是怎么工作的" class="headerlink" title="Docker是怎么工作的"></a>Docker是怎么工作的</h3><p>Docker是一个Client-Server(C&#x2F;S)结构的系统,Docker的守护进程运行在主机上,通过Socket等方式从客户端访问</p><p><img data-src="https://up.sowevo.com/img/20201224201858" alt="img"></p><p>Server收到Client的命令,就会执行这个命令</p><p>默认我们安装的Docker包含了服务端与客户端,所以我们在同一台服务商的操作也是经过客户端&#x3D;&#x3D;&gt;服务端这个过程的</p><p>我们可以在本机安装一个客户端&#x3D;&#x3D;&gt;远程连接远程服务器上的docker服务端</p><h3 id="Docker为什么比VM块"><a href="#Docker为什么比VM块" class="headerlink" title="Docker为什么比VM块?"></a>Docker为什么比VM块?</h3><ol><li><p>Docker比虚拟机有着更少的抽象层</p></li><li><p>Docker利用的是宿主机的内核,VM是需要Guest OS</p><p><img data-src="https://up.sowevo.com/img/20201224202439.jpg" alt="img"></p></li></ol><p>​    新建一个容器的时候,Docker不需要像VM一样重新加载一个操作系统内核,避免引导</p><h1 id="Docker的常用命令"><a href="#Docker的常用命令" class="headerlink" title="Docker的常用命令"></a>Docker的常用命令</h1><h2 id="帮助命令"><a href="#帮助命令" class="headerlink" title="帮助命令"></a>帮助命令</h2><figure class="highlight shell"><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><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker version  <span class="comment"># 显示docker的版本</span></span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker info     <span class="comment"># 显示docker的系统信息</span></span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker <span class="built_in">help</span>     <span class="comment"># 帮助命令</span></span></span><br></pre></td></tr></table></figure><h2 id="镜像命令"><a href="#镜像命令" class="headerlink" title="镜像命令"></a>镜像命令</h2><ul><li><strong>dokcer images</strong>: 查看本地主机上的镜像</li></ul><figure class="highlight shell"><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><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">dokcer images   <span class="comment"># 查看本地主机上的镜像</span></span></span><br><span class="line">REPOSITORY    TAG       IMAGE ID       CREATED         SIZE</span><br><span class="line">hello-world   latest    bf756fb1ae65   11 months ago   13.3kB</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">选项:</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"> -a, --all             显示所有镜像,（默认隐藏中间镜像）</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"> -f, --filter filter   根据提供的条件过滤输出</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"> -q, --quiet           仅显示ID</span></span><br></pre></td></tr></table></figure><ul><li><strong>docker search</strong>:搜索镜像</li></ul><figure class="highlight shell"><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><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker search nginx</span></span><br><span class="line">NAME                               DESCRIPTION                                    STARS     OFFICIAL   AUTOMATED</span><br><span class="line">nginx                              Official build of Nginx.                       14198     [OK]       </span><br><span class="line">jwilder/nginx-proxy                Automated Nginx reverse proxy for docker con…  1932                 [OK]              </span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">选项:</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"> -f, --filter filter   根据过滤条件进行过滤</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">     --<span class="built_in">limit</span> int       一页显示多少条</span></span><br></pre></td></tr></table></figure><ul><li><strong>docker pull</strong>:下载镜像</li></ul><figure class="highlight shell"><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></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">可以指定docker 镜像的版本</span> </span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">docker pull mysql:5.7.9</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">如果不写tag,默认就是latest</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker pull mysql</span></span><br><span class="line">Using default tag: latest</span><br><span class="line">latest: Pulling from library/mysql</span><br><span class="line">6ec7b7d162b2: Pull complete </span><br><span class="line">fedd960d3481: Pull complete </span><br><span class="line">7ab947313861: Pull complete </span><br><span class="line">64f92f19e638: Pull complete </span><br><span class="line">3e80b17bff96: Pull complete </span><br><span class="line">014e976799f9: Pull complete </span><br><span class="line">59ae84fee1b3: Pull complete </span><br><span class="line">ffe10de703ea: Pull complete </span><br><span class="line">657af6d90c83: Pull complete </span><br><span class="line">98bfb480322c: Pull complete </span><br><span class="line">6aa3859c4789: Pull complete </span><br><span class="line">1ed875d851ef: Pull complete </span><br><span class="line">Digest: sha256:78800e6d3f1b230e35275145e657b82c3fb02a27b2d8e76aac2f5e90c1c30873</span><br><span class="line">Status: Downloaded newer image for mysql:latest</span><br><span class="line">docker.io/library/mysql:latest</span><br></pre></td></tr></table></figure><ul><li><strong>docker rmi</strong>:删除镜像</li></ul><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">两种形式</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">docker rmi 镜像<span class="built_in">id</span></span> </span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">docker rmi 镜像名:版本号</span> </span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker rmi a347a5928046</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker rmi hello-world:latest</span> </span><br></pre></td></tr></table></figure><h2 id="容器命令"><a href="#容器命令" class="headerlink" title="容器命令"></a>容器命令</h2><ul><li><p><strong>docker run</strong>:新建容器并启动</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker run [可选参数] images</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">参数说明</span></span><br><span class="line">--name=&quot;name&quot;   容器名称   tomcat01,mysql3306,用来区分容器</span><br><span class="line">-d后台方式运行</span><br><span class="line">-p指定容器的端口</span><br><span class="line">      -p ip:主机端口:容器端口</span><br><span class="line">-p 主机端口:容器端口(常用的)</span><br><span class="line">-p 容器端口</span><br><span class="line">-p             指定随机端口</span><br><span class="line">-i             以交互模式运行容器,通常与 -t 同时使用</span><br><span class="line">-t             为容器重新分配一个伪输入终端,通常与 -i 同时使用</span><br><span class="line">--rm           用完就删除,一般用来测试</span><br></pre></td></tr></table></figure><p>测试启动容器</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">启动centos容器,基础版本,很多命令都是不完善的</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker run -it  centos /bin/bash</span></span><br></pre></td></tr></table></figure></li><li><p><strong>docker ps</strong>列出所有正在运行的容器</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker ps</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">参数说明</span></span><br><span class="line">-a          显示所有容器,包括没有在运行的容器</span><br><span class="line">-n=2        显示返回条数</span><br><span class="line">-q          只显示容器的编号</span><br></pre></td></tr></table></figure></li><li><p><strong>docker  rm</strong>删除容器</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker <span class="built_in">rm</span> 容器<span class="built_in">id</span>    <span class="comment"># 删除指定的容器</span></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">参数说明</span></span><br><span class="line">-f     强制删除</span><br></pre></td></tr></table></figure></li><li><p>启动和停止容器</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker start   容器<span class="built_in">id</span>   <span class="comment"># 启动容器</span></span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker stop    容器<span class="built_in">id</span>    <span class="comment"># 停止容器</span></span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker restart 容器<span class="built_in">id</span> <span class="comment"># 重启容器</span></span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker <span class="built_in">kill</span>    容器<span class="built_in">id</span>    <span class="comment"># 强制停止容器</span></span></span><br></pre></td></tr></table></figure></li></ul><h2 id="组合命令-删库跑路"><a href="#组合命令-删库跑路" class="headerlink" title="组合命令(删库跑路)"></a>组合命令(删库跑路)</h2><ul><li><p>列出所有容器id</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker ps -aq</span></span><br></pre></td></tr></table></figure></li><li><p>停止所有的容器</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker stop $(docker ps -aq)</span></span><br></pre></td></tr></table></figure></li><li><p>删除所有的容器</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker <span class="built_in">rm</span> $(docker ps -aq)</span></span><br></pre></td></tr></table></figure></li><li><p>删除所有的镜像</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker rmi $(docker images -q)</span></span><br></pre></td></tr></table></figure></li><li><p>组合删库跑路</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker stop $(docker ps -aq) &amp;&amp; docker <span class="built_in">rm</span> $(docker ps -aq) &amp;&amp; docker rmi $(docker images -q)</span></span><br></pre></td></tr></table></figure></li></ul><h2 id="常用其他命令"><a href="#常用其他命令" class="headerlink" title="常用其他命令"></a>常用其他命令</h2><ul><li><p><strong>docker stats</strong> 查看容器使用资源情况</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">返回容器资源使用情况,一秒刷新一次</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker stats</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">返回容器资源使用情况,不刷新</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker stats --no-stream</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">返回容器资源使用情况,已经停掉的也显示</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker stats -a</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">返回指定容器资源使用情况</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker stats 容器<span class="built_in">id</span></span></span><br></pre></td></tr></table></figure></li><li><p>后台启动容器**-d**</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">-d 后台启动</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker run -d centos</span></span><br></pre></td></tr></table></figure></li><li><p><strong>docker logs</strong>查看日志</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker logs -tf --<span class="built_in">tail</span> 10 容器<span class="built_in">id</span></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">docker logs [OPTIONS] CONTAINER</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">OPTIONS说明：</span></span><br><span class="line">-f       跟踪日志输出</span><br><span class="line">-t       显示时间戳</span><br><span class="line">--since  显示某个开始时间的所有日志</span><br><span class="line">--tail   仅列出最新N条容器日志</span><br></pre></td></tr></table></figure></li><li><p><strong>docker top</strong>查看容器中的进程信息</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">docker top 容器<span class="built_in">id</span></span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker top 919121a5a1a6</span></span><br></pre></td></tr></table></figure></li><li><p><strong>docker inspect</strong> 查看容器的元数据</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">docker inspect 容器<span class="built_in">id</span></span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker inspect 919121a5a1a6</span></span><br></pre></td></tr></table></figure></li><li><p>进入当前正在运行的容器</p><ul><li><p>通常都是后台运行的,需要进入容器,修改配置之类的</p></li><li><p>方式一<strong>docker exec</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><span class="line"><span class="comment"># 命令</span></span><br><span class="line"><span class="comment"># docker exec -it 容器id /bin/bash</span></span><br><span class="line">$ docker <span class="built_in">exec</span> -it 919121a5a1a6 /bin/bash</span><br></pre></td></tr></table></figure></li><li><p>方式二<strong>docker attach</strong></p>  <figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">命令</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">docker attach 容器<span class="built_in">id</span></span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker attach 919121a5a1a6</span></span><br></pre></td></tr></table></figure></li><li><p>两种方式的区别</p><ul><li>docker exec     在容器中启动新的终端</li><li>docker attach  进入容器正在执行命令的那个终端.</li></ul></li></ul></li><li><p><strong>docker cp</strong>从容器拷贝文件到主机上</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">docker <span class="built_in">cp</span> 容器<span class="built_in">id</span>:容器内的文件名 宿主机上的文件名</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker <span class="built_in">cp</span> 919121a5a1a6:/root/123456.txt /root</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">docker <span class="built_in">cp</span> 宿主机上的文件名 容器<span class="built_in">id</span>:容器内的文件名</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker <span class="built_in">cp</span> /root/123456.txt 919121a5a1a6:/root</span></span><br></pre></td></tr></table></figure></li></ul><h2 id="不常用其他命令"><a href="#不常用其他命令" class="headerlink" title="不常用其他命令"></a>不常用其他命令</h2><ul><li><p><strong>docker network</strong>对网络的相关操作</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker network <span class="built_in">ls</span></span>  </span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">选项:</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"> connect     将容器连接到网络</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"> create      新建一个网络</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">   --driver  网络类型,默认是bridge桥接</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">   --subnet  子网掩码</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">   --gateway 网关</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"> disconnect  断开容器与网络的连接</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"> inspect     显示一个或多个网络的详细信息</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"> <span class="built_in">ls</span>          列出网络</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"> prune       删除所有未使用的网络</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"> <span class="built_in">rm</span>          删除一个或多个网络</span></span><br></pre></td></tr></table></figure></li><li><p><strong>docker tag</strong> 对已经存在的镜像添加标签</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">docker tag 已存在的镜像<span class="built_in">id</span> dockerhub用户名/镜像名:TAG</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker tag 69b72121b45e sowevo/diytomcat:1.0</span></span><br></pre></td></tr></table></figure></li><li><p><strong>docker login</strong>登录命令:登录到dockerHub,可以发布自己的镜像了~</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker login</span></span><br><span class="line">选项:</span><br><span class="line">  -p, --password 密码</span><br><span class="line">  -u, --username 账号</span><br></pre></td></tr></table></figure></li><li><p><strong>docker save</strong>镜像导出成文件</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">docker save 镜像<span class="built_in">id</span> -o 保存的文件名</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker save sowevo/diytomcat:1.0 -o diytomcat.tar</span></span><br></pre></td></tr></table></figure></li><li><p><strong>docker load</strong>从文件导入镜像</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">docker load -i 遇到导入的文件名</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker load -i diytomcat.tar</span></span><br></pre></td></tr></table></figure></li></ul><h2 id="案例"><a href="#案例" class="headerlink" title="案例"></a>案例</h2><h3 id="nginx"><a href="#nginx" class="headerlink" title="nginx"></a>nginx</h3><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">docker run -d -p 1234:80 --name nginx-1234 nginx</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">-d 后台运行</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">-p 端口映射</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">--name nginx-1234 容器的名称</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker run -d -p 1234:80 --name nginx-1234 nginx</span></span><br></pre></td></tr></table></figure><h3 id="tomcat"><a href="#tomcat" class="headerlink" title="tomcat"></a>tomcat</h3><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">docker run -it -p 8080:8080 --name tomcat8080 tomcat</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">-it 交互式启动</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">-p 端口映射</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">--name tomcat8080 容器的名称</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker run -it -p 8080:8080 --name tomcat8080 tomcat</span></span><br></pre></td></tr></table></figure><h3 id="elasticsearch"><a href="#elasticsearch" class="headerlink" title="elasticsearch"></a>elasticsearch</h3><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e <span class="string">&quot;discovery.type=single-node&quot;</span> elasticsearch:7.10.1</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">-d  后台运行</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">-p  端口映射,有两个</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">-e  镜像的环境参数 具体由镜像来指定,看下镜像的文档</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">--name elasticsearch 容器的名称</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e <span class="string">&quot;discovery.type=single-node&quot;</span> -e <span class="string">&quot;ES_JAVA_OPTS=-Xms64m -Xmx512m&quot;</span> elasticsearch:7.10.1</span></span><br></pre></td></tr></table></figure><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p><img data-src="https://up.sowevo.com/img/20201224224200.png" alt="img"></p><h1 id="可视化"><a href="#可视化" class="headerlink" title="可视化"></a>可视化</h1><h2 id="Prtainer"><a href="#Prtainer" class="headerlink" title="Prtainer"></a>Prtainer</h2><ul><li><p>安装</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker run -d -p 8000:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=<span class="literal">true</span> portainer/portainer</span> </span><br></pre></td></tr></table></figure></li><li><p>用的比较少</p></li></ul><h2 id="Rancher"><a href="#Rancher" class="headerlink" title="Rancher"></a>Rancher</h2><h1 id="Docker镜像"><a href="#Docker镜像" class="headerlink" title="Docker镜像"></a>Docker镜像</h1><h2 id="镜像是什么"><a href="#镜像是什么" class="headerlink" title="镜像是什么"></a>镜像是什么</h2><p>镜像是一种轻量级.可执行的独立软件,用来打包运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码,运行时,库,环境和配置文件</p><p>所有的应用,直接打包Docker镜像,就可以直接跑起来</p><p>如何得到镜像</p><ul><li>从远程仓库下载</li><li>从别处拷贝</li><li>自己制作一个镜像Dockerfile</li></ul><h2 id="Docker镜像加载原理"><a href="#Docker镜像加载原理" class="headerlink" title="Docker镜像加载原理"></a>Docker镜像加载原理</h2><h3 id="UnionFS联合文件系统"><a href="#UnionFS联合文件系统" class="headerlink" title="UnionFS联合文件系统"></a>UnionFS联合文件系统</h3><p>我们下载的时候看到的一层层就是这个!<br>UnionFS (联合文件系统) : Union文件系统( UnionFS )是-种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来-层层的叠加,同时可以将不同录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像)，可以制作各种具体的应用镜像。<br>特性: 一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录</p><h3 id="Docker镜像加载原理-1"><a href="#Docker镜像加载原理-1" class="headerlink" title="Docker镜像加载原理"></a>Docker镜像加载原理</h3><p>docker的镜像实际上由一层层的文件 系统组成 ，这种层级的文件系统UnionFS。</p><p>bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs.这一层与我们典型的Linux&#x2F;Unix系统是一样的 ,包含boot加载器和内核.当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs.<br>rootfs (root file system) ,在bootfs之上.包含的就是典型Linux系统中的&#x2F;dev, &#x2F;proc, &#x2F;bin, &#x2F;etc等标准目录和文件.rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。</p><p><img data-src="https://up.sowevo.com/img/20201225105806.png" alt="image-20201225105806178"></p><p>对于一个精简的OS,rootfs可以很小,只要包含最基本的命令,工具和程序库就可以,底层直接使用宿主机的kernel,对于不同的linux发行版本,bootfs基本一致,rootfs会有差别,因此可以共用bootfs</p><h3 id="分层"><a href="#分层" class="headerlink" title="分层"></a>分层</h3><p>Docker镜像由一些松耦合的只读镜像层组成</p><p><img data-src="https://up.sowevo.com/img/20201225111718.png" alt="image-20201225111718539"></p><p>Docker负责堆叠这些镜像层，并且将它们表示为单个统一的对象。</p><p>举一个简单的例子.</p><p><img data-src="https://up.sowevo.com/img/20201225112011.png" alt="image-20201225112011045"></p><h3 id="commit提交镜像"><a href="#commit提交镜像" class="headerlink" title="commit提交镜像"></a>commit提交镜像</h3><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">docker commit 将一个容器提交到本地成为一个新的镜像</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">提交到本地镜像库</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker commit -m=<span class="string">&#x27;描述&#x27;</span> -a=<span class="string">&#x27;作者&#x27;</span> 容器<span class="built_in">id</span> 新的镜像名</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">举个例子</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">默认的Tomcat webapp下面是空的,自己放置好内容之后,想要以后每次新建容器都用这个修改过的,可以把当前这个镜像提交到本地镜像库中</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">以后就可以使用这个新提交的镜像运行容器</span></span><br></pre></td></tr></table></figure><h1 id="容器数据卷"><a href="#容器数据卷" class="headerlink" title="容器数据卷"></a>容器数据卷</h1><h2 id="什么是容器数据卷"><a href="#什么是容器数据卷" class="headerlink" title="什么是容器数据卷"></a>什么是容器数据卷</h2><p>将容器内的目录挂载到宿主机上,容器中的数据可以存储到本地,这就是数据卷.</p><p>为了容器数据的持久化和数据同步操作</p><h2 id="使用数据卷"><a href="#使用数据卷" class="headerlink" title="使用数据卷"></a>使用数据卷</h2><h3 id="命令挂载"><a href="#命令挂载" class="headerlink" title="命令挂载"></a>命令挂载</h3><ul><li><p><strong>docker run -v</strong> 使用命令来挂载</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">docker run it -v 主机目录:容器目录 镜像名称</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">两个文件夹互相同步</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">-v</span> </span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">   -v 容器内路径            匿名挂载</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">   -v 卷名:容器内路径       具名挂载</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">   -v 容器外路径:容器内路径  指定路径挂载,与具名挂载的区别是,开头是/</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker run -it -v /root/test:/root ubuntu</span></span><br></pre></td></tr></table></figure></li><li><p>具名挂载和匿名挂载</p><p>挂载的三种形式</p><ul><li><p>匿名挂载</p><p>-v 容器内路径,卷名是随机hash值            </p><p>文件会在<code>/var/lib/docker/volumes/&#123;hash值&#125;/_data </code>下</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker run -it -v /root ubuntu</span></span><br></pre></td></tr></table></figure></li><li><p>具名挂载</p><p>-v 卷名:容器内路径</p><p>文件会在<code>/var/lib/docker/volumes/&#123;卷名&#125;/_data </code>下</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker run -it -v 卷名:/root ubuntu</span></span><br></pre></td></tr></table></figure></li><li><p>指定路径挂载</p><p>-v 宿主机路径:容器内路径</p><p>文件会在指定的宿主机路径下</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker run -it -v /root/test:/root ubuntu</span></span><br></pre></td></tr></table></figure></li></ul></li><li><p>&#x3D;&#x3D;当挂载宿主机不存在的文件时,会将容器中的文件给覆盖成空的&#x3D;&#x3D;</p></li><li><p>读写权限的控制</p><p>默认建的卷都是可读可写的权限</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">指定权限rw:可读可写</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker run -it -v /root/test:/root:rw ubuntu</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">指定权限ro:可读不可写,只有宿主机可以修改,容器内只能读取</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker run -it -v /root/test:/root:ro ubuntu</span></span><br></pre></td></tr></table></figure></li><li><p>例子:Mysql同步数据</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">-d 后台运行</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">-p 端口</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">-v 挂载路径 将mysql的数据目录和配置目录挂载出来,具体要挂载哪些路径,要看镜像的文档</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">-e 镜像的环境参数 具体由镜像来指定,看下镜像的文档</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root  --name mysql01 mysql:5.7</span></span><br></pre></td></tr></table></figure></li></ul><h3 id="DockerFile挂载"><a href="#DockerFile挂载" class="headerlink" title="DockerFile挂载"></a>DockerFile挂载</h3><p>DockerFile就是用来构建docker镜像的脚本文件</p><figure class="highlight dockerfile"><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><span class="line"><span class="keyword">FROM</span>  centos</span><br><span class="line"><span class="keyword">VOLUME</span><span class="language-bash">  [<span class="string">&quot;volume01&quot;</span>,<span class="string">&quot;/volume02&quot;</span>]</span></span><br><span class="line"><span class="keyword">CMD</span><span class="language-bash">  <span class="built_in">echo</span> <span class="string">&quot;end&quot;</span></span></span><br><span class="line"><span class="keyword">CMD</span><span class="language-bash">  /bin/bash</span></span><br></pre></td></tr></table></figure><p>Docker中可以指定挂载文件<code>VOLUME</code>,只能匿名挂载</p><p>如果启动容器时制定了相同的卷,DockerFile里面的会被覆盖</p><h3 id="数据卷容器-–volumes-from"><a href="#数据卷容器-–volumes-from" class="headerlink" title="数据卷容器:–volumes-from"></a>数据卷容器:<strong>–volumes-from</strong></h3><p>顾名思义,就是从另一个容器当中挂载容器中已经创建好的数据卷</p><p>可以做到两个容器之间的容器共享</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">先建立一个有挂载文件容器</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker run --name ubuntu01 -it -v /root/test:/root ubuntu</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">在建立一个容器可以挂载之前容器挂载的卷</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker run --name ubuntu02 --volumes-from=ubuntu01 -it ubuntu</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker run --name ubuntu03 --volumes-from=ubuntu01 -it ubuntu</span></span><br></pre></td></tr></table></figure><p>可以做到多个容器之间的配置文件信息的传递</p><h1 id="DockerFile"><a href="#DockerFile" class="headerlink" title="DockerFile"></a>DockerFile</h1><h2 id="Dockerfile介绍"><a href="#Dockerfile介绍" class="headerlink" title="Dockerfile介绍"></a>Dockerfile介绍</h2><p>用来构建Docker镜像的文件!是个脚本</p><p>构建步骤</p><ol><li>编写Dockerfile文件</li><li>docker bulid 构建成为一个镜像</li><li>docker run 运行这个镜像</li><li>docker push 发布这个镜像(Dockerhub,阿里云仓库,私有仓库)</li></ol><p>官方镜像很多都是基础包,很多功能没有,我们通常会构建自己的镜像</p><h2 id="Dockerfile构建过程"><a href="#Dockerfile构建过程" class="headerlink" title="Dockerfile构建过程"></a>Dockerfile构建过程</h2><p>Dockerfile是面向开发的,我们以后发布项目,作镜像,就需要编写Dockerfile文件,这个文件十分简单</p><p>docker镜像已经逐渐成为企业交付的一个标准,有必要掌握!</p><h3 id="步骤"><a href="#步骤" class="headerlink" title="步骤"></a>步骤</h3><p>Dockerfile:构建文件,定义了一切的步骤,源代码</p><p>DockerImage:镜像,通过Dockerfile构建生成,最终发布和运行的产品</p><p>Docker容器:容器就是镜像运行起来的服务</p><h3 id="DockerFile的指令"><a href="#DockerFile的指令" class="headerlink" title="DockerFile的指令"></a>DockerFile的指令</h3><p>脚本有很多指令</p><ul><li>基础知识<ol><li>每个指令都是大写</li><li>执行顺序从上到下</li><li># 是注释</li><li>每一个直径都会创建提交一个新的镜像层,并提交</li></ol></li></ul><p><img data-src="https://up.sowevo.com/img/20201225140303.png" alt="img"></p><figure class="highlight dockerfile"><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><span class="line"><span class="keyword">FROM</span>          <span class="comment"># 基础镜像,一切从这里开始</span></span><br><span class="line"><span class="keyword">MAINTAINER</span>    <span class="comment"># 镜像是谁写的,姓名,邮箱</span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash">           <span class="comment"># 镜像构建时要运行的命令</span></span></span><br><span class="line"><span class="keyword">ADD</span><span class="language-bash">           <span class="comment"># 添加文件,例如tomcat的压缩包,会自动解压文件</span></span></span><br><span class="line"><span class="keyword">WORKDIR</span><span class="language-bash">       <span class="comment"># 镜像的工作目录</span></span></span><br><span class="line"><span class="keyword">VOLUME</span><span class="language-bash">        <span class="comment"># 挂载的目录</span></span></span><br><span class="line"><span class="keyword">EXPOSE</span>        <span class="comment"># 暴露的端口</span></span><br><span class="line"><span class="keyword">CMD</span><span class="language-bash">           <span class="comment"># 启动时要运行的脚本,外部指定命令时会被替换,</span></span></span><br><span class="line">              <span class="comment"># 例如指定了ls,外部启动时拼接-a,会被替换,只剩-a,报错</span></span><br><span class="line"><span class="keyword">ENTRYPOINT</span><span class="language-bash">    <span class="comment"># 启动时要运行的脚本,外部指定命令时不会被替换,而是追加</span></span></span><br><span class="line">              <span class="comment"># 例如指定了ls,外部启动时拼接-a,会被追加,只剩ls -a可以运行</span></span><br><span class="line"><span class="keyword">ONBUILD</span>       <span class="comment"># 当构建一个被继承DockerFile,这个命令就会被执行,触发指令</span></span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash">          <span class="comment"># 类似ADD,将文件拷贝到镜像中</span></span></span><br><span class="line"><span class="keyword">ENV</span>           <span class="comment"># 构建的时候设置环境变量</span></span><br></pre></td></tr></table></figure><h2 id="实战测试"><a href="#实战测试" class="headerlink" title="实战测试"></a>实战测试</h2><p>DockerHub中99%的镜像是从<code>scratch</code>来的,最基础的镜像</p><ul><li><p>构建自己的centos,安装一些依赖</p><ol><li><p>编写Dockerfile</p><figure class="highlight dockerfile"><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><span class="line"><span class="keyword">FROM</span> centos</span><br><span class="line"><span class="keyword">MAINTAINER</span> sowevo&lt;i@sowevo.com&gt;</span><br><span class="line"><span class="keyword">ENV</span> MYPATH /<span class="keyword">user</span>/local</span><br><span class="line"><span class="keyword">WORKDIR</span><span class="language-bash"> <span class="variable">$MYPATH</span>               <span class="comment"># 指定工作路径</span></span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> yum -y install vim        <span class="comment"># 安装个软件</span></span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> yum -y install net-tools  <span class="comment"># 安装个软件</span></span></span><br><span class="line"><span class="keyword">EXPOSE</span> <span class="number">80</span></span><br><span class="line"><span class="keyword">CMD</span><span class="language-bash"> <span class="built_in">echo</span> <span class="variable">$MYPATH</span></span></span><br><span class="line"><span class="keyword">CMD</span><span class="language-bash"> <span class="built_in">echo</span> <span class="string">&quot;---end---&quot;</span></span></span><br><span class="line"><span class="keyword">CMD</span><span class="language-bash"> /bin/bash</span></span><br></pre></td></tr></table></figure></li><li><p><strong>docker build</strong>构建镜像</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker build -f myDcokerFile-centos -t sowevo/centos .</span></span><br></pre></td></tr></table></figure></li><li><p>运行这个镜像</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker run -it 8410af091bf5 sowevo/centos</span></span><br></pre></td></tr></table></figure></li></ol></li><li><p>构建自己的tomcat</p><ol><li><p>从下载一个JDK和Tomcat开始</p><p><img data-src="https://up.sowevo.com/img/20201225151338.png" alt="image-20201225151338200"></p></li><li><p>编写DockerFile,最好使用<code>Dockerfile</code>,官方推荐用</p><figure class="highlight dockerfile"><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 以centos为基础</span></span><br><span class="line"><span class="keyword">FROM</span> centos</span><br><span class="line"><span class="keyword">MAINTAINER</span> sowevo&lt;i@sowevo.com&gt;</span><br><span class="line"><span class="comment"># 环境变量:工作目录</span></span><br><span class="line"><span class="keyword">ENV</span> WORKPATH /usr/local</span><br><span class="line"><span class="comment"># 拷贝帮助文档</span></span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> README <span class="variable">$WORKPATH</span>/README</span></span><br><span class="line"><span class="comment"># 拷贝java和tomcat的安装包,会自动解压到指定路径</span></span><br><span class="line"><span class="keyword">ADD</span><span class="language-bash"> apache-tomcat-9.0.41.tar.gz <span class="variable">$WORKPATH</span></span></span><br><span class="line"><span class="keyword">ADD</span><span class="language-bash"> jdk-8u251-linux-x64.tar.gz  <span class="variable">$WORKPATH</span></span></span><br><span class="line"><span class="comment"># 安装一个vim</span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> yum -y install vim</span></span><br><span class="line"><span class="comment"># java和tomcat需要的 环境变脸</span></span><br><span class="line"><span class="keyword">ENV</span> JAVA_HOME $WORKPATH/jdk1.<span class="number">8.0</span>_251</span><br><span class="line"><span class="keyword">ENV</span> CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/lib/tools.jar</span><br><span class="line"><span class="keyword">ENV</span> CATALINA_HOME $WORKPATH/apache-tomcat-<span class="number">9.0</span>.<span class="number">41</span></span><br><span class="line"><span class="keyword">ENV</span> CATALINA_BASH $WORKPATH/apache-tomcat-<span class="number">9.0</span>.<span class="number">41</span></span><br><span class="line"><span class="keyword">ENV</span> PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/lib</span><br><span class="line"><span class="comment"># 指定工作目录</span></span><br><span class="line"><span class="keyword">WORKDIR</span><span class="language-bash"> <span class="variable">$WORKPATH</span></span></span><br><span class="line"><span class="comment"># 开放端口</span></span><br><span class="line"><span class="keyword">EXPOSE</span> <span class="number">8080</span></span><br><span class="line"><span class="comment"># 启动时要执行的命令</span></span><br><span class="line"><span class="keyword">CMD</span><span class="language-bash"> <span class="variable">$CATALINA_HOME</span>/bin/startup.sh &amp;&amp; <span class="built_in">tail</span> -F <span class="variable">$CATALINA_HOME</span>/logs/catalina.out</span></span><br></pre></td></tr></table></figure></li><li><p><strong>docker build</strong>构建镜像</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">如果Dockerfile的名字标准的话,可以不写-f 参数</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker build -t diytomcat .</span> </span><br></pre></td></tr></table></figure></li><li><p>运行这个镜像</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">-d 后台运行</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">-p 端口映射</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">-v 文件挂载</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker run -d -p 8080:8080  --name diytomcat -v /root/dockerfile/tomcat/webapps/test:/usr/local/apache-tomcat-9.0.41/webapps/test -v /root/dockerfile/tomcat/logs:/usr/local/apache-tomcat-9.0.41/logs diytomcat</span></span><br></pre></td></tr></table></figure></li><li><p>项目文件丢进宿主机的<code>/root/dockerfile/tomcat/webapps/test</code>路径即可访问</p></li></ol></li></ul><h2 id="发布镜像"><a href="#发布镜像" class="headerlink" title="发布镜像"></a>发布镜像</h2><h3 id="DockerHub"><a href="#DockerHub" class="headerlink" title="DockerHub"></a>DockerHub</h3><ol><li><p>注册账号</p></li><li><p>登录</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker login</span></span><br></pre></td></tr></table></figure></li><li><p>加一个标签</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">如果镜像标签不对,会被拒绝</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">可以加一个规范的tag</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">对已经存在的镜像添加tag 使用tag命令加一个标签</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker tag 69b72121b45e sowevo/diytomcat:1.0</span></span><br></pre></td></tr></table></figure></li><li><p>提交自己的镜像</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">网不好,推不上去,多尝试几次!</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker push sowevo/diytomcat:1.0</span></span><br></pre></td></tr></table></figure></li><li><p>发布成功!</p></li></ol><h3 id="腾讯云镜像仓库"><a href="#腾讯云镜像仓库" class="headerlink" title="腾讯云镜像仓库"></a>腾讯云镜像仓库</h3><ol><li><p>登录腾讯云</p></li><li><p>找到容器镜像服务,并开通</p><p><img data-src="https://up.sowevo.com/img/20201225165612.png" alt="image-20201225165612151"></p></li><li><p>创建命名空间</p><p>![image-20201225170110909](&#x2F;Users&#x2F;sowevo&#x2F;Library&#x2F;Application Support&#x2F;typora-user-images&#x2F;image-20201225170110909.png)</p></li><li><p>创建容器镜像</p><p><img data-src="https://up.sowevo.com/img/20201225170255.png" alt="image-20201225170254932"></p></li><li><p>登录腾讯云仓库</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash"><span class="built_in">sudo</span> docker login --username=23642660 ccr.ccs.tencentyun.com</span></span><br></pre></td></tr></table></figure></li><li><p>加一个标签</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash"><span class="built_in">sudo</span> docker tag [ImageId] ccr.ccs.tencentyun.com/sowevo/diytomcat:[tag]</span></span><br></pre></td></tr></table></figure></li><li><p>提交自己的镜像</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash"><span class="built_in">sudo</span> docker push ccr.ccs.tencentyun.com/sowevo/diytomcat:[tag]</span></span><br></pre></td></tr></table></figure></li><li><p>提交成功!</p></li></ol><h3 id="其他镜像仓库"><a href="#其他镜像仓库" class="headerlink" title="其他镜像仓库"></a>其他镜像仓库</h3><p>操作类似,都有提供文档</p><h2 id="总结-1"><a href="#总结-1" class="headerlink" title="总结"></a>总结</h2><p><img data-src="https://up.sowevo.com/img/20201225173454.png" alt="img"></p><h1 id="Docker网络"><a href="#Docker网络" class="headerlink" title="Docker网络"></a>Docker网络</h1><p>安装docker会自动安装一个虚拟网卡Dokcer0 </p><p>多个容器不指定网络的话,默认使用连接这个虚拟网卡Docker0路由,docker会给我们分配一个默认的可用的IP</p><p><img data-src="https://up.sowevo.com/img/20201225181651.png" alt="img"></p><p>使用<strong>docker network</strong>查看所有的docker网络</p><h2 id="Docker的几种网络模式"><a href="#Docker的几种网络模式" class="headerlink" title="Docker的几种网络模式"></a>Docker的几种网络模式</h2><ul><li>bridge:桥接网络,默认的</li><li>none:不配置网络</li><li>host:主机模式,和宿主机共享网络</li><li>container:容器间网络联通!(用的少)</li></ul><h2 id="容器互连"><a href="#容器互连" class="headerlink" title="容器互连"></a>容器互连</h2><p>想要实现容器间网络互连的方式</p><h3 id="使用-–link"><a href="#使用-–link" class="headerlink" title="使用**–link**"></a>使用**–link**</h3><p>多个服务间使用服务名进行服务间的网络调用</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">先建立一个容器</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker run -d -P --name tomcat01 tomcat</span> </span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">在建立一个容器,使用 --<span class="built_in">link</span> 指定另一个已存在容器</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker run -d -P --name tomcat02 --<span class="built_in">link</span> tomcat01 tomcat</span> </span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">然后第二个容器就可以使用容器名访问第一个容器</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker <span class="built_in">exec</span> -it tomcat02 ping tomcat01</span></span><br></pre></td></tr></table></figure><p>实际上–link命令就是在建立新容器<code>tomcat02</code>的时候,修改新容器的 <code>/etc/hosts</code>文件,给容器<code>tomcat01</code>的ip绑定一个域名,域名是容器名</p><p>现在已经不建议使用–link了~</p><h3 id="自定义网络"><a href="#自定义网络" class="headerlink" title="自定义网络"></a>自定义网络</h3><ul><li><p>使用<strong>docker network</strong>创建网络</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">创建一个自定义网络</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">--driver bridge 网络类型,桥接</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">--subnet 10.0.0.0/24 子网掩码    10.0.0.2~10.0.0.255</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">--gateway 10.0.0.1   网关</span>    </span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker network create --driver bridge --subnet 10.0.0.0/24 --gateway 10.0.0.1 customnetwork</span></span><br></pre></td></tr></table></figure></li></ul><p><img data-src="https://up.sowevo.com/img/20201225204150.png" alt="image-20201225204150364"></p><ul><li><p>建立容器时指定使用这个自定义网络</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker run -d -P --name tomcat-net-01 --net customnetwork  tomcat</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker run -d -P --name tomcat-net-02 --net customnetwork  tomcat</span></span><br></pre></td></tr></table></figure></li><li><p>现在两个容器之间可以通过容器名互相访问</p></li></ul><h3 id="网络联通"><a href="#网络联通" class="headerlink" title="网络联通"></a>网络联通</h3><p>实际上就是一个容器链接两个不同的网络</p><p>相当于现在现实中一台电脑两根网线连接两个路由器</p><p>双网卡!</p><ul><li><p>将一个容器连接到其他网络</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">docker network connect 网络名 容器名</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker network connect customnetwork tomcat-01</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker network connect customnetwork tomcat-02</span></span><br></pre></td></tr></table></figure></li></ul><h2 id="实战"><a href="#实战" class="headerlink" title="实战"></a>实战</h2><p>装一个redis集群</p><p>分片+高可用+负载均衡</p><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></pre></td><td class="code"><pre><span class="line">flowchart TD</span><br><span class="line">    </span><br><span class="line">    Redis-主-01 &lt;--&gt;  Redis-从-01;</span><br><span class="line">    Redis-主-02 &lt;--&gt;  Redis-从-02;</span><br><span class="line">    Redis-主-03 &lt;--&gt;  Redis-从-03;</span><br></pre></td></tr></table></figure><figure class="highlight shell"><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></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">创建网卡</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker network create --driver bridge --subnet 10.0.0.0/24 --gateway 10.0.0.1 redis-net</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">使用脚本创建配置文件</span></span><br><span class="line">for port in $(seq 1 6) ; \</span><br><span class="line">do \</span><br><span class="line">mkdir -p /mydata/redis/node-$&#123;port&#125;/conf</span><br><span class="line">touch /mydata/redis/node-$&#123;port&#125;/conf/redis.conf</span><br><span class="line">cat &gt;&gt; /mydata/redis/node-$&#123;port&#125;/conf/redis.conf&lt;&lt;EOF</span><br><span class="line">port 6379</span><br><span class="line">bind 0.0.0.0</span><br><span class="line">cluster-enabled yes</span><br><span class="line">cluster-config-file nodes.conf</span><br><span class="line">cluster-node-timeout 5000</span><br><span class="line">cluster-announce-ip 10.0.0.1$&#123;port&#125;</span><br><span class="line">cluster-announce-port 6379</span><br><span class="line">cluster-announce-bus-port 16379</span><br><span class="line">appendonly yes</span><br><span class="line">EOF</span><br><span class="line">done</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">启动脚本</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker run -d -p 6371:6379 -p 16371:16379 --name redis-1 -v /mydata/redis/node-1/data:/data -v /mydata/redis/node-1/conf/redis.conf:/etc/redis/conf -d --net redis-net --ip 10.0.0.11 redis redis-server /etc/redis/redis.conf</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker run -d -p 6372:6379 -p 16372:16379 --name redis-2 -v /mydata/redis/node-2/data:/data -v /mydata/redis/node-2/conf/redis.conf:/etc/redis/conf -d --net redis-net --ip 10.0.0.12 redis redis-server /etc/redis/redis.conf</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker run -d -p 6373:6379 -p 16373:16379 --name redis-3 -v /mydata/redis/node-3/data:/data -v /mydata/redis/node-3/conf/redis.conf:/etc/redis/conf -d --net redis-net --ip 10.0.0.13 redis redis-server /etc/redis/redis.conf</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker run -d -p 6374:6379 -p 16374:16379 --name redis-4 -v /mydata/redis/node-4/data:/data -v /mydata/redis/node-4/conf/redis.conf:/etc/redis/conf -d --net redis-net --ip 10.0.0.14 redis redis-server /etc/redis/redis.conf</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker run -d -p 6375:6379 -p 16375:16379 --name redis-5 -v /mydata/redis/node-5/data:/data -v /mydata/redis/node-5/conf/redis.conf:/etc/redis/conf -d --net redis-net --ip 10.0.0.15 redis redis-server /etc/redis/redis.conf</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker run -d -p 6376:6379 -p 16376:16379 --name redis-6 -v /mydata/redis/node-6/data:/data -v /mydata/redis/node-6/conf/redis.conf:/etc/redis/conf -d --net redis-net --ip 10.0.0.16 redis redis-server /etc/redis/redis.conf</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">配置集群</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">docker <span class="built_in">exec</span> -it redis-1 redis-cli --cluster create 10.0.0.11:6379 10.0.0.12:6379 10.0.0.13:6379 10.0.0.14:6379 10.0.0.15:6379 10.0.0.16:6379 --cluster-replicas 1</span></span><br></pre></td></tr></table></figure><p>这样创建的外网访问有问题…</p><h1 id="SpringBoot微服务打包Docker镜像"><a href="#SpringBoot微服务打包Docker镜像" class="headerlink" title="SpringBoot微服务打包Docker镜像"></a>SpringBoot微服务打包Docker镜像</h1><ol><li><p>构建SpringBoot项目</p></li><li><p>打包应用</p></li><li><p>编写Dockerfile</p><figure class="highlight dockerfile"><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><span class="line"><span class="comment"># 以java为基础</span></span><br><span class="line"><span class="keyword">FROM</span> java:<span class="number">8</span></span><br><span class="line"><span class="comment"># 复制打包出来的jar文件,名字叫app.jar</span></span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> target/*.jar /app.jar</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">CMD</span><span class="language-bash"> [<span class="string">&quot;--server.port=8080&quot;</span>]</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">EXPOSE</span> <span class="number">8080</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">ENTRYPOINT</span><span class="language-bash"> [<span class="string">&quot;java&quot;</span>,<span class="string">&quot;-jar&quot;</span>,<span class="string">&quot;/app.jar&quot;</span>]</span></span><br></pre></td></tr></table></figure></li><li><p>构建镜像</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash"> docker build -t docker-test:0.0.1-SNAPSHOT .</span></span><br></pre></td></tr></table></figure></li><li><p>发布运行</p></li></ol>]]></content>
    
    
    <summary type="html">&lt;p&gt;&lt;img data-src=&quot;https://up.sowevo.com/img/20201224162029.png&quot; alt=&quot;img&quot;&gt;&lt;/p&gt;
&lt;h1 id=&quot;Docker概述&quot;&gt;&lt;a href=&quot;#Docker概述&quot; class=&quot;headerlink&quot; title=&quot;Docker概述&quot;&gt;&lt;/a&gt;Docker概述&lt;/h1&gt;&lt;h2 id=&quot;Docker为什么会出现&quot;&gt;&lt;a href=&quot;#Docker为什么会出现&quot; class=&quot;headerlink&quot; title=&quot;Docker为什么会出现?&quot;&gt;&lt;/a&gt;Docker为什么会出现?&lt;/h2&gt;&lt;p&gt;环境配置的难题:开发环境,测试环境,模拟环境&lt;/p&gt;
&lt;p&gt;开发者常常会说:它在我的机器可以跑了(It works on my machine),言下之意就是,其他机器很可能跑不了.&lt;/p&gt;
&lt;p&gt;安装的时候,可不可以把原始环境一模一样地复制过来.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Docker&lt;/strong&gt;针对上面的问题,提出了解决方案&lt;/p&gt;</summary>
    
    
    
    
    <category term="Linux" scheme="https://sowevo.com/tags/Linux/"/>
    
    <category term="Docker" scheme="https://sowevo.com/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>hexo常用操作</title>
    <link href="https://sowevo.com/hexo%E5%B8%B8%E7%94%A8%E6%93%8D%E4%BD%9C/"/>
    <id>https://sowevo.com/hexo%E5%B8%B8%E7%94%A8%E6%93%8D%E4%BD%9C/</id>
    <published>2020-03-26T01:05:41.000Z</published>
    <updated>2021-09-28T11:08:27.000Z</updated>
    
    <content type="html"><![CDATA[<p>好久没有更新文章了,我甚至都不记得的我还有个网站了<br>折腾了半天终于能更新了<br>记录下相关命令<br>防止以后还得到处找</p><h1 id="本地恢复hexo的环境"><a href="#本地恢复hexo的环境" class="headerlink" title="本地恢复hexo的环境"></a>本地恢复hexo的环境</h1><ul><li><p>安装nodejs</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">mac</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">brew install node</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">centos</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">yum install -y nodejs</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">Ubuntu</span> </span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">apt install nodejs npm -y</span></span><br></pre></td></tr></table></figure></li><li><p>node的国内镜像源配置</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">npm config <span class="built_in">set</span> registry https://registry.npmmirror.com</span></span><br></pre></td></tr></table></figure></li><li><p>从git克隆项目文件</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">因为使用了子项目管理主题,加上<span class="string">&#x27;--recursive&#x27;</span>参数</span> </span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git <span class="built_in">clone</span> --recursive git@github.com:Sowevo/sowevo.github.io.git</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git <span class="built_in">clone</span> --recursive https://github.com/Sowevo/sowevo.github.io.git</span></span><br></pre></td></tr></table></figure></li><li><p>进入项目</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash"><span class="built_in">cd</span> ~/sowevo.github.io</span></span><br></pre></td></tr></table></figure></li><li><p>更新主题子项目</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">进入项目</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash"><span class="built_in">cd</span> ~/sowevo.github.io</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">更新子项目的代码</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git submodule update --init --recursive</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">如果有更新,提交一下</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git add themes/next</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git commit -m <span class="string">&quot;themes submodule updated&quot;</span></span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git push</span></span><br></pre></td></tr></table></figure></li><li><p>更新升级项目依赖包</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">进入项目</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">npm i -g npm-check-updates</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">ncu -u</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">npm install</span></span><br></pre></td></tr></table></figure></li><li><p>安装相关依赖</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">安装hexo</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">npm install -g hexo-cli</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">安装依赖</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">npm install</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">安装hexo git 部署插件</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">npm install hexo-deployer-git</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">其他插件</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">npm install hexo-generator-sitemap</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">npm install hexo-generator-baidu-sitemap</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">npm install hexo-generator-feed</span></span><br></pre></td></tr></table></figure></li><li><p>至此,环境恢复完成,可以开始干活了!!!</p></li><li><p>相关命令</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">新建文章</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">hexo n <span class="string">&quot;我的博客&quot;</span></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">生成静态文件</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">hexo g</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">运行服务</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">hexo s</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">部署</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">hexo d</span></span><br></pre></td></tr></table></figure></li><li><p><strong>记得提交hexo分支的源文件</strong></p></li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;好久没有更新文章了,我甚至都不记得的我还有个网站了&lt;br&gt;折腾了半天终于能更新了&lt;br&gt;记录下相关命令&lt;br&gt;防止以后还得到处找&lt;/p&gt;
&lt;h1 id=&quot;本地恢复hexo的环境&quot;&gt;&lt;a href=&quot;#本地恢复hexo的环境&quot; class=&quot;headerlink&quot; title</summary>
      
    
    
    
    
    <category term="Hexo" scheme="https://sowevo.com/tags/Hexo/"/>
    
  </entry>
  
  <entry>
    <title>联通KD-YUN-811G破解获取超级密码</title>
    <link href="https://sowevo.com/%E8%81%94%E9%80%9AKD-YUN-811G%E7%A0%B4%E8%A7%A3%E8%8E%B7%E5%8F%96%E8%B6%85%E7%BA%A7%E5%AF%86%E7%A0%81/"/>
    <id>https://sowevo.com/%E8%81%94%E9%80%9AKD-YUN-811G%E7%A0%B4%E8%A7%A3%E8%8E%B7%E5%8F%96%E8%B6%85%E7%BA%A7%E5%AF%86%E7%A0%81/</id>
    <published>2019-07-24T21:25:13.000Z</published>
    <updated>2019-07-24T21:25:13.000Z</updated>
    
    <content type="html"><![CDATA[<p>新装联通宽带一条,300M<br>送了一台KD-YUN-811G的光猫,也不知道是什么牌子的<br>想要自己改桥接模式,<br>百度搜索一番后,找到了方法<br>记录一下过程</p><h1 id="此方法同样适用于"><a href="#此方法同样适用于" class="headerlink" title="此方法同样适用于"></a>此方法同样适用于</h1><ul><li>TEWA-800E</li></ul><h1 id="二逼破解"><a href="#二逼破解" class="headerlink" title="二逼破解"></a>二逼破解</h1><ul><li>进入光猫登录界面<br><img data-src="https://up.sowevo.com/img/20190724214706.png" alt="登录界面"></li><li>F12进入开发者工具,在Elements中搜索user_name找到这里<span id="more"></span><img data-src="https://up.sowevo.com/img/20190724214835.png"></li><li>将元素id改为CUAdmin,此时界面上出现用户名输入框,如图<br><img data-src="https://up.sowevo.com/img/20190724215127.png"></li><li>切换到Sources标签页,找到submitFrm()函数<br><img data-src="https://up.sowevo.com/img/20190724215618.png"></li><li>将函数复制出来进行修改,删掉其中的<figure class="highlight javascript"><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><span class="line"><span class="keyword">if</span>(username.<span class="property">value</span>!=<span class="string">&#x27;user&#x27;</span>)&#123;</span><br><span class="line">    <span class="title function_">alert</span>(<span class="string">&#x27;请输入正确的用户账户!&#x27;</span>);</span><br><span class="line">    <span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>将其改为<figure class="highlight javascript"><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><span class="line"><span class="keyword">function</span> <span class="title function_">submitFrm</span>(<span class="params"></span>)</span><br><span class="line">&#123;</span><br><span class="line">    <span class="title function_">with</span>(<span class="params"><span class="variable language_">document</span>.forms[<span class="number">0</span>]</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> ( password.<span class="property">value</span>.<span class="property">length</span> == <span class="number">0</span> ) &#123;</span><br><span class="line">            <span class="title function_">alert</span>(<span class="string">&#x27;密码不得为空!&#x27;</span>);</span><br><span class="line">            <span class="keyword">return</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;loginfrm&#x27;</span>).<span class="title function_">submit</span>();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>将修改后的函数输入到Console标签页,回车后执行</li><li>两个输入框都输入CUAdmin后点击GO登录<br><img data-src="https://up.sowevo.com/img/20190724220620.png"></li><li>成功进入后台<br><img data-src="https://up.sowevo.com/img/20190724220828.png"></li></ul><h1 id="普通破解"><a href="#普通破解" class="headerlink" title="普通破解"></a>普通破解</h1><ul><li>其实还有简单点的方法…<br>打开登陆页,打开开发者工具,切换到Console标签页,输入以下命令<figure class="highlight javascript"><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><span class="line"><span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;user_name&#x27;</span>).<span class="property">value</span> = <span class="string">&#x27;CUAdmin&#x27;</span>; </span><br><span class="line"><span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;password&#x27;</span>).<span class="property">value</span> = <span class="string">&#x27;CUAdmin&#x27;</span>; </span><br><span class="line"><span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;loginfrm&#x27;</span>).<span class="title function_">submit</span>();</span><br></pre></td></tr></table></figure>回车即可,三行命令搞定</li></ul><h1 id="文艺破解"><a href="#文艺破解" class="headerlink" title="文艺破解"></a>文艺破解</h1><ul><li>直接访问<a href="http://192.168.1.1/loginUser.htm?username=CUAdmin&password=CUAdmin">http://192.168.1.1/loginUser.htm?username=CUAdmin&password=CUAdmin</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;新装联通宽带一条,300M&lt;br&gt;送了一台KD-YUN-811G的光猫,也不知道是什么牌子的&lt;br&gt;想要自己改桥接模式,&lt;br&gt;百度搜索一番后,找到了方法&lt;br&gt;记录一下过程&lt;/p&gt;
&lt;h1 id=&quot;此方法同样适用于&quot;&gt;&lt;a href=&quot;#此方法同样适用于&quot; class=&quot;headerlink&quot; title=&quot;此方法同样适用于&quot;&gt;&lt;/a&gt;此方法同样适用于&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;TEWA-800E&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;二逼破解&quot;&gt;&lt;a href=&quot;#二逼破解&quot; class=&quot;headerlink&quot; title=&quot;二逼破解&quot;&gt;&lt;/a&gt;二逼破解&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;进入光猫登录界面&lt;br&gt;&lt;img data-src=&quot;https://up.sowevo.com/img/20190724214706.png&quot; alt=&quot;登录界面&quot;&gt;&lt;/li&gt;
&lt;li&gt;F12进入开发者工具,在Elements中搜索user_name找到这里</summary>
    
    
    
    <category term="折腾" scheme="https://sowevo.com/categories/%E6%8A%98%E8%85%BE/"/>
    
    
    <category term="网络" scheme="https://sowevo.com/tags/%E7%BD%91%E7%BB%9C/"/>
    
  </entry>
  
  <entry>
    <title>centos7安装python3</title>
    <link href="https://sowevo.com/centos7%E5%AE%89%E8%A3%85python3/"/>
    <id>https://sowevo.com/centos7%E5%AE%89%E8%A3%85python3/</id>
    <published>2018-09-16T10:48:01.000Z</published>
    <updated>2018-09-16T10:48:01.000Z</updated>
    
    <content type="html"><![CDATA[<p>centos现在默认的python还是2.x版本的,没事总要给他换个3.x版本</p><h1 id="安装安装python3可能使用相关软件"><a href="#安装安装python3可能使用相关软件" class="headerlink" title="安装安装python3可能使用相关软件"></a>安装安装python3可能使用相关软件</h1><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><span class="line">yum groupinstall <span class="string">&#x27;Development Tools&#x27;</span></span><br><span class="line">yum install -y ncurses-libs zlib-devel mysql-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel gcc</span><br></pre></td></tr></table></figure><h1 id="安装安装python3"><a href="#安装安装python3" class="headerlink" title="安装安装python3"></a>安装安装python3</h1><ul><li><p><a href="https://www.python.org/">python官网</a>下载安装包</p></li><li><p>下载最新版源码，使用make altinstall，如果使用make install，在系统中将会有两个不同版本的Python在&#x2F;usr&#x2F;bin&#x2F;目录中。这将会导致很多问题，而且不好处理。</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">此处以3.6.5为例</span></span><br><span class="line">wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz</span><br><span class="line">tar -xzvf Python-3.6.5.tgz -C  /tmp</span><br><span class="line">cd  /tmp/Python-3.6.5/</span><br><span class="line">./configure --prefix=/usr/local</span><br><span class="line">make</span><br><span class="line">make altinstall</span><br></pre></td></tr></table></figure></li><li><p>更改&#x2F;usr&#x2F;bin&#x2F;python链接,如果有pip也给更改了</p><figure class="highlight shell"><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><span class="line">cd /usr/bin</span><br><span class="line">mv  python python.backup</span><br><span class="line">ln -s /usr/local/bin/python3.6 /usr/bin/python</span><br><span class="line">ln -s /usr/local/bin/python3.6 /usr/bin/python3</span><br><span class="line">mv  pip pip.backup</span><br><span class="line">ln -s /usr/local/bin/pip3.6 /usr/bin/pip</span><br><span class="line">ln -s /usr/local/bin/pip3.6 /usr/bin/pip3</span><br></pre></td></tr></table></figure></li><li><p>更改yum脚本的python依赖</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cd /usr/bin</span><br><span class="line">ls yum*</span><br></pre></td></tr></table></figure></li><li><p>修改上面命令列出的文件更改以上文件头</p><figure class="highlight d"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/usr/bin/python 改为 #!/usr/bin/python2</span></span><br></pre></td></tr></table></figure></li><li><p>修改gnome-tweak-tool配置文件(如果有的话)</p><figure class="highlight d"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">vim /usr/bin/gnome-tweak-tool</span><br><span class="line"><span class="meta">#!/usr/bin/python 改为 #!/usr/bin/python2</span></span><br></pre></td></tr></table></figure></li><li><p>修改urlgrabber配置文件(如果有的话)</p><figure class="highlight d"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">vim /usr/libexec/urlgrabber-ext-down</span><br><span class="line"><span class="meta">#!/usr/bin/python 改为 #!/usr/bin/python2</span></span><br></pre></td></tr></table></figure></li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;centos现在默认的python还是2.x版本的,没事总要给他换个3.x版本&lt;/p&gt;
&lt;h1 id=&quot;安装安装python3可能使用相关软件&quot;&gt;&lt;a href=&quot;#安装安装python3可能使用相关软件&quot; class=&quot;headerlink&quot; title=&quot;安装安装pyt</summary>
      
    
    
    
    
    <category term="linux" scheme="https://sowevo.com/tags/linux/"/>
    
  </entry>
  
  <entry>
    <title>小胖鹅再见了，我的青春再见了！🐧</title>
    <link href="https://sowevo.com/%E5%B0%8F%E8%83%96%E9%B9%85%E5%86%8D%E8%A7%81%E4%BA%86%EF%BC%8C%E6%88%91%E7%9A%84%E9%9D%92%E6%98%A5%E5%86%8D%E8%A7%81%E4%BA%86%EF%BC%81/"/>
    <id>https://sowevo.com/%E5%B0%8F%E8%83%96%E9%B9%85%E5%86%8D%E8%A7%81%E4%BA%86%EF%BC%8C%E6%88%91%E7%9A%84%E9%9D%92%E6%98%A5%E5%86%8D%E8%A7%81%E4%BA%86%EF%BC%81/</id>
    <published>2018-09-15T00:56:42.000Z</published>
    <updated>2018-09-15T00:56:42.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="2018年6月29日，腾讯在官方论坛发布QQ宠物即将停运的公告。"><a href="#2018年6月29日，腾讯在官方论坛发布QQ宠物即将停运的公告。" class="headerlink" title="2018年6月29日，腾讯在官方论坛发布QQ宠物即将停运的公告。"></a>2018年6月29日，腾讯在官方论坛发布QQ宠物即将停运的公告。</h2><ul><li>2005年6月,腾讯发布了一款桌面虚拟宠物养成游戏──QQ宠物</li><li>同年,我第一次接触计算机(去网吧😅),注册了我的第一个QQ账号</li><li>2008年,家中购置了一台计算机,我开始第一次遇见QQ宠物</li></ul><p>从2008年到现在,期间一直断断续续的玩这个游戏,逐渐成为了有百万元宝的大富鹅,研究生毕业的文化鹅,去过世界每一个角落的探险鹅.</p><p>虽然依依不舍，但是QQ宠物停运是无法阻拦的事</p><p>可怜的小胖鹅开心的吃着宵夜,也许他永远不会知道这是他吃的最后的一顿</p><p><img data-src="https://up.sowevo.com/history/5b9bf26a345c8.png" alt="20180915013625.png"></p><span id="more"></span><p>吃饱喝足</p><p>永别了~~</p><p>贴两张照片~</p><p><img data-src="https://up.sowevo.com/history/5b9bf3122b02b.png" alt="QQ截图20180914221234.png"><br><img data-src="https://up.sowevo.com/history/5b9bf33516fa4.png" alt="QQ截图20180914221324.png"></p>]]></content>
    
    
    <summary type="html">&lt;h2 id=&quot;2018年6月29日，腾讯在官方论坛发布QQ宠物即将停运的公告。&quot;&gt;&lt;a href=&quot;#2018年6月29日，腾讯在官方论坛发布QQ宠物即将停运的公告。&quot; class=&quot;headerlink&quot; title=&quot;2018年6月29日，腾讯在官方论坛发布QQ宠物即将停运的公告。&quot;&gt;&lt;/a&gt;2018年6月29日，腾讯在官方论坛发布QQ宠物即将停运的公告。&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;2005年6月,腾讯发布了一款桌面虚拟宠物养成游戏──QQ宠物&lt;/li&gt;
&lt;li&gt;同年,我第一次接触计算机(去网吧😅),注册了我的第一个QQ账号&lt;/li&gt;
&lt;li&gt;2008年,家中购置了一台计算机,我开始第一次遇见QQ宠物&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;从2008年到现在,期间一直断断续续的玩这个游戏,逐渐成为了有百万元宝的大富鹅,研究生毕业的文化鹅,去过世界每一个角落的探险鹅.&lt;/p&gt;
&lt;p&gt;虽然依依不舍，但是QQ宠物停运是无法阻拦的事&lt;/p&gt;
&lt;p&gt;可怜的小胖鹅开心的吃着宵夜,也许他永远不会知道这是他吃的最后的一顿&lt;/p&gt;
&lt;p&gt;&lt;img data-src=&quot;https://up.sowevo.com/history/5b9bf26a345c8.png&quot; alt=&quot;20180915013625.png&quot;&gt;&lt;/p&gt;</summary>
    
    
    
    
    <category term="随笔" scheme="https://sowevo.com/tags/%E9%9A%8F%E7%AC%94/"/>
    
  </entry>
  
  <entry>
    <title>迁移到Hexo了</title>
    <link href="https://sowevo.com/%E8%BF%81%E7%A7%BB%E5%88%B0Hexo%E4%BA%86/"/>
    <id>https://sowevo.com/%E8%BF%81%E7%A7%BB%E5%88%B0Hexo%E4%BA%86/</id>
    <published>2018-09-13T19:17:58.000Z</published>
    <updated>2018-09-13T19:17:58.000Z</updated>
    
    <content type="html"><![CDATA[<p><img data-src="https://up.sowevo.com/history/5b9b3b06d269f.png" alt="2"></p><p>闲来无事,把博客从WordPress迁移到了Hexo</p><p>WordPress对Markdown支持不太好,又得要个php服务器支持,费事~~~</p><p>Hexo可以直接是用静态页面管理,还是挺简单的</p><p>最后,大家一起来</p><h1 id="Hello-World"><a href="#Hello-World" class="headerlink" title="Hello World!"></a>Hello World!</h1>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img data-src=&quot;https://up.sowevo.com/history/5b9b3b06d269f.png&quot; alt=&quot;2&quot;&gt;&lt;/p&gt;
&lt;p&gt;闲来无事,把博客从WordPress迁移到了Hexo&lt;/p&gt;
&lt;p&gt;WordPress对Markdown支持不太好</summary>
      
    
    
    
    <category term="网站" scheme="https://sowevo.com/categories/%E7%BD%91%E7%AB%99/"/>
    
    
  </entry>
  
  <entry>
    <title>GIT命令记录</title>
    <link href="https://sowevo.com/GIT%E5%91%BD%E4%BB%A4%E8%AE%B0%E5%BD%95/"/>
    <id>https://sowevo.com/GIT%E5%91%BD%E4%BB%A4%E8%AE%B0%E5%BD%95/</id>
    <published>2018-09-13T19:15:16.000Z</published>
    <updated>2021-02-05T15:57:53.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Git合并"><a href="#Git合并" class="headerlink" title="Git合并"></a>Git合并</h1><figure class="highlight shell"><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><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">确保来源分支代码最新</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git checkout master</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git pull</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">确保目标分支代码最新</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git checkout QC_1916</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git pull</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">在目标分支上执行操作,禁止快进式合并</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git merge --no-f origin/master</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">如果有冲突</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git merge --no-f origin/master</span></span><br><span class="line">Auto-merging index.html</span><br><span class="line">CONFLICT (content): Merge conflict in Devmngr/app/BP/system/BusCityInfoBP.java</span><br><span class="line">Automatic merge failed; fix conflicts and then commit the result.</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">开始解决冲突</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看冲突状态</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git status</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">开始处理</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git mergetool</span></span><br><span class="line"></span><br><span class="line">This message is displayed because &#x27;merge.tool&#x27; is not configured.</span><br><span class="line">See &#x27;git mergetool --tool-help&#x27; or &#x27;git help config&#x27; for more details.</span><br><span class="line">&#x27;git mergetool&#x27; will now attempt to use one of the following tools:</span><br><span class="line">opendiff kdiff3 tkdiff xxdiff meld tortoisemerge gvimdiff diffuse diffmerge ecmerge p4merge araxis bc codecompare emerge vimdiff</span><br><span class="line">Merging:</span><br><span class="line">Devmngr/app/BP/system/BusCityInfoBP.java</span><br><span class="line"></span><br><span class="line">Normal merge conflict for &#x27;Devmngr/app/BP/system/BusCityInfoBP.java&#x27;:</span><br><span class="line">  &#123;local&#125;: modified file</span><br><span class="line">  &#123;remote&#125;: modified file</span><br><span class="line">Hit return to start merge resolution tool (tortoisemerge):</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">输入回车用默认的合并工具</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">在工具中解决冲突</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">在次查看状态确认已解决</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git status</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">完成合并提交</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git commit</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">提交到远端</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git push</span></span><br></pre></td></tr></table></figure><span id="more"></span><h1 id="使用Beyond-Compare作为对比工具"><a href="#使用Beyond-Compare作为对比工具" class="headerlink" title="使用Beyond Compare作为对比工具"></a>使用Beyond Compare作为对比工具</h1><p>MAC的话要先安装命令行工具</p><p><img data-src="https://up.sowevo.com/img/20201203152302.png" alt="MAC的话要先安装命令行工具"></p><figure class="highlight ini"><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># Windows需要修改.gitconfig文件 加入如下配置</span></span><br><span class="line"><span class="section">[diff]</span></span><br><span class="line"><span class="attr">tool</span> = bc4</span><br><span class="line"><span class="section">[difftool &quot;bc4&quot;]</span></span><br><span class="line"><span class="attr">cmd</span> = \<span class="string">&quot;D:/Beyond Compare/BCompare.exe\&quot; \&quot;$LOCAL\&quot; \&quot;$REMOTE\&quot;</span></span><br><span class="line"><span class="string">[merge]</span></span><br><span class="line"><span class="string">tool = bc4</span></span><br><span class="line"><span class="string">[mergetool &quot;</span>bc4<span class="string">&quot;]</span></span><br><span class="line"><span class="string">cmd = \&quot;D:/Beyond Compare/BCompare.exe\&quot; \&quot;$LOCAL\&quot; \&quot;$REMOTE\&quot; \&quot;$BASE\&quot; \&quot;$MERGED\&quot;</span></span><br><span class="line"><span class="string">trustExitCode = true</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"># MAC user目录下的.gitconfig</span></span><br><span class="line"><span class="string">[diff]</span></span><br><span class="line"><span class="string">        tool = bcomp</span></span><br><span class="line"><span class="string">[difftool &quot;</span>bcomp<span class="string">&quot;]</span></span><br><span class="line"><span class="string">        cmd = \&quot;/usr/local/bin/bcomp\&quot; \&quot;$LOCAL\&quot; \&quot;$REMOTE\&quot;</span></span><br><span class="line"><span class="string">[difftool]</span></span><br><span class="line"><span class="string">        prompt = false</span></span><br><span class="line"><span class="string">[merge]</span></span><br><span class="line"><span class="string">        tool = bcomp</span></span><br><span class="line"><span class="string">[mergetool]</span></span><br><span class="line"><span class="string">        prompt = false</span></span><br><span class="line"><span class="string">[mergetool &quot;</span>bcomp<span class="string">&quot;]</span></span><br><span class="line"><span class="string">        cmd = \&quot;/usr/local/bin/bcomp\&quot; \&quot;$LOCAL\&quot; \&quot;$REMOTE\&quot; \&quot;$BASE\&quot; \&quot;$MERGED\&quot;</span></span><br></pre></td></tr></table></figure><h1 id="删除分支"><a href="#删除分支" class="headerlink" title="删除分支"></a>删除分支</h1><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看本地分支</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git branch</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">删除本地分支</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git branch -d &lt;BranchName&gt;</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看远端分支</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git branch -a</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">删除远端分支</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git push origin --delete &lt;BranchName&gt;</span></span><br></pre></td></tr></table></figure><h1 id="获取两个分支的差异文件"><a href="#获取两个分支的差异文件" class="headerlink" title="获取两个分支的差异文件"></a>获取两个分支的差异文件</h1><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">比较YD2007,online两个分支的差异文件的列表,记录到文件</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git diff YD2007 QC_online --<span class="built_in">stat</span> --stat-name-width=1000 --stat-graph-width=-10 &gt; 123.txt</span></span><br></pre></td></tr></table></figure><h1 id="设置用户名密码"><a href="#设置用户名密码" class="headerlink" title="设置用户名密码"></a>设置用户名密码</h1><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">设置用户名密码</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git config --global user.name sowevo</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git config --global user.email i@sowevo.com</span></span><br></pre></td></tr></table></figure><h1 id="快速拉取最新代码"><a href="#快速拉取最新代码" class="headerlink" title="快速拉取最新代码"></a>快速拉取最新代码</h1><ul><li><p>通过<code>git remote -v</code>查看是否有源头仓库的别名和地址。</p><p>例如这里origin就是你自己的仓库，upstream是你fork的源头仓库。</p><figure class="highlight shell"><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><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git remote -v</span></span><br><span class="line">origin  https://github.com/JunzhouLiu/cxmooc-tools.git (fetch)</span><br><span class="line">origin  https://github.com/JunzhouLiu/cxmooc-tools.git (push)</span><br><span class="line">upstream        https://github.com/CodFrm/cxmooc-tools.git (fetch)</span><br><span class="line">upstream        https://github.com/CodFrm/cxmooc-tools.git (push)</span><br></pre></td></tr></table></figure></li><li><p>fork仓库后，将你的仓库拉到本地，如果没有源头仓库，则添加源头仓库</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git remote add upstream https://github.com/JunzhouLiu/BILIBILI-HELPER.git</span></span><br></pre></td></tr></table></figure></li><li><p>更新上游仓库main分支的代码（pull操作实际上是 <code>fetch+merge</code>）</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git pull upstream main   <span class="comment"># 分支名,视具体情况决定 可能是master或者其他</span></span></span><br></pre></td></tr></table></figure></li><li><p>将从源头仓库更新后的代码推送到你自己的github仓库</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git push origin main <span class="comment"># 分支名,视具体情况决定 可能是master或者其他</span></span></span><br></pre></td></tr></table></figure></li><li><p>这样你就能快速的从主仓库拉取最新的代码，并更新到你自己的仓库里了。</p></li></ul><h1 id="Git下载某一个commit提交的文件"><a href="#Git下载某一个commit提交的文件" class="headerlink" title="Git下载某一个commit提交的文件"></a>Git下载某一个commit提交的文件</h1><figure class="highlight shell"><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><span class="line"><span class="meta prompt_"># </span><span class="language-bash">先比较出来需要的文件</span>   </span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">commit-id^ 表示commit的上一个版本</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">并把文件名写入sparse-checkout</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git diff --name-only &lt;commit-id&gt;^ &lt;commit-id&gt; &gt;.git/info/sparse-checkout</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">打开稀疏检出</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git config core.sparseCheckout <span class="literal">true</span></span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git checkout</span></span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;Git合并&quot;&gt;&lt;a href=&quot;#Git合并&quot; class=&quot;headerlink&quot; title=&quot;Git合并&quot;&gt;&lt;/a&gt;Git合并&lt;/h1&gt;&lt;figure class=&quot;highlight shell&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;45&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;# &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;确保来源分支代码最新&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;git checkout master&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;git pull&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;# &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;确保目标分支代码最新&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;git checkout QC_1916&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;git pull&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;# &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;在目标分支上执行操作,禁止快进式合并&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;git merge --no-f origin/master&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;# &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;如果有冲突&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;git merge --no-f origin/master&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;Auto-merging index.html&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;CONFLICT (content): Merge conflict in Devmngr/app/BP/system/BusCityInfoBP.java&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;Automatic merge failed; fix conflicts and then commit the result.&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;# &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;开始解决冲突&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;# &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;查看冲突状态&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;git status&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;# &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;开始处理&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;git mergetool&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;This message is displayed because &amp;#x27;merge.tool&amp;#x27; is not configured.&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;See &amp;#x27;git mergetool --tool-help&amp;#x27; or &amp;#x27;git help config&amp;#x27; for more details.&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&amp;#x27;git mergetool&amp;#x27; will now attempt to use one of the following tools:&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;opendiff kdiff3 tkdiff xxdiff meld tortoisemerge gvimdiff diffuse diffmerge ecmerge p4merge araxis bc codecompare emerge vimdiff&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;Merging:&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;Devmngr/app/BP/system/BusCityInfoBP.java&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;Normal merge conflict for &amp;#x27;Devmngr/app/BP/system/BusCityInfoBP.java&amp;#x27;:&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &amp;#123;local&amp;#125;: modified file&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &amp;#123;remote&amp;#125;: modified file&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;Hit return to start merge resolution tool (tortoisemerge):&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;# &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;输入回车用默认的合并工具&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;# &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;在工具中解决冲突&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;# &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;在次查看状态确认已解决&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;git status&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;# &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;完成合并提交&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;git commit&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;# &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;提交到远端&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;git push&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;</summary>
    
    
    
    
    <category term="linux" scheme="https://sowevo.com/tags/linux/"/>
    
    <category term="git" scheme="https://sowevo.com/tags/git/"/>
    
  </entry>
  
</feed>
