Docker 本質
環境をコードで管理すること
📅 開催日時:2025年12月27日
🐳 Dockerの本質を理解して、環境構築の悩みから解放されよう
💡 XXX as Code を覚えていってね!これだけ!
Dockerを学ぶメリット
PCがぐちゃぐちゃにならない。
知らないと話についていけない。
Linuxとシェルコマンドが身につく。
エンジニアには必須。非エンジニアにはハードル高いが...
てか使えたら最強 💪
⏱️ 学習目安
🐧 Linuxを触ったことない人は...
- EC2上でLinuxを学習しウェブアプリを作るための知識を習得
(動画10時間 + ハンズオン10時間)
Dockerとは何か
Docker(ドッカー)は、アプリケーションとその実行環境を「コンテナ」という単位でパッケージ化し、 どこでも同じように動かせるようにするツールです。
💡 一言で言うと
「アプリと環境をセットにして、どこでも同じように動かせる箱」
🎯 Dockerが解決する問題
プログラミングをしていると、こんな経験ありませんか?
😫 よくある悩み
- 「自分のPCでは動くのに、本番サーバーで動かない...」
- 「新しいメンバーの環境構築に丸1日かかった...」
- 「Pythonのバージョンがプロジェクトごとにバラバラ...」
- 「開発環境が壊れて、再構築に数時間...」
Dockerを使うと、これらの問題がすべて解決します。 アプリケーションと、それを動かすために必要なすべて(OS、ライブラリ、設定ファイルなど)を 1つのパッケージにまとめられるからです。
✨ Dockerを使うと
- どこでも同じ環境 - 開発・テスト・本番で完全に同じ環境
- 環境構築が秒で完了 - コマンド1つで環境が立ち上がる
- 汚れない - ホストPCに影響を与えない
- 簡単に破棄・再作成 - やり直しが簡単
実際の環境構築で比較してみよう
「Dockerが便利」と言われても、ピンとこないかもしれません。
実際にAWS EC2でUbuntuサーバーを立てて、Node.js + MongoDBの環境を構築する場合を比較してみましょう。
😓 従来の方法(Ubuntuサーバーに直接構築)
EC2インスタンスを作成し、AWSマネジメントコンソールからUbuntuに接続したとします。
ここから環境構築を始めると...
AWSマネジメントコンソールでEC2のセキュリティグループを編集し、
ポート3000を開放する必要があります:
- EC2ダッシュボードでインスタンスを選択
- セキュリティグループタブをクリック
- インバウンドルールを編集
- カスタムTCP、ポート3000、ソース0.0.0.0/0を追加
- 保存
ブラウザでhttp://<EC2のパブリックIP>:3000にアクセスして動作確認
(例:http://54.123.45.67:3000)
😫 従来の方法の本当の問題
問題は時間ではありません。本当の地獄はここから始まります。
- 🔥 依存関係の地獄: パッケージのバージョンが合わない、ライブラリが競合する...解決に数時間〜数日かかることも
- 😱 「僕の環境では動くのに...」: チームメンバーの環境で動かない。原因究明に半日〜1日消える
- 💀 本番環境で突然のエラー: 開発では問題なかったのに本番で動かない。デプロイ失敗でリリースが遅延
- 🐛 環境の微妙な違い: Node.jsのバージョン、OSの違い...デバッグに何日も費やす
- 🔧 トラブルシューティング地獄: エラーメッセージをググり、Stack Overflowを漁り、試行錯誤を繰り返す無限ループ
- 🗑️ 環境の汚染: 古いプロジェクトのパッケージが残り、新しいプロジェクトに影響。クリーンアップしても完全には消えない
→ 環境構築だけで数日〜1週間かかることも珍しくありません。これが現実です。
✨ Dockerを使った方法
同じ環境を、Dockerで構築してみましょう。
まず、EC2のUbuntuにDockerをインストールします。
※ 再ログインしてグループ変更を反映させます
必要なのは2つのファイルだけです。
📄 Dockerfile
📄 docker-compose.yml
🎉 ブラウザでアクセスして動作確認。完了!
✅ Dockerのメリット
- Dockerのインストールは一度だけ: 最初の1回だけで、その後は不要
- アプリごとの環境構築が超簡単: ファイルを作ってコマンド1つで完了
- ミスがない: ファイルに全て書いてあるので、タイプミスなし
- 100%再現可能: 誰がやっても、どこでやっても同じ環境
- チーム共有が簡単: ファイルをGitで共有するだけ
- クリーンアップが簡単:
docker compose down -vで完全削除 - 複数環境を同時に: プロジェクトごとに独立した環境を持てる
📝 Dockerの本質:環境をコードで管理する
Dockerの真の価値は、「環境をコードで管理できる」ことです。
これは現代のソフトウェア開発における重要なトレンド「X as Code」の一つです。
🏗️ Infrastructure as Code (IaC)
Terraformでインフラをコード化するように、Dockerで開発環境をコード化します。
Dockerfileは最も一般的なIaCの形式の一つで、チームが「バージョン管理可能、テスト可能、自動化可能なコード」を通じてインフラを管理できるようにします。
- Terraform: AWSやGCPのインフラをコードで定義
- Docker: 開発環境やアプリケーション実行環境をコードで定義
📚 コードがドキュメント
従来は「環境構築手順書」というドキュメントを作成していました。
しかし、ドキュメントには大きな問題があります:
- ❌ すぐに古くなる: 環境が変わってもドキュメントは更新されない
- ❌ 曖昧: 「適切に設定してください」など、解釈が分かれる
- ❌ 間違いに気づけない: 手順書が間違っていても実行するまでわからない
一方、Dockerの設定ファイル(Dockerfile、docker-compose.yml)は:
- ✅ 常に最新: 動いているコードが最新のドキュメント
- ✅ 明確: 曖昧さゼロ。書いてある通りに実行される
- ✅ すぐに検証できる: 実行すれば動くかどうかすぐわかる
🔄 他の「X as Code」の例
現代の開発では、あらゆるものを「コード化」して管理します:
- CI/CD as Code: GitHub Actions、GitLab CIの
.ymlファイル - Configuration as Code: Ansible、Chef、Puppetでサーバー設定を管理
- Database as Code: マイグレーションファイルでDB構造を管理(Rails、Laravel、Prismaなど)
- Policy as Code: Open Policy Agent (OPA)でセキュリティポリシーを定義
🎯 なぜ「コード化」が重要なのか
- 📊 バージョン管理できる: Gitで変更履歴を追跡、いつでも過去に戻せる
- 👥 レビューできる: Pull Requestで環境の変更をレビュー可能
- 🤖 自動化できる: CI/CDで自動テスト・デプロイ
- 🔁 再現可能: 誰が実行しても、いつ実行しても同じ結果
- 🧪 テストできる: コードだから自動テストが書ける
- 🌍 共有できる: チーム全員が同じ環境で開発できる
🔒 Immutable Infrastructure(不変なインフラ)
Dockerのもう1つの重要な概念が「イミュータブル(不変)」です。
※ 以下の「ペット vs 家畜」の比喩は、Randy Bias が2012年頃に提唱したクラウドインフラ(サーバー)の設計思想です。
Dockerのコンテナ管理も、この同じ思想を採用しています。
参考: The History of Pets vs Cattle
「このサーバーのNode.jsを
v16からv18にアップデート」
→ 徐々に環境が変化
→ 誰かが勝手に設定変更
→ 環境が汚れていく
「Node.js v18のコンテナを新規作成、
古いコンテナは削除」
→ 常にクリーンな環境
→ 予期しない変更ゼロ
→ ロールバックも簡単
メリット:
- 環境が絶対に汚れない
- 「誰かが勝手に設定を変えた問題」が発生しない
- 問題が起きたら古いバージョンに一瞬で戻せる
- 全く同じ環境を何度でも再現できる
🌐 ポータビリティ(どこでも動く)
Dockerで作った環境は、どこでも全く同じように動きます。
これが「Write once, run anywhere(一度書けば、どこでも動く)」の思想です。
これで解決する問題:
- 「僕の環境では動くのに...」問題: 全員が同じDocker環境を使うので発生しない
- クラウドのロックイン回避: AWS固有の機能に依存せず、いつでも移行可能
- ローカルと本番の差異: 開発環境も本番環境も完全に同じ
- 新メンバーの環境構築: 5分で全員が同じ環境で開発開始
💡 まとめ:Dockerの3つの本質
1️⃣ 環境をコードで管理: ドキュメント不要、常に最新
2️⃣ イミュータブル: 環境が汚れない、予期しない変更ゼロ
3️⃣ ポータビリティ: どこでも同じように動く
Dockerは単なるツールではなく、現代的な開発思想の体現です。
これから学習を進めていくと、この便利さを実際に体験できます。
📚 参考資料:
• Docker公式: What is Docker? - Dockerの概要とメリット
• Docker日本語ドキュメント - Docker公式ドキュメントの日本語翻訳プロジェクト