<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Docker - tag - 沐木</title><link>https://oldletter.cn/tags/docker/</link><description>Docker - tag - 沐木</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Wed, 20 Aug 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://oldletter.cn/tags/docker/" rel="self" type="application/rss+xml"/><item><title>信创实战：Dockerfile 信创基础镜像构建</title><link>https://oldletter.cn/posts/xinchuang-02-dockerfile/</link><pubDate>Sat, 15 Feb 2025 00:00:00 +0000</pubDate><author>mumu</author><guid>https://oldletter.cn/posts/xinchuang-02-dockerfile/</guid><description><![CDATA[<blockquote>
<p>系列：信创国产化适配 | 作者：lin | 日期：2026-05-15</p></blockquote>
<hr>
<h2 id="一背景与问题">一、背景与问题</h2>
<h3 id="11-为什么信创环境需要自定义-docker-镜像">1.1 为什么信创环境需要自定义 Docker 镜像</h3>
<p>在信创国产化落地过程中，Docker 容器化部署是标配。但直接使用官方镜像会遇到以下问题：</p>
<ol>
<li><strong>架构不匹配</strong>：官方 Docker Hub 上的 OpenJDK 镜像主要提供 <code>amd64</code> 和 <code>aarch64</code>，缺少申威 <code>sw64</code>、龙芯 <code>loongarch64</code> 等国产架构</li>
<li><strong>OS 不兼容</strong>：信创环境通常要求使用国产操作系统（麒麟、统信），而官方镜像基于 Debian/Ubuntu</li>
<li><strong>安全合规</strong>：信创项目通常要求使用经过安全审计的基础镜像，不能直接拉取公网镜像</li>
<li><strong>定制需求</strong>：需要预装特定工具、配置国内镜像源、设置时区和 Locale 等</li>
</ol>
<h3 id="12-基础镜像选型对比">1.2 基础镜像选型对比</h3>
<table>
  <thead>
      <tr>
          <th>镜像</th>
          <th>体积</th>
          <th>包管理</th>
          <th>国产 CPU 支持</th>
          <th>适用场景</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>Alpine 3.20</strong></td>
          <td>~5MB</td>
          <td>apk</td>
          <td>仅 x86/arm64（申威/龙芯需基于国产OS）</td>
          <td>追求极致精简</td>
      </tr>
      <tr>
          <td><strong>Ubuntu 22.04</strong></td>
          <td>~77MB</td>
          <td>apt</td>
          <td>较好</td>
          <td>需要 glibc 环境</td>
      </tr>
      <tr>
          <td><strong>麒麟 V10</strong></td>
          <td>~200MB</td>
          <td>yum/dnf</td>
          <td>原生支持</td>
          <td>信创验收要求</td>
      </tr>
      <tr>
          <td><strong>统信 UOS</strong></td>
          <td>~200MB</td>
          <td>apt</td>
          <td>原生支持</td>
          <td>信创验收要求</td>
      </tr>
      <tr>
          <td><strong>Amazon Corretto</strong></td>
          <td>基于 Alpine</td>
          <td>apk</td>
          <td>官方多架构</td>
          <td>生产推荐</td>
      </tr>
  </tbody>
</table>
<div class="details admonition tip open">
    <div class="details-summary admonition-title">
        <i class="icon far fa-lightbulb" aria-hidden="true"></i>镜像选型建议<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content"><strong>鲲鹏 ARM64</strong>：直接使用 Amazon Corretto 官方多架构镜像。<strong>申威 SW64 / 龙芯 LoongArch</strong>：Alpine 官方不支持这两种架构，必须基于国产 OS（龙芯开源系统、统信 UOS、麒麟 V10 等）自行构建基础镜像。<strong>信创验收场景</strong>：基于麒麟/统信构建，满足安全审查要求。所有国产 CPU 环境都建议提前规划内部镜像仓库。</div>
    </div>
