📖

Docker Deep Dive - Fifth Editionの読書メモ

に公開

はじめに

本ドキュメントはDocker Deep Dive - Fifth Editionの読書メモです。

名前の通り、Dockerの深掘りをする書籍です。
Dockerの使い方についても記載はありますが、それがどうやって動いているかについて触れている書籍です。まったくの初心者よりも、雰囲気でDockerを使っている時に読むと知識が整理されて有用かと思います。

以下の章をみると、Dockerの裏で動いている物が何かが朧げながら見えてくるかと思います。

  • 5: The Docker Engine
  • 13: Docker Networking
  • 16: Docker security

また、更新日が2025年なのでDockerを解説する書籍のなかでは新しい書籍の一つになります。

なお、Amazonのレビューを見る限り紙媒体はインデックスがないためか、低い評価をつける人が何人かいます(それでも4.5/5)。

各章のまとめ

1: Containers from 30,000 feet

高い視点からコンテナの歴史を見直した章です。
以下の流れで説明がされています。

  • 仮想化前の時代
  • VMwareによる仮想環境の時代
  • コンテナの登場
  • WindowsやMacでのDockerサポート
  • Wasmの動向
  • AI アプリ活用のアプローチ
  • Kubernetes について

「Docker」とコンテナに関わる標準やプロジェクトについて説明した章です。

  • Dockerの2つの意味
    • Docker, Inc.(dotCloud を前身とする企業)
    • Docker プラットフォーム(コンテナを作る・共有する・実行するための仕組み:CLI と Engine)
  • コンテナ関連の標準とプロジェクト

3: Getting Docker

本章は Docker の入手とインストールについて説明します。

  • Docker DesktopはLinux, Mac, Windowsマシンに多彩な機能を備えたDocker環境を提供する。
  • MultipassはLinux、Mac、またはWindowsマシン上にクラウドスタイルのLinux VMを作成し、Linux VM上でDockerのエンジン(サーバー)を動かす。Docker Desktopの一部の機能は使用できません。

なお、Linuxの場合は仮想VMなしでも、Dockerをインストールできます。

4: The big picture

イメージとコンテナの使い方の概要を説明する章です。

  • 操作の視点
    • イメージの取得、コンテナの起動、停止、削除、コンテナ内でのコマンド実行方法
  • 開発者の視点
    • ソースコードの取得、Dockerfileの確認、 イメージ作成、コンテナ起動の流れ

5: The Docker Engine

Dockerエンジンについての説明が行われています。

イメージ図:

     docker cli
         ↑↓
+--------{API}----------+
|     Docker Engine     |
|         ↑↓           |
|      containerd       |
|         ↑↓           |
|         shim          |
|       +-*---*-+       |
|       | runc  |       |
|       +-*-+-*-+       |
|           |           |
|   Running containers  |
+-----------------------+

  • 初期のDockerエンジンの構成と何故変えたか
  • runc
  • containerd
    • コンテナの起動、停止、削除といったライフサイクルイベントを管理する高レベルランタイム
    • 実際に実行させるには低レベルのランタイムが必要。多くの場合はruncとペアになるが、runcを別の低レベルのランタイムに変更することも可能
    • イメージ管理機能も備える
    • https://github.com/containerd/containerd/releases
  • Shim
    • containerdとruncなどの低レベルのランタイムを仲介する。

6: Working with Images

イメージの基礎的な話をしています。

  • 単一のイメージから1つ以上のコンテナを起動できる。
  • 1つ以上の読み取り専用レイヤーを積み重ね、統合ビューとしてイメージを構成する(上位レイヤーが下位を覆い、更新として見える)
  • レイヤー共有によりダウンロードや保存を効率化可能
  • イメージにはタグが複数付与できるが可変。その代わり不変のダイジェストを使用して厳密に指定できる。
  • レジストリ(Docker Hub ほか)に保存・配布され、公式/非公式リポジトリがある。ただし公式にも注意は必要
  • マルチアーキテクチャイメージ:複数のアーキテクチャを1つのタグで隠蔽できる。
  • Docker Hubには公式イメージがあり比較的安全に利用ができる(とはいえ、インターネット経由でソフトウェアをダウンロードする際は常に注意を払うべき)
  • Docker Scoutによる脆弱性スキャン
  • イメージ関連コマンドの紹介
    • docker pull リモートレポジトリからのイメージのダウンロード
    • docker images ローカルリポジトリ内のイメージの一覧
    • docker inspect イメージのメタデータの表示
    • docker manifest inspect イメージのマニフェストリストの確認
    • docker buildx imagetoolsサブコマンドでイメージからマニフェスト関連データをクエリ可能
    • docker scout 脆弱性チェック
    • docker rmi  イメージ削除

