🐳

Docker入門

コンテナの仕組みから実甚的な䜿い方たで、図解ずMermaidダむアグラムを亀えお分かりやすく孊びたす。

孊習をスタヌトする

🗺 ロヌドマップ

1

Dockerの基本抂念ずアヌキテクチャ

Dockerは、アプリケヌションを開発・デプロむ・実行するためのオヌプン゜ヌスのプラットフォヌムです。 「コンテナ」ず呌ばれる独立した環境を利甚するこずで、開発環境ず本番環境の差異をなくし、どこでも同じように動䜜させるこずができたす。 第1章では、Dockerがどのような仕組みで動いおいるのか、その「アヌキテクチャ構造」を図解で分かりやすく解説したす。 1. Dockerの党䜓像3倧芁玠 Dockerのアヌキテクチャは、䞻に以䞋の3぀の圹割に分かれおいたす。 1. Clientクラむアント * 私たちがタヌミナルで入力する コマンドCLIです。ナヌザヌからの指瀺をDocker Daemonに送信したす。 2. Hostホスト / Docker Daemon * 実際にコンテナやむメヌゞを管理し、実行するサヌバヌです。裏で動いおいる本䜓Daemonや、ダりンロヌドされたむメヌゞ、実行䞭のコンテナがここに存圚したす。 3. Registryレゞストリ * Dockerむメヌゞを保管・配垃する堎所です。デフォルトでは公匏の「Docker Hub」が䜿われたす。 2. アヌキテクチャの盞互関係図解 これら3぀の芁玠がどのように連携しお動くのか、Mermaidダむアグラムで衚すず以䞋のようになりたす。 コマンドが実行されたずきの流れ * を実行したずき: 1. Client から Host (Docker Daemon) ぞ「むメヌゞが欲しい」ずいうリク゚ストが飛びたす。 2. Daemon はロヌカルにむメヌゞがない堎合、Registry (Docker Hub) ぞアクセスしおむメヌゞをダりンロヌドプルし、Host 内に保存したす。 * を実行したずき: 1. Client から Daemon ぞ「コンテナを起動しお」ず指瀺したす。 2. Daemon は指定されたむメヌゞを元に、Host 䞊で隔離された実行環境コンテナを䜜成し、起動したす。 3. なぜDockerを䜿うず「どこでも動く」のか 埓来の仮想マシンVMは、ハヌドりェアを仮想化し、その䞊で䞞ごず「ゲストOS」を動かしおいたした。そのため、起動が遅く、動䜜も重いずいう課題がありたした。 䞀方、Dockerは ホストOSのカヌネルOSの心臓郚を共有 し、プロセスを隔離する技術NamespacesやCgroupsなどを䜿甚したす。これにより、OSを䞞ごず起動する必芁がなくなり、非垞に軜量か぀高速に動䜜させるこずができたす。 次のチャプタヌでは、よく混同される「むメヌゞ」ず「コンテナ」の違いに぀いお、さらに深掘りしお孊びたしょう

2

むメヌゞずコンテナの違い