</div>
<hr>
<h2 id="二amazon-corretto-8-jdk-镜像构建alpine-320">二、Amazon Corretto 8 JDK 镜像构建（Alpine 3.20）</h2>
<h3 id="21-完整-dockerfile">2.1 完整 Dockerfile</h3>
<div class="code-block code-line-numbers" style="counter-reset: code-block 0">
    <div class="code-header language-dockerfile">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title=""><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-dockerfile" data-lang="dockerfile"><span class="line"><span class="cl"><span class="c"># ============================================================</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># 信创基础镜像：Amazon Corretto 8 JDK (Alpine 3.20)</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># 支持架构：x86_64, aarch64（鲲鹏）</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># 适用场景：Java 微服务基础运行环境</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># ============================================================</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="k">FROM</span><span class="s"> alpine:3.20</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># ============================================================</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># 镜像元信息</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># ============================================================</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="k">LABEL</span> <span class="nv">maintainer</span><span class="o">=</span><span class="s2">&#34;lin&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>      <span class="nv">description</span><span class="o">=</span><span class="s2">&#34;Amazon Corretto 8 JDK for xinchuang&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>      <span class="nv">version</span><span class="o">=</span><span class="s2">&#34;8u422&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>      architecture.multiarch<span class="o">=</span><span class="s2">&#34;true&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># ============================================================</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># 环境变量</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># ============================================================</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># Corretto 版本（可通过构建参数覆盖）</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="k">ARG</span> <span class="nv">CORRETTO_VERSION</span><span class="o">=</span><span class="m">8</span>.422.05.1<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="k">ARG</span> <span class="nv">CORRETTO_SHA256_AMD64</span><span class="o">=</span>a7b7e2f8c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0