7: Working with containers

コンテナの基本的な解説が行われています。

  • コンテナとVMの比較
  • イメージからコンテナを起動する流れの説明
    • コンテナは同じイメージを共有するが、独自のR/Wレイヤーを持つ
    • コンテナに独自の変更ができるようになるがコンテナを消すとR/Wレイヤーは消える
  • コンテナ内のアプリの起動方法
  • 実行中のコンテナに接続する方法
  • docker inspectによるコンテナの詳細情報の取得
  • コンテナの停止、再起動、削除
  • Docker Debug(Pro以上が必要) によるコンテナのデバッグ方法
  • コンテナ関連コマンドの紹介
    • docker run 新しいコンテナを起動するコマンド
    • docker ps 実行中のコンテナの一覧取得。-aで停止中のコンテナも表示
    • docker exec コンテナ内のコマンド実行
    • docker stop コンテナの停止
    • docker restart コンテナの再起動
    • docker rm コンテナの削除
    • docker inspect コンテナに関する詳細情報の取得
    • docker debug コンテナまたはイメージにデバッグシェルをアタッチしてデバッグ用のコマンドを使用できる

8: Containerizing an app

アプリケーションをイメージとしてパッケージ化する(=コンテナ化)の流れを解説する章です。

  • Dockerfileの作成
    • docker initによる作成
    • 作成されたDockerfileの説明
  • アプリケーションのコンテナ化
    • docker buildによるイメージの作成
    • docker inspectによる作成されたイメージの確認
  • Docker Hubにイメージをプッシュする
    • docker tagによるイメージに対するタグの付与
    • docker pushによるリモートへのイメージのpush
  • コンテナでアプリケーションを実行する
    • docker runでコンテナとして起動
  • 詳細の確認
    • docker historyによるイメージに対するコマンドの確認
    • イメージのレイヤー構成がなぜ、そうなっているかの解説
  • マルチステージビルドのサンプル
    • goの事例でコンパイルするステージと、実行ファイルのみを含むステージを分離する
    • これによりコンパイル関連のファイルを最終的にイメージに含む必要がなくなる
  • Buildx、BuildKit, driver, BuildCloud
    • BuildxはDockerのビルドクライアント
    • Build Cloud はクラウド上の BuildKit ビルダーを提供
    • BuildxはDriverを経由して複数のBuildKitにビルドを指示する
    • マルチアーキテクチャビルドはこの機構を利用して、異なるアーキテクチャの環境でアプリをコンテナ化できる
  • 良い習慣
    • ビルドキャッシュを活用する
    • 必須のパッケージのみインストールする

9: Multi-container apps with Compose

Compose(docker compose)によるマルチコンテナの管理についての説明を行う章になります。

  • FigからComposeへの歴史
  • サンプルアプリの説明
  • Composeを使用したアプリのデプロイ
  • Composeを使用したアプリの停止、再起動、削除、ステータス情報

10: Docker and AI

Docker Model Runnerを使用して, ホスト上のGPUを利用してLLMモデルを動作させる解説となっています。
ただ、現時点でモデルのトレーニングはできません。

11: Docker and Wasm

2025年9月時点でベータ機能のWebAssemblyアプリをコンテナ化する機能の説明です。
全体的に記述が荒い印象を受けました。(例:webをみてRustの環境を構築してとか)

また、私の環境では、そもそもWebAssemblyのコンテナ化自体が動作しませんでした。
Docker公式のコマンドでもハングアップしてDocker Desktopの再起動が必要になりましたので本書の手順の問題ではないと思われます。

docker run \
  --runtime=io.containerd.wasmedge.v1 \
  --platform=wasi/wasm \
  secondstate/rust-example-hello

参照

この問題は以下の環境で発生しました。

  • 2 GHz クアッドコアIntel Core i5
  • macOS 15.4.1(24E263)
  • Docker Desktop 4.47.0
    なお、Windows 11環境でも再現しました。

このブログでも同じ事象が発生しているので、私の環境以外でも発生する問題だと考えられます。

12: Docker Swarm