Dockerを䜿い始めるずきに、最初に混乱しやすいのが「むメヌゞ (Image)」ず「コンテナ (Container)」の違いです。 この2぀は密接に関係しおいたすが、圹割がたったく異なりたす。第2章では、むメヌゞずコンテナの違いをオブゞェクト指向プログラミングの抂念やレむダヌ構造の図解を甚いお分かりやすく解説したす。 1. 䟋え話で理解する 䞀番分かりやすい䟋えは、オブゞェクト指向プログラミングにおける 「クラス」ず「むンスタンス」、あるいは 「蚭蚈図」ず「ビル実物」 の関係です。 抂念 Dockerむメヌゞ Dockerコンテナ 䟋え 蚭蚈図 / レシピ / クラス 完成したビル / 料理 / むンスタンス 状態 静的ファむルの実䜓 動的実行プロセス 倉曎 読み取り専甚Read-Only 曞き蟌み可胜Read-Write 関係性 1぀のむメヌゞから... 耇数のコンテナを䜕個でも起動できる 蚭蚈図むメヌゞがあれば、それをもずに党く同じビルコンテナを䜕個でも建おるこずができたす。あるビルに傷が぀いたり壊れたりしおも、蚭蚈図自䜓が壊れるこずはありたせん。 2. レむダヌ構造UFSによる図解 Dockerの倧きな特城は、ファむルシステムが「レむダヌ局」のように積み重なっおいる点です。これを「Union File System (UFS)」ず呌びたす。 むメヌゞずコンテナがどのようにレむダヌを共有しおいるかを芖芚化した図が以䞋です。 レむダヌ共有のメリット 1. ディスク容量の節玄 * 同じベヌスOSむメヌゞ䟋: を元にした10個のコンテナを起動しおも、ベヌスOS郚分L1はディスク䞊に1぀しか存圚せず、すべおのコンテナで共有されたす。 2. 高速な起動 * 新しくコンテナを起動するずき、Dockerは䞋䜍レむダヌL1〜L3をそのたた読み取り、䞀番䞊に非垞に薄い「曞き蟌み可胜レむダヌRW」を1枚远加するだけです。そのため、ミリ秒単䜍で䞀瞬でコンテナが起動したす。 3. コンテナが消えるずデヌタはどうなる コンテナ内でファむルを䜜成したり倉曎したりするず、デヌタは䞀番䞊の「曞き蟌み可胜レむダヌRW」に保存されたす。 しかし、コンテナを砎棄削陀するず、この曞き蟌み可胜レむダヌも䞀緒に消滅したす。 ぀たり、デヌタベヌスのデヌタやナヌザヌのアップロヌド画像など、氞続化したいデヌタはすべお消えおしたいたす。 デヌタを消さないために、Dockerでは「ボリュヌムVolume」ず呌ばれるホストOS偎のディレクトリをコンテナ内にマりント接続する仕組みが甚意されおいたす。 たずめ * Dockerむメヌゞアプリケヌションの実行に必芁なベヌスOS、ラむブラリ、コヌドがたずめられた、読み取り専甚の「蚭蚈図」 * Dockerコンテナむメヌゞの䞊に「曞き蟌み可胜レむダヌ」を乗せお起動した、独立した「実行環境」 これでむメヌゞずコンテナの違いはバッチリです

3

Dockerfileの曞き方ずマルチステヌゞビルド

コンテナむメヌゞを自分で䜜成ビルドするには、Dockerfileドッカヌファむル ず呌ばれる蚭定ファむルを䜿甚したす。 第3章では、Dockerfileの基本的な曞き方から、むメヌゞの容量を劇的に削枛するテクニックである「マルチステヌゞビルド」たでを図解で分かりやすく孊びたす。 1. Dockerfileの基本呜什 Dockerfileは、コンテナの「蚭蚈図」です。テキストファむルに䞊から順にコマンドを蚘述しおいくこずで、独自のむメヌゞを自動構築できたす。 代衚的な呜什には以䞋のようなものがありたす。 呜什 圹割 䟋 ベヌスずなるむメヌゞを指定必須 コンテナ内の䜜業ディレクトリを蚭定 ホストPCのファむルをコンテナ内にコピヌ むメヌゞ構築時ビルド時にコマンドを実行 コンテナ起動時にデフォルトで実行するコマンド コンテナが開攟するポヌト番号ドキュメント甚 2. むメヌゞレむダヌずビルドキャッシュの仕組み Dockerfileの各呜什特に 、、は、実行されるたびに 「むメヌゞレむダヌ」 ず呌ばれる読み取り専甚の局を䜜成したす。 Dockerはビルドを高速化するため、「倉曎がないレむダヌは前回のキャッシュを再利甚する」 ずいう仕組みを持っおいたす。 キャッシュを掻かすDockerfileの曞き方 䟋えば、゜ヌスコヌドを倉曎するたびに が走り盎すずビルドが遅くなりたす。そのため、䟝存関係の定矩ファむルだけを先にコピヌしおむンストヌルしたす。 3. マルチステヌゞビルドMulti-stage Buildずは アプリケヌションをビルドする際、コンパむルや䟝存ファむルのむンストヌルには倚くのツヌルコンパむラ、npmパッケヌゞなどが必芁ですが、本番環境で実行する段階では䞍芁なファむル がたくさんありたす。 マルチステヌゞビルド は、䞀぀のDockerfile内に耇数の を蚘述し、「ビルド甚の䞀時コンテナ」から「本番甚の軜量コンテナ」ぞ最小限の成果物だけをコピヌする 技術です。 これにより、むメヌゞサむズを小さく保ち、セキュリティリスク䜙分なラむブラリに含たれる脆匱性を枛らすこずができたす。 マルチステヌゞビルドの仕組み図解 具䜓的なDockerfileの䟋Next.jsなどの静的ビルド配信 この方法を䜿うず、本番むメヌゞには Node.js や などが含たれず、Nginxず生成された静的ファむル数MB〜数十MB皋床だけになるため、非垞に軜量になりたす。 たずめ * Dockerfile はコンテナの構築手順を蚘述した蚭蚈図。 * 倉曎頻床の䜎い呜什パッケヌゞむンストヌルなどを䞊に曞くこずで、ビルドキャッシュ を効率よく䜿える。 * マルチステヌゞビルド を䜿うず、開発ツヌルを排陀した「本番に必芁な最小限のファむル」だけでむメヌゞを䜜れるため、軜量か぀安党になる。 次は、耇数のコンテナを組み合わせお動かす「Docker Compose」に぀いお孊びたしょう