</span></span><span class="line"><span class="cl"><span class="k">ARG</span> <span class="nv">CORRETTO_SHA256_AARCH64</span><span class="o">=</span>b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">ENV</span> <span class="nv">JAVA_HOME</span><span class="o">=</span>/usr/lib/jvm/java-1.8.0-amazon-corretto <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="nv">PATH</span><span class="o">=</span><span class="s2">&#34;/usr/lib/jvm/java-1.8.0-amazon-corretto/bin:</span><span class="si">${</span><span class="nv">PATH</span><span class="si">}</span><span class="s2">&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="nv">LANG</span><span class="o">=</span>en_US.UTF-8 <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="nv">LC_ALL</span><span class="o">=</span>en_US.UTF-8 <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="nv">TZ</span><span class="o">=</span>Asia/Shanghai <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="c1"># JVM 默认参数（可通过环境变量覆盖）</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span>    <span class="nv">JAVA_OPTS</span><span class="o">=</span><span class="s2">&#34;-XX:+UseG1GC -XX:MaxGCPauseMillis=200 -Djava.security.egd=file:/dev/./urandom&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># ============================================================</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># 安装基础依赖 + 配置国内镜像源</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># ============================================================</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># 使用阿里云镜像源加速（信创环境通常无法直接访问 dl-cdn.alpinelinux.org）</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="k">RUN</span> sed -i <span class="s1">&#39;s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g&#39;</span> /etc/apk/repositories <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    apk add --no-cache <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        bash <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        curl <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        wget <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        tzdata <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        ca-certificates <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        fontconfig <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        ttf-dejavu <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        busybox-extras <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        procps <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        gzip <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        tar <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        zip <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        unzip <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="o">&amp;&amp;</span> rm -rf /var/cache/apk/*<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># ============================================================</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># 时区配置</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># ============================================================</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="k">RUN</span> ln -sf /usr/share/zoneinfo/<span class="si">${</span><span class="nv">TZ</span><span class="si">}</span> /etc/localtime <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="nb">echo</span> <span class="s2">&#34;</span><span class="si">${</span><span class="nv">TZ</span><span class="si">}</span><span class="s2">&#34;</span> &gt; /etc/timezone<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># ============================================================</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># Locale 配置</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># ============================================================</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="k">ENV</span> <span class="nv">LANG</span><span class="o">=</span>en_US.UTF-8 <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="nv">LANGUAGE</span><span class="o">=</span>en_US:en <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="nv">LC_ALL</span><span class="o">=</span>en_US.UTF-8<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># ============================================================</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># 安装 Amazon Corretto 8 JDK</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># ============================================================</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="k">RUN</span> <span class="nv">ARCH</span><span class="o">=</span><span class="k">$(</span>uname -m<span class="k">)</span> <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="k">case</span> <span class="s2">&#34;</span><span class="si">${</span><span class="nv">ARCH</span><span class="si">}</span><span class="s2">&#34;</span> in <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        x86_64<span class="o">)</span>  <span class="nv">CORRETTO_ARCH</span><span class="o">=</span><span class="s2">&#34;x64&#34;</span> <span class="p">;;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        aarch64<span class="o">)</span> <span class="nv">CORRETTO_ARCH</span><span class="o">=</span><span class="s2">&#34;aarch64&#34;</span> <span class="p">;;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        *<span class="o">)</span>       <span class="nb">echo</span> <span class="s2">&#34;Unsupported architecture: </span><span class="si">${</span><span class="nv">ARCH</span><span class="si">}</span><span class="s2">&#34;</span> <span class="o">&amp;&amp;</span> <span class="nb">exit</span> <span class="m">1</span> <span class="p">;;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="k">esac</span> <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    wget -q -O /tmp/corretto.tar.gz <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        <span class="s2">&#34;https://corretto.aws/downloads/latest/amazon-corretto-</span><span class="si">${</span><span class="nv">CORRETTO_VERSION</span><span class="si">}</span><span class="s2">-linux-</span><span class="si">${</span><span class="nv">CORRETTO_ARCH</span><span class="si">}</span><span class="s2">-jdk.tar.gz&#34;</span> <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    mkdir -p /usr/lib/jvm <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    tar -xzf /tmp/corretto.tar.gz -C /usr/lib/jvm <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    ln -sf /usr/lib/jvm/amazon-corretto-<span class="si">${</span><span class="nv">CORRETTO_VERSION</span><span class="si">}</span>-linux-<span class="si">${</span><span class="nv">CORRETTO_ARCH</span><span class="si">}</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>           /usr/lib/jvm/java-1.8.0-amazon-corretto <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    rm -f /tmp/corretto.tar.gz <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    java -version<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># ============================================================</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># 内置健康检查脚本：java-info</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># ============================================================</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="k">RUN</span> cat &gt; /usr/local/bin/java-info &lt;&lt; <span class="s1">&#39;SCRIPT&#39;</span> <span class="o">&amp;&amp;</span> chmod +x /usr/local/bin/java-info<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c">#!/bin/bash</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="nb">echo</span> <span class="s2">&#34;=========================================&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="nb">echo</span> <span class="s2">&#34;  Java Environment Info&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="nb">echo</span> <span class="s2">&#34;=========================================&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="nb">echo</span> <span class="s2">&#34;&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="nb">echo</span> <span class="s2">&#34;📦 JDK Version:&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span>java -version 2&gt;<span class="p">&amp;</span><span class="m">1</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="nb">echo</span> <span class="s2">&#34;&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="nb">echo</span> <span class="s2">&#34;📁 JAVA_HOME: </span><span class="si">${</span><span class="nv">JAVA_HOME</span><span class="si">}</span><span class="s2">&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="nb">echo</span> <span class="s2">&#34;🏗️  Architecture: </span><span class="k">$(</span>uname -m<span class="k">)</span><span class="s2">&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="nb">echo</span> <span class="s2">&#34;🐧 OS: </span><span class="k">$(</span>cat /etc/os-release 2&gt;/dev/null <span class="p">|</span> grep PRETTY_NAME <span class="p">|</span> cut -d<span class="o">=</span> -f2 <span class="p">|</span> tr -d <span class="s1">&#39;&#34;&#39;</span><span class="k">)</span><span class="s2">&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="nb">echo</span> <span class="s2">&#34;🕐 Timezone: </span><span class="k">$(</span>cat /etc/timezone 2&gt;/dev/null <span class="o">||</span> <span class="nb">echo</span> <span class="s1">&#39;not set&#39;</span><span class="k">)</span><span class="s2">&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="nb">echo</span> <span class="s2">&#34;&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="nb">echo</span> <span class="s2">&#34;💾 Memory:&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span>free -h 2&gt;/dev/null <span class="o">||</span> <span class="nb">echo</span> <span class="s2">&#34;  (free command not available)&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="nb">echo</span> <span class="s2">&#34;&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="nb">echo</span> <span class="s2">&#34;🔧 JVM System Properties (key ones):&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span>java -XshowSettings:all 2&gt;<span class="p">&amp;</span><span class="m">1</span> <span class="p">|</span> grep -E <span class="s2">&#34;(java.home|os.arch|os.name|file.encoding|user.timezone)&#34;</span> <span class="p">|</span> sed <span class="s1">&#39;s/^/  /&#39;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="nb">echo</span> <span class="s2">&#34;&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="nb">echo</span> <span class="s2">&#34;=========================================&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span>SCRIPT<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="k">WORKDIR</span><span class="s"> /app</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="k">CMD</span> <span class="p">[</span><span class="s2">&#34;bash&#34;</span><span class="p">]</span></span></span></code></pre></div></div>
<h3 id="22-构建与使用">2.2 构建与使用</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title=""><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 构建镜像（单架构）</span>
</span></span><span class="line"><span class="cl">docker build -t xinchuang/corretto8-jdk:8u422-alpine3.20 .
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 验证</span>
</span></span><span class="line"><span class="cl">docker run --rm xinchuang/corretto8-jdk:8u422-alpine3.20 java-info</span></span></code></pre></div></div>
<hr>
<h2 id="三docker-buildx-多架构构建">三、Docker Buildx 多架构构建</h2>
<h3 id="31-buildx-基础概念">3.1 Buildx 基础概念</h3>
<p>Docker Buildx 是 Docker 的扩展构建工具，支持一次构建同时生成多架构镜像。在信创场景下，因此可以用一条命令同时构建 x86_64 和 ARM64 的镜像。</p>]]></description></item><item><title>Ubuntu 使用 Docker 部署 GitLab（自定义端口 + 中文版）</title><link>https://oldletter.cn/posts/devops-03-gitlab-docker/</link><pubDate>Sat, 15 Aug 2020 00:00:00 +0000</pubDate><author>mumu</author><guid>https://oldletter.cn/posts/devops-03-gitlab-docker/</guid><description><![CDATA[<h2 id="前言">前言</h2>
<p>自建 GitLab 的理由其实很简单：代码不想放公有云，团队又不想花大价钱买私有化方案。Docker 一把梭，半小时就能跑起来一台属于自己的 GitLab 服务器。</p>
<p>本文记录了我在 Ubuntu 18.04 上用 Docker Compose 部署 GitLab 中文版的完整过程，包括自定义端口映射、初始化配置、备份策略，以及踩过的几个坑。</p>
<h2 id="环境准备">环境准备</h2>
<h3 id="安装-docker">安装 Docker</h3>
<p>如果服务器上还没有 Docker，用官方脚本一键安装：</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title=""><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">curl -fsSL https://get.docker.com <span class="p">|</span> bash
</span></span><span class="line"><span class="cl">sudo usermod -aG docker <span class="nv">$USER</span></span></span></code></pre></div></div>
<p>国内网络不好的话，可以配置镜像加速。编辑 <code>/etc/docker/daemon.json</code>：</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-json">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title=""><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;registry-mirrors&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;https://mirrors.tuna.tsinghua.edu.cn&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;https://docker.mirrors.ustc.edu.cn&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div>
<p>然后重启 Docker：</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title=""><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo systemctl daemon-reload
</span></span><span class="line"><span class="cl">sudo systemctl restart docker</span></span></code></pre></div></div>
<h3 id="安装-docker-compose">安装 Docker Compose</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title=""><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo apt install docker-compose -y</span></span></code></pre></div></div>
<p>验证安装：</p>]]></description></item><item><title>信创项目实战总结：从申威龙芯到数据库三大件与容器化部署</title><link>https://oldletter.cn/posts/xinchuang-05-project-summary/</link><pubDate>Wed, 20 Aug 2025 00:00:00 +0000</pubDate><author>mumu</author><guid>https://oldletter.cn/posts/xinchuang-05-project-summary/</guid><description><![CDATA[<blockquote>
<p>作者：林 | 系列：信创实战 | 适合读者：信创项目实施者、Java 后端/架构师、运维工程师</p></blockquote>
<hr>
<h2 id="一背景为什么要做信创">一、背景：为什么要做信创</h2>
<p>信创（信息技术应用创新）的核心目标是<strong>自主可控</strong>。从芯片到操作系统，从数据库到中间件，逐步替换国外技术栈，降低供应链风险。</p>
<p>一个典型的信创项目涉及：</p>
<ul>
<li><strong>芯片</strong>：申威、龙芯、飞腾、鲲鹏、海光、兆芯</li>
<li><strong>操作系统</strong>：麒麟（银河麒麟/中标麒麟）、统信 UOS、欧拉</li>
<li><strong>数据库</strong>：达梦、人大金仓、神通</li>
<li><strong>中间件</strong>：东方通 TongWeb、宝兰德 BES</li>
<li><strong>办公软件</strong>：WPS、永中 Office</li>
<li><strong>可信计算</strong>：国密算法（SM2/SM3/SM4）、可信平台模块</li>
<li><strong>容器化</strong>：Docker 适配、镜像编译</li>
</ul>
<p>本文是实际项目中的踩坑总结，重点覆盖申威、龙芯、数据库三大件和容器化部署。</p>
<hr>
<h2 id="二国产-cpu-处理器选型">二、国产 CPU 处理器选型</h2>
<h3 id="21-六大国产-cpu-对比">2.1 六大国产 CPU 对比</h3>
<table>
  <thead>
      <tr>
          <th>厂商</th>
          <th>指令集</th>
          <th>代表型号</th>
          <th>定位</th>
          <th>生态成熟度</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>申威</strong></td>
          <td>SW64（自主）</td>
          <td>SW1621、SW3231、HX 系列</td>
          <td>特种/超算/信创</td>
          <td>⭐⭐</td>
      </tr>
      <tr>
          <td><strong>龙芯</strong></td>
          <td>LoongArch（自主）</td>
          <td>3A5000、3C5000、3A6000、3C6000</td>
          <td>桌面/服务器</td>
          <td>⭐⭐⭐</td>
      </tr>
      <tr>
          <td><strong>飞腾</strong></td>
          <td>ARMv8/AArch64（授权）</td>
          <td>FT-2000、S2500</td>
          <td>桌面/服务器</td>
          <td>⭐⭐⭐⭐</td>
      </tr>
      <tr>
          <td><strong>鲲鹏</strong></td>
          <td>ARMv8/AArch64（授权）</td>
          <td>鲲鹏 920</td>
          <td>服务器</td>
          <td>⭐⭐⭐⭐</td>
      </tr>
      <tr>
          <td><strong>海光</strong></td>
          <td>x86（授权）</td>
          <td>海光 7000、海光 5000</td>
          <td>服务器</td>
          <td>⭐⭐⭐⭐⭐</td>
      </tr>
      <tr>
          <td><strong>兆芯</strong></td>
          <td>x86（授权）</td>
          <td>开胜 KH-40000</td>
          <td>桌面/服务器</td>
          <td>⭐⭐⭐⭐</td>
      </tr>
  </tbody>
</table>
<blockquote>
<p>⚠️ 注意：海光和兆芯的 x86 授权有争议（AMD/VIA 授权），严格意义上不算&quot;完全自主&quot;。部分信创项目不接受 x86 路线。</p>]]></description></item></channel></rss>