STEP 1:コンテナ技術とは何か

🐳 STEP 1: コンテナ技術とは何か

仮想マシンとコンテナの違いを理解し、なぜコンテナが必要なのかを学びます

📋 このステップで学ぶこと

  • コンテナ技術の基本的な考え方と仕組み
  • 仮想マシン(VM)とコンテナの違いと使い分け
  • 「環境の違い」によるトラブル事例と解決方法
  • コンテナが解決する4つの問題
  • コンテナ技術の歴史とDockerの登場

🎯 1. コンテナ技術とは?

1-1. コンテナを一言で言うと

コンテナとは、「アプリケーションを動かすために必要なものを、1つの箱にまとめて入れたもの」です。

この「箱」には、以下のものが入っています:

  • アプリケーション本体(プログラム)
  • アプリケーションが必要とするライブラリ
  • 設定ファイル
  • 環境変数

これらをすべてまとめて1つの単位として扱うことで、どんな環境でも同じように動作させることができます。

1-2. 身近な例え:引っ越しの段ボール箱

📦 引っ越しで考えてみましょう

引っ越しを想像してください。あなたの持ち物を新しい家に運ぶ方法として、2つのやり方があります。

やり方1:バラバラに運ぶ(従来の方法)

本、食器、服、家電…それぞれバラバラに運ぶ方法です。

  • 問題1:運ぶのが大変で時間がかかる
  • 問題2:忘れ物が出やすい
  • 問題3:どこに何があるかわからなくなる
  • 問題4:新しい家で使えるようになるまで時間がかかる

やり方2:用途別にまとめて運ぶ(コンテナの方法)

「キッチンセット」「リビングセット」「寝室セット」と、用途ごとに必要なものをすべて箱に入れる方法です。

  • 利点1:箱ごと運べば完了
  • 利点2:何が入ってるか一目瞭然
  • 利点3:新居でもすぐに使える
  • 利点4:同じ箱を別の家に持って行っても同じように使える
💡 コンテナの本質

コンテナは、引っ越しの段ボール箱と同じ発想です。
アプリケーションを動かすために必要なものをすべてまとめておけば、
どの環境(パソコン、サーバー)に持っていっても同じように動作します。

1-3. プログラムの世界で考える

上記の引っ越しの例を、実際のプログラムに置き換えて考えてみましょう。

従来の方法:アプリケーションだけを配布

【従来の方法】 ① 開発者がアプリケーションを完成させる ② アプリケーションだけを他の人に渡す → app.py(Pythonスクリプト)だけを渡す ③ 受け取った人がアプリケーションを実行する → 「あれ?動かない…」 ④ エラーの原因を調べる → Pythonのバージョンが違う → 必要なライブラリがインストールされていない → 設定ファイルが足りない ⑤ 手作業で環境を整える → 数時間〜数日かかる

コンテナの方法:環境ごとまとめて配布

【コンテナの方法】 ① 開発者がアプリケーションを完成させる ② アプリケーション + 実行環境をまとめてコンテナにする → app.py → Python 3.10 → pandas、numpyなどのライブラリ → 設定ファイル → 環境変数 これらすべてを「1つの箱(コンテナ)」に入れる ③ コンテナを他の人に渡す ④ 受け取った人がコンテナを起動する → すぐに動く! → 環境構築は不要!

1-4. コンテナの5つの特徴

コンテナには、以下の5つの重要な特徴があります。

特徴 説明 メリット
1. 一貫性 アプリケーションと実行環境が1セット どこでも同じように動く
2. 軽量性 OSを含まないため非常に軽い 数秒で起動できる
3. 隔離性 他のコンテナと完全に分離 他のアプリに影響しない
4. 移植性 コンテナをそのまま移動可能 開発→本番の移行が簡単
5. 再現性 同じコンテナから何度でも同じ環境を作成 チーム全員が同じ環境で作業

💻 2. 仮想マシンとコンテナの違い

2-1. なぜ比較するのか?

コンテナを理解するには、先に存在していた仮想マシン(VM:Virtual Machine)と比較すると分かりやすくなります。

どちらも「アプリケーションを隔離して動かす」という目的は同じですが、仕組みが根本的に異なります

2-2. 仮想マシン(VM)とは?

🖥️ 仮想マシンを一言で言うと

1台のパソコンの中に、「別のパソコンを丸ごと作る」技術です。

仮想マシンの具体例

  • Windowsパソコンの中に、Linuxパソコンを作る
  • Macの中に、Windowsパソコンを作る
  • 1台のサーバーの中に、複数のサーバーを作る

