Dockerを体系的に学ぶ:6段階ロードマップ
この記事にはアフィリエイト広告が含まれています。 冒頭まとめ Dockerのエラーを検索して1件ずつ直しているのに、次の日には別のエラーで止まる。この繰り返しから抜けるには、覚える順序を変える必要があります。 Dockerのエラーの多くは、4つの境界のどこかで起きています。ホストとコンテナの境界、イメージとコンテナの境界、コンテナ間の境界、そして書き込み可能レイヤーと永続領域の境界です。エラー文はこの境界のどれで止まったかを示していますが、境界の存在を知らないと文言が読めません。 したがって学ぶ順序は、コマンドの数ではなく境界の数で決まります。この記事では、コンテナとイメージ、Dockerfileとビルド、ポートとネットワーク、ボリューム、Compose、ログとトラブルシューティングの6段階に分けて示します。 各段階には「次へ進む目安」を置きました。目安を満たさないまま先へ進むと、後の段階のエラーが前の段階の理解不足として現れます。急がずに順に進めてください。 エラーを個別に直すだけでは理解しにくい理由 検索で見つかる対処は、多くの場合その環境で有効だった手順です。なぜ有効だったかは書かれていないことがあります。 たとえば docker compose down -v を実行すれば起動時のエラーが消える、という手順があったとします。これはボリュームを削除して初期化し直す操作なので、確かにエラーは消えます。しかし同時にデータも消えます。ボリュームが何であるかを知らないまま実行すると、次は「データが消えた」という別の問題に変わります。 同じことがポートの公開でも起きます。-p 8080:80 を -p 80:80 に変えたら繋がった、という手順は、どちらの数字がホスト側でどちらがコンテナ側かを知らなければ再現できません。 エラー文そのものも同じです。Dockerのエラーは、どの部品が返したのかを示しています。CLIが返したのか、デーモンが返したのか、コンテナの中のプロセスが返したのかで、直す場所が変わります。この区別は、次に説明する全体像を知っていれば読み取れます。 最初に理解するべきDockerの全体像 先に部品の関係を押さえます。ここを飛ばすと、後のすべての段階で判断がぶれます。 Dockerはクライアントとサーバーに分かれています。公式ドキュメントによれば、docker コマンドがDockerクライアントで、利用者が最もよく使う操作の入口です。実際の作業はDockerデーモン(dockerd)が行い、イメージ、コンテナ、ネットワーク、ボリュームといったオブジェクトを管理します。両者はREST APIを使い、UNIXソケットまたはネットワークインターフェース経由で通信します。クライアントとデーモンは同じマシンで動かすことも、別のマシンに置くこともできます(Docker overview)。 この構造から、エラーの読み分けが1つ決まります。Cannot connect to the Docker daemon のような文言は、クライアントがデーモンへ届いていないという意味です。コンテナの設定を見直しても変わりません。逆に、コンテナの中のアプリケーションが出したエラーは、Dockerの設定ではなくアプリケーションの問題です。 もう1つの軸がイメージとコンテナの関係です。イメージは読み取り専用の層の集まりで、コンテナはその上に書き込み可能な層を1つ載せて動かしたものです。公式ドキュメントは、コンテナの中で作られたファイルは既定でこの書き込み可能なコンテナレイヤーに保存され、そのレイヤーはコンテナごとに固有だと説明しています(Data persistence overview)。 この2つの軸、つまりクライアントとデーモンの関係、イメージとコンテナの関係が、以降のすべての段階の土台になります。 まずは手元の環境が動いているかを確認してください。 docker version 出力はクライアント側とサーバー側に分かれます。サーバー側が表示されなければ、デーモンへ届いていません。この時点で次へ進んでも、以降のコマンドはすべて失敗します。 学習ステップ1:コンテナとイメージ 何を理解する段階か:イメージが設計図、コンテナがそれを動かした実体であること、そして両者が別々に管理されていることです。 なぜエラー解決に必要か:「イメージを更新したのに反映されない」という状況は、古いコンテナが動き続けているだけであることが多くあります。イメージとコンテナが別物だと分かっていないと、この判断ができません。 最低限覚える概念:イメージ、コンテナ、コンテナの状態(作成済み、実行中、停止)、そして名前とIDの関係です。 実際に試すコマンド: # 手元にあるイメージを一覧する docker images # イメージからコンテナを作って起動する docker run -d --name web nginx # 実行中のコンテナを一覧する docker ps # 停止中を含めて一覧する(-a を付けないと停止中は見えない) docker ps -a # コンテナの詳細な設定を確認する docker inspect web # 実行中のコンテナの中でコマンドを実行する docker exec -it web sh docker ps と docker ps -a の差は重要です。既定では実行中のものしか表示されません。停止したコンテナは見えないまま残り続け、名前を占有します。 ...