Dockerとは
Docker(ドッカー)は、アプリを「動かすのに必要な環境ごと」一つの箱に詰めて、どのコンピューターでも同じように動かせるようにする道具です。この箱のことをコンテナと呼びます。
前の章で、統合テストでは本物のデータベースを使いたい、という話をしました。Dockerを使うと、テストのたびに本番と同じデータベースを数秒で用意して、終わったら捨てる、ということが簡単にできます。この章では、その仕組みを図を動かしながら見ていきます。
「自分のPCでは動くのに」はなぜ起きるのか。アプリを動く環境ごと箱(コンテナ)に詰めるDockerの考え方を、Dockerfile・イメージ・コンテナの関係、どこでも同じに動く理由、テスト用データベースへの活用まで、図が動く形で解説します。
Docker(ドッカー)は、アプリを「動かすのに必要な環境ごと」一つの箱に詰めて、どのコンピューターでも同じように動かせるようにする道具です。この箱のことをコンテナと呼びます。
前の章で、統合テストでは本物のデータベースを使いたい、という話をしました。Dockerを使うと、テストのたびに本番と同じデータベースを数秒で用意して、終わったら捨てる、ということが簡単にできます。この章では、その仕組みを図を動かしながら見ていきます。
開発の現場でよく聞くのが「自分のPCでは動くのに、サーバーに置いたら動かない」という悩みです。原因の多くは、コード以外の部分、つまり環境の違いです。
アプリはコードだけで動いているわけではありません。Node.jsのような実行環境、たくさんのライブラリ、OSの設定などの上に乗って動いています。図のように、自分のPCではNode.js 20なのにサーバーは18、ライブラリのバージョンも少しずつ違う……となると、同じコードでも動かなくなることがあるのです。
それなら、コードだけでなく、動かすのに必要なものを全部まとめて箱に詰めてしまえばいい。これがDockerの発想です。アプリのコード、ライブラリ、Node.jsのバージョン、OSの設定まで、自分のPCで動いていた環境をそのまま箱の中に閉じ込めます。
この箱がコンテナです。コンテナは、パソコンの中に「もう一台のパソコン」を丸ごと作るのとは違い、必要な部分だけを詰めた軽い箱なので、数秒で起動できます。
箱に何を詰めるかは、Dockerfileというテキストファイルに手順として書きます。「Node.js 20の土台から始めて」「ライブラリをインストールして」「アプリのコードをコピーする」というように、上から順に書いていきます。
この手順書をもとに docker build というコマンドを実行すると、イメージができあがります。イメージは、環境が全部詰まった「型」のようなものです。左の手順の一行一行が、右のイメージの層(レイヤー)に対応しています。同じ色どうしを見比べてみてください。
イメージはあくまで型なので、それ自体は動きません。docker run というコマンドでイメージから起動したものが、実際に動くコンテナです。
たい焼きで例えると、イメージが焼き型で、コンテナが焼き上がったたい焼きです。一つの型から同じたい焼きがいくつでも作れるように、一つのイメージから、まったく同じ中身のコンテナをいくつでも起動できます。右の箱が、型から飛び出してきたのが分かるでしょうか。
同じイメージから起動したコンテナは、自分のPCでも、テストを自動で流すCIのマシンでも、本番のサーバーでも、中身がまったく同じです。Dockerさえ入っていれば、どのコンピューターの上でも同じように動きます。
だから「自分のPCでは動いたのに」という問題が起きにくくなります。テストに合格した環境と、本番で動く環境が同じであることを、仕組みとして保証できるようになるのです。
Dockerは自分のアプリだけでなく、データベースも同じようにコンテナで動かせます。docker composeという機能を使うと、「アプリのコンテナ」と「PostgreSQL 16のコンテナ」をまとめて起動し、つなげることができます。
統合テストでは、テストのたびに新品のデータベースを起動して、本物どうしをつないで確かめ、終わったら箱ごと捨てます。毎回まっさらな状態から始まるので、前のテストのデータが残っていて結果が変わる、ということも防げます。
Dockerのいちばんの強みは、「テストに合格した箱」と「本番で動く箱」を同じものにできることです。イメージを一度だけ作り、そのイメージでテストを流し、合格したら同じイメージを本番に置きます。途中で作り直さないので、テストのときと本番のときで中身が変わることがありません。
この「作る → テストする → 本番に出す」という流れを、変更のたびに機械が自動で回してくれる仕組みが、次の章で紹介するCI/CDです。
ログインするとコメントできます。
読み込み中…
権利侵害・不適切な内容の連絡: [email protected]