マルチノードの Swarm クラスターをデプロイする方法と、その上でアプリを実行する方法を説明しています。
冒頭にSwarmの人気は低下しており、Kubernetesの方が活気があるとか記載があるので、人によっては読む動機が薄くなる章になります。

実際に実験する場合はDocker DesktopではDockerノードが一つだけになるので、Play with Dockerのクラウドの実験環境を使用するかMultipassを利用する必要があります。

  • Kubernetesと比べてSwarmを選択する理由
  • Swarmの作成
  • Swarmにアプリケーションをデプロイ
  • アプリの管理(スケールアップの例)
  • Swarmの削除
    • ネットワーク/サービスは消すがボリュームは残るので注意
  • Docker Swarmコマンド
    • docker swarm init Swarm の初期化
    • docker stack deploy Swarmアプリをデプロイおよびアップデート
    • docker stack ls すべての Swarm アプリを一覧表示
    • docker stack ps Swarmアプリの詳細情報を提供
    • docker stack services 各アプリケーション サービスに関する情報
    • docker stack rm Swarm アプリを削除

13: Docker Networking

Dockerネットワークの基礎を学ぶ章です。
この章も実際に実験する場合はPlay with Dockerのクラウドの実験環境を使用するかMultipassを利用をおすすめされています。

  • Container Network Model (CNM)は設計仕様であり、Docker ネットワークの基本的な構成要素の概要を示す
    • 以下の3つのブロックで構成される
      • Sandboxes: コンテナのネットワークスタックの設定を保持。
        • コンテナのインターフェイス、ルーティングテーブル、DNS 設定の管理 etc
      • Endpoints: 仮想ネットワークインターフェイス
      • Networks: 互いに通信できるEndpointsのグループ
  • libnetworkは CNMの実装 + コントロールプレーン機能(管理API、組み込みDNSによるサービスディスカバリなど)
  • Driver: 実際のネットワークの実装を提供する。
    • データプレーンの実装(bridge/overlay/macvlan)
  • シングルホストブリッジネットワーク
    • 言葉の意味
      • ネットワークが単一のDockerホストにのみまたがっている
      • レイヤー2スイッチの実装である
    • ネットワーク外部にサービスを公開する場合は、コンテナをホストポートにマッピングする必要
      • ローカル開発や非常に小規模なアプリケーションにのみ適してる
  • macvlanドライバ
    • コンテナを既存の物理ネットワークや VLAN に接続する Docker ネットワークを作成できる
    • ホストの NIC をプロミスキャスモードで動作させる必要があるため、多くの企業ネットワークやパブリッククラウドでは許可されないことが多い

14: Docker overlay networking

Docker Swarmを使って複数のDockerホストを用意して、オーバーレイネットワークを用いて、通信を行うサンプルを構築しています。
その実体は VXLAN(UDP 4789) トンネル+各ノードの VTEP により、下位(underlay)が L3 でも L2 の“同一セグメント”に見せています。

15: Volumes and persistent data

コンテナが消えても保持したいデータをvolumeを使用して永続化する方法について説明しています。
volume作成時に-dオプションを使用してサードパーティ製のドライバを指定して、クラウドストレージサービスやNASなどへのアクセスを提供することも可能です。

16: Docker security

Dockerのセキュリティについて記述している章です。

  • Linuxセキュリティ技術
    • Kernel Namespaces:プロセスツリー、ネットワークスタック、マウント(ファイルシステム)、IPC、ユーザー、UTS などを分離して軽量な隔離を提供(※VMほど強固な境界ではない)。
    • Control Groups: コンテナの CPU/メモリ/ネットワーク/ディスク I/O 消費を制限し、リソース独占(DoS)を防ぐ。
    • Capabilities: root が持っている特権をいくつかのグループに分割し必要な権限のみ付与
    • Mandatory Access Control (AppArmor / SELinux): コンテナに追加のアクセス制御ルールが自動適用され、必要に応じて有効/無効や上書きができる。
    • seccomp:コンテナからホストカーネルへの syscall をフィルタ
  • Dockerセキュリティ技術
    • Swarm security: 参加ノードの 暗号学的ID、相互認証(TLS)、安全な参加トークンなど
    • Docker Scout: 脆弱性チェック
    • Docker Content Trust (DCT): イメージの署名・検証を提供
    • Docker Secrets: swarm モード限定。シークレットはクラスターストアで暗号化保管

Discussion