有名な仮想化ソフトとして、VMware、VirtualBox、Hyper-Vなどがあります。

仮想マシンの構造

仮想マシンは、以下のような階層構造になっています。

【仮想マシンの構造図】 ┌───────────────────────────────────────────────────────┐ │ 物理マシン(実際のパソコン) │ │ ┌─────────────────────────────────────────────────┐ │ │ │ ホストOS(Windows / Mac / Linux) │ │ │ │ ┌───────────────────────────────────────────┐ │ │ │ │ │ ハイパーバイザー(仮想化ソフト) │ │ │ │ │ │ ┌──────────────┐ ┌──────────────┐ │ │ │ │ │ │ │ 仮想マシン1 │ │ 仮想マシン2 │ │ │ │ │ │ │ │ ┌──────────┐ │ │ ┌──────────┐ │ │ │ │ │ │ │ │ │ゲストOS │ │ │ │ゲストOS │ │ │ │ │ │ │ │ │ │(Linux全体)│ │ │ │(Windows) │ │ │ │ │ │ │ │ │ │ ← 重い! │ │ │ │ ← 重い! │ │ │ │ │ │ │ │ │ ├──────────┤ │ │ ├──────────┤ │ │ │ │ │ │ │ │ │ライブラリ │ │ │ │ライブラリ │ │ │ │ │ │ │ │ │ ├──────────┤ │ │ ├──────────┤ │ │ │ │ │ │ │ │ │ アプリ │ │ │ │ アプリ │ │ │ │ │ │ │ │ │ └──────────┘ │ │ └──────────┘ │ │ │ │ │ │ │ └──────────────┘ └──────────────┘ │ │ │ │ │ └───────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────┘ │ └───────────────────────────────────────────────────────┘
⚠️ 仮想マシンの問題点

上の図を見ると、各仮想マシンにゲストOS(オペレーティングシステム)が丸ごと入っていることが分かります。これが問題です。

  • サイズが大きい:OS全体をコピーするので、1つ数GB〜数十GBになる
  • 起動が遅い:OSが起動するまで数分かかる
  • リソースを大量消費:OS分のメモリやCPUが余計に必要
  • 管理が大変:各VMのOSを個別にアップデート・セキュリティ対策する必要がある

2-3. コンテナの構造

コンテナは、仮想マシンとは根本的に異なる仕組みです。

【コンテナの構造図】 ┌───────────────────────────────────────────────────────┐ │ 物理マシン(実際のパソコン) │ │ ┌─────────────────────────────────────────────────┐ │ │ │ ホストOS(Windows / Mac / Linux) │ │ │ │ ┌───────────────────────────────────────────┐ │ │ │ │ │ Dockerエンジン(コンテナ管理ソフト) │ │ │ │ │ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │ │ │ │ │ │コンテナ1 │ │コンテナ2 │ │コンテナ3 │ │ │ │ │ │ │ │┌─────────┐│ │┌─────────┐│ │┌─────────┐│ │ │ │ │ │ │ ││ライブラリ││ ││ライブラリ││ ││ライブラリ││ │ │ │ │ │ │ │├─────────┤│ │├─────────┤│ │├─────────┤│ │ │ │ │ │ │ ││ アプリ ││ ││ アプリ ││ ││ アプリ ││ │ │ │ │ │ │ │└─────────┘│ │└─────────┘│ │└─────────┘│ │ │ │ │ │ │ └───────────┘ └───────────┘ └───────────┘ │ │ │ │ │ │ ↑ OSは共有するので軽い! │ │ │ │ │ └───────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────┘ │ └───────────────────────────────────────────────────────┘
💡 コンテナと仮想マシンの決定的な違い

仮想マシン:各VMに個別のOS(ゲストOS)が必要
コンテナ:ホストOSを全コンテナで共有

この違いにより、コンテナは軽量で高速になります。

2-4. 仮想マシンとコンテナの比較表

両者の違いを表で整理します。

項目 仮想マシン(VM) コンテナ
サイズ 数GB〜数十GB
(OS全体が必要)
数十MB〜数百MB
(OSは共有)
起動時間 数分
(OSが起動する)
数秒
(アプリだけ起動)
リソース消費 メモリ・CPU大量消費
(OS分も必要)
最小限のリソース
(効率的)
隔離性 完全に隔離
(別のマシン)
プロセスレベルで隔離
(十分安全)
移植性 やや低い
(環境依存)
非常に高い
(どこでも動く)
同時実行数 数個〜数十個
(リソースを多く消費)
数十〜数百個
(軽量なため多数実行可能)

