日本国内ネットワーク環境におけるDockerイメージ取得の高速化手法

コンテナベースのアーキテクチャ導入に伴い、CI/CDパイプラインやデプロイメントプロセスにおけるイメージ取得速度は、開発生産性に直結する重要な要素です。しかし、地理的な制約やネットワーク帯域のボトルネックにより、パブリックレジストリからのデータ取得が不安定化・低速化することがあります。特にレイテンシが高い環境ではビルドタイムアウトやデプロイ遅延を招くため、以下の技術的アプローチによる最適化が推奨されます。

  • レジストリミラーのデーモンレベル構成
  • プロキシレジストリを用いたエンドポイント置換
  • クラウドCIでの事前ビルドと国内レジストリ同期
  • クラスタ内ローカルレジストリの構築
  • オフライン環境向けのアーカイブ移行

レジストリミラーの構成

Dockerデーモンの`registry-mirrors`パラメータを設定することで、デフォルトのグローバルエンドポイントへのリクエストを国内のキャッシュノードへ転送できます。主要な公開ミラーと接続先は以下の通りです。

プロバイダエンドポイントURL対応レジストリ
USTC Mirrorhttps://docker.mirrors.ustc.edu.cnDocker Hub
Azure Chinahttps://dockerhub.azk8s.cnDocker Hub, GCR, Quay
NetEasehttps://hub-mirror.c.163.comDocker Hub
Tencent Cloudhttps://mirror.ccs.tencentyun.comDocker Hub

Linux環境では/etc/docker/daemon.jsonに以下のJSON構造を追記し、systemctl restart dockerを適用します。

{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn"
  ]
}

設定適用後はdocker infoコマンドを実行し、Registry Mirrorsセクションに指定したURLが表示されることを確認してください。Docker Desktopをご利用の場合は、Settings > Docker Engine画面から同様のJSONを編集することでGUI上で構成可能です。

プロキシレジストリへのエンドポイント置換

特定のベースイメージやサードパーティ製ランタイムは、ミラー経由でもスループットが低下する場合があります。この場合、リクエストを国内データセンターにルーティングするプロキシドメインへ直接アクセスするようパスを置換します。例えば、Microsoft Container Registry (mcr.microsoft.com) は、国内向けにmcr.azk8s.cnへマッピングされています。

# 従来のグローバル指定
# docker pull mcr.microsoft.com/dotnet/sdk:8.0-bookworm-slim

# プロキシドメインへ置換して実行
docker pull mcr.azk8s.cn/dotnet/sdk:8.0-bookworm-slim

ビルドコンテキスト内のDockerfileも併せて更新する必要があります。マルチステージビルドのFROMディレクティブを書き換えることで、ネットワーク依存を最小化します。

# 変更前
# FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime-stage

# 変更後
FROM mcr.azk8s.cn/dotnet/aspnet:8.0 AS runtime-stage

CI/CDパイプラインにおける自社レジストリ活用

パッケージマネージャー(apt, yumなど)を用いた依存関係解決は、ネットワーク状況に大きく依存し不安定化しがちです。この課題を回避するには、海外のクラウドビルド環境でイメージを事前に構築し、国内レジストリへ同期するパターンが有効です。GitHub ActionsやGitLab CI上でランタイム環境をビルドし、Alibaba Cloud ACRやTencent Cloud TKEなどの国内エンドポイントへdocker pushします。

構築後は、本番環境のDockerfileで国内レジストリのフルパスを指定するだけで、パッケージインストールフェーズをスキップし、高速なレイヤー取得が可能になります。

# 国内レジストリにプッシュ済みのカスタムランタイムを参照
FROM registry.cn-shanghai.aliyuncs.com/internal-projects/optimized-runtime:1.4.2 AS base-layer

Kubernetesクラスタ向けローカルレジストリの構築

エッジ環境や社内ネットワークにおいて外部帯域が制限されている場合、Kubernetes上にオンプレミスレジストリをデプロイする構成が推奨されます。Sonatype Nexus Repositoryを利用すると、コンテナイメージに加えMaven、npm、PyPIなどのマルチフォーマットアーティファクトを単一インスタンスで管理できます。以下のマニフェストは、Nexus 3をKubernetes上に配備し、ローカルストレージとNodePort経由で公開する設定です。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: local-artifact-hub
  namespace: infra-services
  labels:
    component: registry-proxy
spec:
  replicas: 1
  selector:
    matchLabels:
      component: registry-proxy
  template:
    metadata:
      labels:
        component: registry-proxy
    spec:
      containers:
      - name: nexus-core
        image: sonatype/nexus3:3.68.0
        ports:
        - containerPort: 8081
        - containerPort: 5000
        resources:
          requests:
            memory: "1Gi"
            cpu: "500m"
          limits:
            memory: "6Gi"
            cpu: "4"
        volumeMounts:
        - name: repo-data-vol
          mountPath: /nexus-data
        env:
        - name: INSTALL4J_ADD_VM_PARAMS
          value: "-Xms1g -Xmx6g -XX:MaxDirectMemorySize=2g"
      volumes:
      - name: repo-data-vol
        hostPath:
          path: /srv/nexus-storage
          type: DirectoryOrCreate
---
apiVersion: v1
kind: Service
metadata:
  name: nexus-access-svc
  namespace: infra-services
spec:
  type: NodePort
  selector:
    component: registry-proxy
  ports:
  - name: management-ui
    port: 8081
    targetPort: 8081
    nodePort: 32081
  - name: docker-registry
    port: 5000
    targetPort: 5000
    nodePort: 32500

デプロイ完了後、Nexus管理画面からDockerプロキシリポジトリを有効化し、Dockerデーモンのinsecure-registriesに自ノードのIPを追加することで、クラスタ内ノードからローカルレジストリへ直接アクセス可能になります。

オフライン環境におけるアーカイブ移行

ネットワーク接続が完全に遮断されたエアギャップ環境や、極めて帯域が細い現場では、物理メディアを用いたイメージの搬入が最も確実な手法となります。Docker CLI標準機能であるsaveおよびloadコマンドを組み合わせることで、イメージ全体を単一アーカイブとしてエクスポート/インポートできます。

インターネット接続可能な管理端末上で以下のコマンドを実行し、対象イメージをtar形式で出力します。

docker save -o /mnt/usb/app_runtime_v2.tar registry.example.com/app/runtime:latest

生成されたアーカイブファイルをUSBストレージ等でターゲット環境へ移送後、以下のコマンドでローカルのDockerデーモンにリストアします。ネットワークプロトコルを一切介さず、ストレージのI/O速度のみでイメージを展開できるため、帯域制約が厳しい環境でのデプロイ基盤として有効です。

docker load -i /mnt/usb/app_runtime_v2.tar

タグ: Docker Container Registry Kubernetes Nexus Repository CI/CD Optimization

6月7日 21:36 投稿