<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="675" viewBox="0 0 1200 675">
  <defs>
    <style>
      .title{font:700 30px sans-serif;fill:#16334e}
      .box{fill:#fff;stroke:#7ea1c9;stroke-width:3;rx:18;ry:18}
      .head{font:700 22px sans-serif;fill:#1c4067}
      .text{font:18px sans-serif;fill:#435b76}
      .line{stroke:#527aa5;stroke-width:4;marker-end:url(#m)}
      .lane{fill:#eef5ff;stroke:#b6c9e0;stroke-width:2;rx:16;ry:16}
    </style>
    <marker id="m" markerWidth="10" markerHeight="10" refX="8" refY="3" orient="auto">
      <path d="M0,0 L9,3 L0,6 Z" fill="#527aa5"/>
    </marker>
  </defs>
  <rect width="1200" height="675" fill="#f5f9fd"/>
  <text x="60" y="70" class="title">Docker Compose 服务、网络与数据卷关系</text>

  <rect x="80" y="130" width="260" height="120" class="box"/>
  <text x="110" y="175" class="head">app 服务</text>
  <text x="110" y="210" class="text">业务 API / Web</text>

  <rect x="470" y="130" width="260" height="120" class="box"/>
  <text x="500" y="175" class="head">db 服务</text>
  <text x="500" y="210" class="text">MySQL / PostgreSQL</text>

  <rect x="860" y="130" width="260" height="120" class="box"/>
  <text x="890" y="175" class="head">cache 服务</text>
  <text x="890" y="210" class="text">Redis / MQ</text>

  <line x1="340" y1="190" x2="470" y2="190" class="line"/>
  <line x1="730" y1="190" x2="860" y2="190" class="line"/>

  <rect x="80" y="320" width="1040" height="250" class="lane"/>
  <text x="110" y="370" class="head">统一网络 backend</text>
  <text x="110" y="415" class="text">服务通过容器名互相访问，不依赖宿主机 IP。</text>
  <text x="110" y="455" class="text">数据库和缓存使用卷持久化，容器重建后数据仍可保留。</text>
  <text x="110" y="495" class="text">Compose 负责定义拓扑，网络和卷负责承载通信与状态。</text>
</svg>