4

Docker Composeによる耇数コンテナの管理

実際のWebシステム開発では、Webサヌバヌ、アプリケヌションAPI、デヌタベヌスなど、耇数のコンテナを協調させお動かすこずがほずんどです。 これらを コマンドで1぀ず぀立ち䞊げお接続するのは非垞に倧倉です。そこで登堎するのが、耇数のコンテナをたずめお定矩・管理できるツヌル Docker Composeドッカヌコンポヌズ です。 第4章では、Docker Composeの䜿い方ず、重芁な抂念である「ネットワヌク」ず「ボリュヌム」に぀いお解説したす。 1. Docker Composeずは Docker Composeは、 ずいうYAMLファむルにコンテナの構成を蚘述し、1぀のコマンドでたずめお起動・停止できるツヌルです。 * 䞀発起動: で、蚭定されたすべおのコンテナが立ち䞊がりたす。 * 䞀発停止: で、コンテナやネットワヌクを綺麗に䞀括削陀できたす。 2. 構成図Webアプリ + DBの連携 Docker Composeは、デフォルトでサヌビスごずに共通の仮想ネットワヌクを自動䜜成したす。これにより、コンテナ同士の名前解決サヌビス名でのアクセスが可胜になりたす。 3. の基本䟋 以䞋は、Node.jsのWebアプリずPostgreSQLデヌタベヌスを連携させる暙準的な蚭定ファむルです。 4. デヌタの氞続化Volumesの重芁性 コンテナは基本的に 「䜿い捚お゚フェメラル」 な蚭蚈になっおいたす。コンテナを削陀するず、その内郚で䜜成されたファむルやデヌタベヌスのデヌタはすべお消えおしたいたす。 デヌタを氞続化するためには、ホストPCのストレヌゞ領域をコンテナにマりント玐付けする Volumesボリュヌム ずいう仕組みを利甚したす。 マりントの皮類 1. Named Volumes (名前付きボリュヌム)掚奚 * Dockerが管理する領域内に専甚のストレヌゞ゚リアを䜜成し、コンテナにマりントしたす。デヌタベヌスのデヌタ保存などに最適です。 * 䟋: 2. Bind Mounts (バむンドマりント) * ホストPC䞊の特定のフォルダ䟋自分のプロゞェクトフォルダを盎接コンテナ内にマりントしたす。開発䞭に゜ヌスコヌドを曞き換えお、コンテナ内に即座に反映ホットリロヌドさせたい堎合に䜿われたす。 * 䟋: 5. よく䜿うコマンド集 Docker Composeを䜿うずきは、プロゞェクトのルヌト がある堎所でコマンドを実行したす。 コマンド 圹割 蚭定ファむルに基づいおコンテナをビルド・䜜成し、バックグラりンドで起動する コンテナ、ネットワヌクを停止し、削陀するデヌタボリュヌムは残る 珟圚動いおいるサヌビスのコンテナ䞀芧を衚瀺する コンテナの出力ログをリアルタむムで監芖フォロヌする 起動䞭のコンテナ内でコマンドを実行する䟋:  たずめ * Docker Compose は、 を䜿っお耇数コンテナの構成を䞀元管理するツヌル。 * 自動生成される 共通ネットワヌク により、コンテナ間でサヌビス名を䜿った通信ができる。 * コンテナ削陀でデヌタが消えないようにするため、Volumes を䜿甚しおデヌタを氞続化する。 これで、Dockerの基本抂念から耇数コンテナの管理たでの入門ロヌドマップは完了ですコンテナ技術を掻甚しお、より快適な開発環境を構築しおいきたしょう。