Docker
Dockerは、コード、ライブラリ、モデルの重みをコンテナイメージにパッケージ化します。コンテナイメージは、ノートPC、GPUサーバー、CIランナー、エッジデバイスで同じように実行できます。
Dockerは、コンテナ内でアプリケーションを構築、共有、実行するためのオープンソースプラットフォームです。コンテナは、コード、ライブラリ、システムパッケージを含む独自のファイルシステムを持つ分離されたプロセスであり、ホストのオペレーティングシステムカーネルを共有します。後にDocker, Inc.へ社名変更するdotCloudが2013年3月にオープンソース化し、コマンドラインツール、レイヤー型イメージ形式、パブリックレジストリによって、Linuxコンテナは開発者にとって日常的なツールになりました。機械学習では、Dockerイメージに正確なPythonバージョン、CUDAライブラリ、PyTorchビルド、モデルの重みを固定できるため、モデルはノートPC、GPUサーバー、継続的インテグレーションランナー、エッジデバイスのいずれでも同じように動作します。
Dockerの仕組み#
Dockerfileには、イメージを構築する手順として、開始点となるベースイメージ、パッケージをインストールするコマンド、コピーするファイル、起動時に実行するコマンドを記述します。各RUN、COPY、ADD命令は読み取り専用レイヤーを追加します。命令または入力ファイルのいずれかが変更されるまで、次回のビルドではキャッシュ済みレイヤーが再利用されます。そのため、早い段階でインストールした依存関係はキャッシュに残り、アプリケーションコードは数秒で再ビルドできます。イメージは、レイヤーの積層とメタデータで構成されます。コンテナは、イメージの上に薄い書き込み可能レイヤーを追加した実行インスタンスです。このレイヤーは、データをマウント済みボリュームに保存しない限り、コンテナとともに削除されます。
dockerコマンドは、バックグラウンドデーモンであるDocker Engineと通信し、各コンテナをcontainerdと低レベルのruncランタイムに引き渡します。これらはLinuxの名前空間を使ってコンテナのプロセス、ネットワーク、ファイルシステムを分離し、cgroupsでCPUとメモリを制限します。イメージは、Docker Hub、GitHub Container Registry、NVIDIA NGC、各クラウドプロバイダー独自のレジストリなどを通じて共有されます。イメージはOpen Container Initiativeの形式に準拠しているため、Podman、containerd、Kubernetesで変更せずに実行できます。
Ultralyticsは、CUDA GPU、CPU、ARM64ボード、NVIDIA Jetsonデバイス、AMD GPUなど、ハードウェアターゲットごとに公式Dockerイメージを公開しています。各イメージには再現可能なビルドのため、Ultralyticsのリリース番号もタグ付けされています。以下で使用する軽量なlatest-pythonイメージには、Python、PyTorch、ultralyticsパッケージ、YOLO26 nanoの重みがすでに含まれているため、プロジェクトのDockerfileには独自のコードだけを追加します。
# Official Ultralytics CPU image with Python, PyTorch, ultralytics, and yolo26n.pt
FROM ultralytics/ultralytics:latest-python
# Install extra dependencies in their own layer, cached until requirements.txt changes
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Copy the application last, so code edits rebuild only this layer
COPY app.py .
# Command every container runs when it starts
CMD ["python", "app.py"]docker build -t yolo-app .は、このファイルと同じ場所にあるファイルをイメージにまとめ、docker run --rm yolo-appはそのイメージからコンテナを起動します。イメージをレジストリにプッシュすれば、ほかのマシンでも同一の環境をプルして実行できます。たとえば、モデルサービング APIや夜間の推論ジョブとして利用できます。
機械学習におけるDocker#
コンテナからGPUへアクセスするには、NVIDIA Container Toolkitを使用します。NVIDIAドライバーはホスト上に置き、イメージにはCUDAのユーザー空間ライブラリのみを含めます。これらのライブラリはドライバーでサポートされている必要があります。LinuxではDocker 28.2以降でCDIがデフォルトで有効になっているため、--device nvidia.com/gpu=allでGPUをCDIデバイスとして要求できます。これにより、ホストでsystemdを再読み込みした際にGPUアクセスを失うことがある旧式の--gpus allフラグと異なり、長時間稼働するコンテナでもGPUアクセスを維持できます。
学習では、ほかに2つの設定が重要です。PyTorchのデータローダーワーカーは、共有メモリ/dev/shmを介してバッチを学習プロセスに渡します。Dockerではこのメモリがデフォルトで64 MBに制限されるため、学習コンテナでは--ipc=hostまたは、より大きな--shm-sizeを指定します。データセットと出力はマウント済みボリュームに保存してください。コンテナ内にチェックポイントを書き込む学習では、コンテナを削除するとチェックポイントも失われます。latestの代わりにリリースタグまたはイメージダイジェストを固定すると、分散学習ジョブやモデルデプロイで、すべてのマシンに同じイメージを使用できます。NVIDIA Triton Inference Serverなどの推論サーバーも、Vertex AIなどのマネージドサービスも、モデルをコンテナイメージとして実行します。
Docker、仮想マシン、Kubernetesの比較#
- 仮想マシン: ハイパーバイザーがハードウェアをエミュレートし、各VMは独自のゲストカーネルを起動します。これによりワークロードをより強力に分離でき、任意のゲストOSを実行できますが、VMごとにOSイメージ全体が必要になり、起動も遅くなります。コンテナはホストのLinuxカーネルを共有するため、macOSおよびWindows上のDocker Desktopでは、軽量なLinux VM内でコンテナを実行します。
- Docker Compose: 推論API、キャッシュ、メトリクスコレクターなど、1台のホスト上で連携して動作する複数のコンテナを定義します。
- Kubernetes: クラスター全体にコンテナをスケジュールし、失敗したコンテナを再起動し、トラフィックに応じてレプリカ数を調整します。Kubernetes 1.24では、Docker Engine用の組み込みアダプターdockershimが削除されたため、クラスターはcontainerdまたはCRI-Oを通じてコンテナを実行します。Dockerでビルドしたイメージも標準のOCIイメージであるため、そのまま実行できます。