2-5. どちらを使うべきか?

仮想マシンとコンテナは、それぞれ得意な場面が異なります。

🖥️ 仮想マシンが適している場面
  • 完全に別のOSが必要な場合
    (例:Windows上でLinuxを動かす)
  • セキュリティのため完全に隔離したい場合
  • レガシーシステムを動かす場合
  • OSレベルのカスタマイズが必要な場合
🐳 コンテナが適している場面
  • アプリケーションの開発・配布
  • マイクロサービス
    (小さなサービスを多数動かす)
  • 開発環境と本番環境を統一したい
  • 軽量で高速な環境が欲しい
  • CI/CD(継続的インテグレーション)
💡 現代のアプリケーション開発では

現代のアプリケーション開発では、コンテナが主流になっています。
特にデータエンジニアリングの分野では、PostgreSQL、Apache Airflow、Apache Sparkなどのツールをコンテナで動かすことが一般的です。

このコースでは、コンテナ(Docker)を使った開発方法を学んでいきます。

❌ 3. 「環境の違い」によるトラブル事例

コンテナが必要な理由を実感するために、実務でよく起こるトラブルを見てみましょう。

3-1. トラブル事例①:「私のパソコンでは動くのに…」

🎬 シーン:開発チームでの会話

開発者Aさん:「データ処理スクリプト完成しました!このPythonスクリプトを実行してください」

同僚Bさん:「実行してみたけど、エラーが出て動きません…」

開発者Aさん:「えっ!?私のパソコンでは動くのに…」

同僚Bさん:「ModuleNotFoundError: No module named ‘pandas’ って出てます」

開発者Aさん:「あ、pandasインストールしてください」

同僚Bさん:「インストールしたけど、今度はバージョンが違うって言われます…」

なぜこの問題が起きるのか?

【原因の例】 AさんのPC環境: – OS: Windows 11 – Python: 3.10.5 – pandas: 2.0.1 – numpy: 1.24.0 BさんのPC環境: – OS: macOS – Python: 3.8.10 ← バージョンが違う! – pandas: なし ← インストールされていない! – numpy: 1.19.0 ← バージョンが違う! 【他にもこんな違いが…】 – 環境変数が設定されていない – 設定ファイル(config.ini等)がない – 外部サービスへの接続情報がない – OSの違いでパスの書き方が違う(Windows: C:\ / Mac・Linux: /)
⚠️ この問題の深刻さ

「私のPCでは動く」問題は、開発の大きな時間ロスになります。

  • 原因の特定に数時間〜数日かかることも
  • チームメンバーが増えるほど問題が複雑化
  • 本来のコードを書く作業に集中できない

3-2. トラブル事例②:本番環境で動かない

🎬 シーン:リリース日の朝

開発者:「開発完了!テストも通ったので本番サーバーにデプロイします」

(デプロイ完了後)

開発者:「あれ…?本番サーバーでエラーが…」

上司:「お客様からシステムが動かないと問い合わせが来てるけど?」

開発者:「開発環境では問題なく動いていたのに…原因を調査中です…」

なぜこの問題が起きるのか?

【原因の例】 開発環境: – OS: Windows 10 – Python: 3.10 – データベース: 開発用の小さなデータ – ネットワーク: ローカル接続 本番環境: – OS: Linux (Ubuntu) ← OSが違う! – Python: 3.9 ← バージョンが違う! – データベース: 大量の本番データ – ネットワーク: セキュリティ設定が厳しい 【具体的な問題】 – パスの書き方が違う(Windows: C:\data\file.csv → Linux: /data/file.csv) – 特定のライブラリがLinuxで動かない – 本番データの量が多すぎてメモリ不足 – ファイアウォールでデータベース接続がブロック
⚠️ この問題の深刻さ

本番環境でのトラブルは、ビジネスに直接影響します。

  • 顧客からのクレーム
  • 売上の損失
  • 会社の信頼低下
  • 緊急対応による残業

3-3. トラブル事例③:チーム開発で環境がバラバラ

🎬 シーン:新メンバーのオンボーディング

新メンバー:「開発環境のセットアップ方法を教えてください」

先輩:「えーと、まずPythonをインストールして、次にPostgreSQLをインストールして、pip installでライブラリを入れて…」

(3時間後)

