Dockerで作る、壊して戻せる開発環境
// 記事のポイント
- Dockerはホストと隔離された、開発専用の環境(コンテナ)を作る技術
- イメージ・Dockerfileで環境を定義すれば、壊しても同じ状態を作り直せる
- ボリューム・バインドマウントでデータの永続化とローカル⇔コンテナの接続を管理する
- Composeで設定をコード化すれば、開発環境を丸ごと共有・再現できる
今日は、このブログの開発でも使っているDockerについて話すよ〜。
Dockerは、自分のPCの中に開発専用の隔離された環境を用意する技術。ホストPCへ直接いろいろなプログラムを入れなくても、必要なツールをコンテナの中にまとめて動かせる。
PCの中に、もう1台PCを置くの?
こめのお部屋も、その中に作れる?
初めて聞くと「PCの中のPC」というイメージが分かりやすいよね。ただ、もう少し正確に言うと少し違うんだ。
コンテナは仮想マシンそのものではなく、必要なファイルやライブラリと一緒に隔離して動かすプロセス。仮想マシンはOSやカーネルまで丸ごと持つのに対して、複数のコンテナは基本的にホスト側のカーネルを共有する。そのぶん起動が速く、比較的軽量なのが特徴。なお、macOSやWindowsのDocker Desktopでは、Linuxコンテナを動かすために内部でLinuxの仮想マシンも利用している。
Dockerの日本語ドキュメントを見る大きな家をもう1軒建てるというより、同じ建物の中に必要なものがそろった専用のお部屋を作る感じなんだね〜。
そのお部屋は、どうやって同じ状態を作り直すの?
そこで登場するのが「イメージ」と「Dockerfile」だよ。
イメージは、コンテナを起動するために必要なファイル、実行環境、ライブラリ、設定をまとめた変更不可のひな型。Dockerfileには、どのベースイメージを使うか、何をインストールするか、どのコマンドで起動するかをコードで書く。このブログではDockerfileを使ってNode.js 22系が動くイメージを作っている。同じ定義から作れば、環境を壊してもイメージからコンテナを作り直せるし、ほかの人も近い環境を再現しやすい。
壊しても、レシピを見れば同じお部屋が戻ってくるの?
おやつの置き場所もレシピに書いておいてね!
おやつは別で管理しようかな(笑)
コンテナを作り直すと、コンテナ内の書き込み可能な層に置いたデータは失われるのが基本。残したいデータにはDocker管理の「ボリューム」を使い、PC上のソースコードをコンテナから直接扱いたいときは「バインドマウント」を使う。このブログのCompose設定では、プロジェクトのフォルダをコンテナ内の`/workspace`へバインドマウントしている。だからPC側で編集した記事やコードが、コンテナ側からも同じファイルとして見える。ただし、コンテナからPC側のファイルを書き換えられる設定でもあるので、便利さと権限の強さはセットで意識したい。
消してよいものと、残したいものを分けておくのが大事なんだね〜。
ブラウザでブログを見るときは、隔離されたコンテナへどうやってつながるの?
その入口が「ポート」だよ。
コンテナの中でWebサーバーを起動しても、そのままではPCのブラウザからアクセスできないので、ホスト側とコンテナ側のポートを対応づける。このブログはComposeで`4321:4321`と設定しているから、PCの`localhost:4321`へのアクセスが、コンテナ内の4321番ポートへ届く。さらにDocker Composeを使うと、コンテナのビルド方法、マウント、ポート、環境変数、複数サービスのネットワークなどをYAMLへまとめて、同じ構成を一括で起動できる。
localhostは、コンテナのお部屋につながる玄関なの?
玄関を開けたら、こめが最初に見に行く!
こめちゃん、勝手に全部の玄関を開けたら危ないよ〜。
でも設定をコードにしておけば、誰かに「このプログラムを入れて、このフォルダを作って」と一つずつ説明しなくてよいのは便利そうだね〜
そうなんだ。設定をコードにしておく効果は、実は複数人・複数環境での再現性にもつながるんだ。
Dockerfile、Composeの設定、パッケージのロックファイルをリポジトリで共有すれば、「自分のPCでは動くのに」という差を減らせる。完全に同じになるとは限らないため、ベースイメージや依存関係のバージョンを固定し、秘密情報をイメージへ含めないことも大切。このブログでは、ローカルはこのDocker環境でチェックと本番ビルドを試し、本番はCloudflareのWorkers Builds専用環境を使っている。GitHubへ変更をプッシュすると、Cloudflare側でビルドコマンドが実行され、成功した成果物がWorkerへデプロイされる。
Cloudflare公式ブログの日本語解説を見る僕が本格的にITの仕事を始めた頃にはDockerはすでにあったけど、こうした仕組みがなかった時代は、開発者ごとに環境を手作業でそろえる負担が今よりずっと大きかったはず。最近はAIにDockerfileやComposeのたたき台を書いてもらえて楽になった一方で、マウントやポート、権限、永続化が何を意味するかは自分でも理解しておきたいね。
技術の進化はこれからもっと加速していくと思うから、「AIが書いたから動いた」で終わらず、何の技術がどんな問題を解決しているのかを知って、生活や仕事へ上手に取り入れていくよ〜!
難しい話も、こうやって一緒に整理してくれるの助かるな〜。また分からなくなったら聞くね。
// 記事のまとめ
- 「壊れたら作り直せばいい」と思えるだけで、開発中の試行錯誤への心理的なハードルが下がる
- ローカルと本番(Cloudflare Workers Builds)を近い構成にしておくと、差分に悩む場面を減らせる
- マウント・ポート・権限の意味を理解した上でAI任せにすると、設定ミスに早く気づける