新メンバー:「まだエラーが出ます…」

先輩:「あー、環境変数設定してないんじゃない?」

(さらに1時間後)

新メンバー:「まだ動きません…」

先輩:「うーん、ちょっと見せて…あ、PostgreSQLのバージョンが違うな」

なぜこの問題が起きるのか?

【チームの環境の例】 Aさん(リーダー): – OS: Mac – Python: 3.10 – PostgreSQL: 14.0 Bさん(ベテラン): – OS: Windows – Python: 3.9 – PostgreSQL: 13.0 Cさん(新メンバー): – OS: Windows – Python: 3.11 ← 最新版を入れてしまった – PostgreSQL: 15.0 ← バージョンが違う 【発生する問題】 – 環境構築に数時間〜数日かかる – 「私のPCでは動く」問題が頻発 – コードレビューで再現できない不具合 – 新メンバーの教育コストが高い

3-4. コンテナでこれらの問題を解決

✅ コンテナを使うと…

「このコンテナを使ってください」の一言で解決!

【コンテナで解決】 ① コンテナに環境をすべて定義 – Python 3.10(バージョン固定) – pandas 2.0.1(バージョン固定) – PostgreSQL 14.0(バージョン固定) – 設定ファイル – 環境変数 ② チーム全員に同じコンテナを配布 ③ 結果 – 全員が同じ環境で開発 → 「私のPCでは動く」問題が消える – 環境構築が数分で完了 → 新メンバーもすぐに開発開始 – 開発環境 = 本番環境 → リリース時のトラブルが激減

🎯 4. コンテナが解決する4つの問題

ここまでの内容を整理して、コンテナが解決する4つの主要な問題を見ていきましょう。

4-1. 問題①:環境の差異

❌ コンテナなしの場合
  • 開発者ごとに環境が違う
  • 開発環境と本番環境が違う
  • 「私のPCでは動く」問題が多発
  • 環境構築に時間がかかる
✅ コンテナありの場合
  • 全員が同じコンテナを使用
  • 開発 = 本番の環境が実現
  • 環境起因のトラブルが激減
  • 環境構築が数分で完了

4-2. 問題②:依存関係地獄(Dependency Hell)

📚 依存関係地獄とは?

複数のアプリケーションが、同じライブラリの異なるバージョンを必要とする状況です。

【依存関係地獄の例】 アプリケーションA(売上分析システム): – 必要:pandas 1.x – 理由:pandas 2.xで動かない古いコードがある アプリケーションB(顧客分析システム): – 必要:pandas 2.x – 理由:pandas 2.xの新機能を使っている 【問題】 同じパソコンにpandas 1.xと2.xを両方インストールできない! → どちらか一方しか動かない…

コンテナで解決

【コンテナで解決】 コンテナA(売上分析システム) ├─ アプリケーションA └─ pandas 1.x コンテナB(顧客分析システム) ├─ アプリケーションB └─ pandas 2.x → それぞれのコンテナは独立しているので、両方同時に動く! → お互いに干渉しない

4-3. 問題③:環境構築の時間

❌ コンテナなしの場合

新メンバーの環境構築:

  • Pythonインストール(30分)
  • PostgreSQLインストール(30分)
  • ライブラリインストール(30分)
  • 設定ファイル作成(30分)
  • エラー対応(2時間)
  • 合計:約4時間
✅ コンテナありの場合

新メンバーの環境構築:

  • Docker Desktopインストール(10分)
  • コンテナダウンロード(3分)
  • コンテナ起動(10秒)
  • 合計:約15分
  •  
  • 約16倍速い!

4-4. 問題④:スケーラビリティ(拡張性)

📈 スケーラビリティとは?

システムへのアクセスが増えた時に、処理能力を拡張できる性質のことです。

【シナリオ:ECサイトのセール期間】 通常時: – アクセス数:1,000件/分 – サーバー:1台で対応可能 セール開始: – アクセス数:10,000件/分(10倍に急増!) – サーバー:1台では処理しきれない → サーバーを増やす必要がある
❌ コンテナなしの場合
  • 新しいサーバーを用意(1時間〜)
  • OSをインストール(30分〜)
  • アプリをインストール(1時間〜)
  • 設定を行う(30分〜)
  • 合計:数時間〜数日

→ セールが終わってしまう…

✅ コンテナありの場合
  • コンテナを複製するコマンドを実行
  • コンテナ起動(数秒)
  • 合計:数秒〜数分
  •  
  •  

→ 急なアクセス増にも即座に対応!

4-5. コンテナのメリットまとめ

メリット 説明 実務での効果
一貫性 どこでも同じように動く 「私のPCでは動く」問題が消える
隔離性 他のアプリケーションに影響しない 依存関係の競合を回避
軽量性 起動が速く、リソース効率が良い 開発サイクルが高速化
移植性 簡単に別の環境に移せる 開発→本番の移行がスムーズ
拡張性 必要に応じて増やせる 負荷に応じた柔軟な対応

📜 5. コンテナ技術の歴史

コンテナ技術は突然登場したわけではなく、長い歴史があります。
その歴史を知ることで、なぜDockerが現在の地位を確立したのかが理解できます。

5-1. コンテナ技術の進化年表

年代 出来事 説明
2000年 FreeBSD Jails UNIX系OSで最初の「コンテナ的な」機能が登場。プロセスを隔離する仕組み。
2006年 Googleがプロセスコンテナを開発 Googleが社内で使用。後にcgroupsとしてLinuxに統合。
2008年 LXC(Linux Containers)登場 Linuxでコンテナが使えるように。しかし、設定が複雑で一般には普及せず。
2013年 Docker登場 🎉 コンテナを誰でも簡単に使えるツールとして登場。爆発的に普及。
2014年 Kubernetes発表 Googleがコンテナ管理ツールを発表。大規模なコンテナ運用が可能に。
2015年〜 業界標準化 Docker、Kubernetesがデファクトスタンダード(事実上の標準)に。

5-2. なぜDockerが成功したのか?

コンテナ技術自体は2000年代から存在していましたが、Dockerの登場まで普及しませんでした
Dockerが成功した理由を見てみましょう。

成功要因 従来の問題 Dockerの解決策
使いやすさ LXCは設定が複雑で、専門知識が必要 コマンド1つでコンテナを起動可能
Docker Hub コンテナイメージの共有が困難 誰でもイメージを公開・取得できる場を提供
Dockerfile 環境構築手順が属人的 環境をコードで記述でき、再現性が高い
クロスプラットフォーム LXCはLinux専用 Windows、Mac、Linuxで動作
エコシステム 関連ツールが少ない Docker Compose、Docker Swarmなど豊富なツール

5-3. Dockerの現在の普及状況

📊 Dockerの普及データ
  • 世界中で数百万人の開発者が使用
  • Docker Hubには1000万以上のコンテナイメージが公開
  • Fortune 500企業の多くがDockerを採用
  • AWS、Azure、GCPなど主要クラウドが完全対応
  • 求人市場で「Docker経験」は重要なスキルに
💡 データエンジニアリングとDocker

データエンジニアリングの分野では、以下のようなツールをDockerで動かすことが一般的です。

  • PostgreSQL:データベース
  • Apache Airflow:ワークフロー管理
  • Apache Spark:大規模データ処理
  • Jupyter Notebook:データ分析

このコースでは、これらすべてをDockerで構築する方法を学びます。

📝 STEP 1 のまとめ

✅ このステップで学んだこと
  • コンテナとは、アプリケーションと実行環境を1つにまとめた「箱」
  • 仮想マシンはOS全体を仮想化、コンテナはアプリケーションレベルで隔離
  • コンテナは軽量・高速・効率的(起動が数秒、サイズが数十MB〜数百MB)
  • 「私のPCでは動く」問題をコンテナが解決
  • 依存関係地獄もコンテナで解消できる
  • コンテナは環境構築の時間を劇的に短縮(数時間→数分)
  • Dockerの登場(2013年)で、コンテナが誰でも使える技術に
💡 重要ポイント:なぜコンテナを学ぶのか?

コンテナは単なる技術ではなく、開発の考え方を変えるパラダイムシフトでした。

  • 「環境の違い」という長年の悩みを解決
  • 開発者が本当に大切なこと(コードを書くこと)に集中できるようになった
  • 開発から本番までのデプロイが劇的に簡単になった
  • 現代のアプリケーション開発では必須のスキル
🎯 次のステップの予告

次のSTEP 2では、「Dockerが解決する問題」をより実践的な視点で学びます。

  • 依存関係地獄の具体例と解決方法
  • デプロイの複雑さとDockerによる簡素化
  • スケーラビリティの課題
  • Dockerが業界で選ばれる理由

実際のビジネスシーンでDockerがどう役立つのかを理解していきましょう!

📝

学習メモ

Docker・コンテナ技術入門 - Step 1

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE