🤢

Dockerの本質理解備忘録

に公開4

はじめに

私はDockerが大の苦手です!!イメージを掴むまでに大変時間がかかりました!!
本も読みましたし、Udemyの講座も終えました!!それでも、ピンっとこなかったんです、、
理解力が乏しい、、悲しい、、、。
Dockerを学ぶ上で、「コンテナって結局何なの?」という疑問を持つ方は多いと思います。
この記事では、Dockerの本質を初心者にも分かりやすく、あとで見返してもすぐ理解できるようにまとめておきたいと思います。


1. Dockerコンテナの本質:「小さなLinux PC」

結論から言うと

Dockerコンテナ = 独立した小さなLinux PCが仮想的に動いている

このイメージを持つとかなり理解が進みました( `ー´)ノ、、、私だけかな(´;ω;`)?

具体例で理解する

mysql:8.0というDockerイメージを使うとき、実際には、

mysql:8.0コンテナの中身
┌─────────────────────────────┐
│  OS: Debian Linux(軽量版)  │
│                             │
│  ├── /usr/bin/mysqld        │  ← MySQLプログラム本体
│  ├── /etc/mysql/            │  ← 設定ファイル
│  └── /var/lib/mysql/        │  ← データベースファイル
│                             │
│  MySQL 8.0がインストール済み  │
└─────────────────────────────┘

つまり、Linux OSごと入っているんです(たぶん、、)。


2. よくある誤解と正しい理解

❌ 誤解:MySQLだけが入っている(←私はこう思ってました(´;ω;`))

「mysql:8.0イメージ = MySQLプログラムだけ」

✅ 正解:OS + MySQLがセットで入っている

「mysql:8.0イメージ = Debian Linux + MySQL 8.0 + 必要なライブラリ」

なぜこの理解が重要か

Ubuntu を入れてから MySQL をインストールする、という2段階の作業は不要です。
dockerを学んでマルチステージビルドなんかを習った日には、dockerファイルにきちんと、丁寧に、まずは、ubuntuを入れて~、そしたら次に~とかをdockerfileに書いていくんだろうな~って思っていました泣。

# ❌ こんな手順は不要
docker run ubuntu:20.04
# コンテナの中に入る
# apt-get install mysql...

# ✅ これだけでOK
docker run mysql:8.0  # OS込みで全部入ってる!

3. Dockerイメージの裏側を見てみる

mysql:8.0イメージは、実際にはこんなDockerfileから作られています!!

# ステップ1: ベースとなるOSを選ぶ
FROM debian:bullseye-slim

# ステップ2: MySQLをインストール
RUN apt-get update && \
    apt-get install -y mysql-server-8.0

# ステップ3: データを保存する場所を設定
VOLUME /var/lib/mysql

# ステップ4: コンテナ起動時にMySQLを実行
CMD ["mysqld"]

つまり、**「Debian Linuxを入れて、その上でMySQLをインストールして、起動コマンドを設定する」**という作業が、すでに完了した状態でパッケージ化されているのがDockerイメージです。すばらしい✨


4. ローカルインストールとの比較

Mac/WindowsにHomebrewでMySQLを入れた場合

あなたのMac
├── macOS
└── /opt/homebrew/opt/mysql/  ← ここにMySQLがインストールされる
    └── /opt/homebrew/var/mysql/  ← データベースファイル

Dockerでmysql:8.0を使った場合

あなたのMac
├── macOS
└── Dockerコンテナ(独立した環境)
    └── Debian Linux
        └── /var/lib/mysql/  ← データベースファイル

ポイント:コンテナの中は別のOS(Linux)が動いている


5. 「コンテナは1つのPCが構築される」イメージで理解する

Macの中で複数の仮想PCが動くイメージ

わたしのMac(ホストマシン)
┌─────────────────────────────────────────┐
│  macOS                                  │
│                                         │
│  ┌─────────────┐  ┌─────────────┐       │
│  │ コンテナ1    │  │ コンテナ2    │       │
│  │ (MySQL PC)  │  │ (PHP PC)    │       │
│  │             │  │             │       │
│  │ Debian      │  │ Debian      │       │
│  │ + MySQL 8.0 │  │ + Apache    │       │
│  │             │  │ + PHP 8.2   │       │
│  └─────────────┘  └─────────────┘       │
│        ↑                    ↑           │
│        └───ネットワーク接続───┘           │
└─────────────────────────────────────────┘

各コンテナは独立した小さなLinux PCとして動作し、ネットワークでつながっています。


6. MAMP vs Docker の構成比較

MAMPの場合

MAMPアプリケーション(1つのパッケージ)
├── Apache(Webサーバー)
├── MySQL(データベース)
└── PHP(プログラミング言語)

↓ 起動ボタンを押すと

全部まとめて起動(一体型)

Dockerの場合

docker-compose.yml(設定ファイル)

├── Webコンテナ(独立したLinux PC)
│   └── Apache + PHP

└── DBコンテナ(独立したLinux PC)
    └── MySQL

↓ docker-compose up すると

それぞれが独立して起動(分離型)

Dockerは役割ごとに分けて管理できるのが特徴です。


7. 実際のdocker-compose.ymlで見る構成

version: '3.8'

services:
  # Webサーバー用のコンテナ(1台目のPC)
  web:
    image: php:8.2-apache  # Debian + Apache + PHP 8.2
    ports:
      - "8080:80"
    volumes:
      - ./laravel-project:/var/www/html

  # データベース用のコンテナ(2台目のPC)
  db:
    image: mysql:8.0  # Debian + MySQL 8.0
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: laravel_db
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql  # データ永続化

volumes:
  mysql-data:  # データ保存用の領域

これを実行すると

┌─────────────────────┐    ┌─────────────────────┐
│  webコンテナ         │    │  dbコンテナ          │
│  (Debian Linux)     │ ←→ │  (Debian Linux)     │
│                     │    │                     │
│  - Apache起動中      │    │  - MySQL起動中      │
│  - PHP 8.2実行可能   │    │  - ポート3306待機    │
│  - ポート80待機      │    │  - データ保存中      │
└─────────────────────┘    └─────────────────────┘

2台の独立したLinux PCが連携して動いているイメージです。


8. 通常のPCとの違い:軽量・高速の秘密

通常の仮想マシン(VirtualBox等)

あなたのMac
└── macOSカーネル
    └── 仮想マシン
        └── Linux OSカーネル(完全に独立)
            └── MySQL

重い・起動が遅い(数分かかる)

Dockerコンテナ

あなたのMac
└── macOSカーネル(これを共有!)
    ├── コンテナ1(Linuxの上層部分だけ)
    │   └── MySQL
    └── コンテナ2(Linuxの上層部分だけ)
        └── Apache + PHP

軽い・起動が速い(数秒)

なぜ軽量なのか

  • OSの心臓部(カーネル)はMacのものを共有
  • コンテナには「Linux の見た目」だけが入っている
  • だから複数のコンテナを同時に動かしても軽い

でも、使う側からは「独立したLinux PC」として見えます。これがDockerの賢いところです。


9. よくある質問

Q1: mysql:8.0のOSは何?

A: Debian Linux(軽量なLinuxディストリビューション)

公式イメージの多くはDebianベースですが、Alpine Linuxなどさらに軽量なものもあります。

Q2: UbuntuをベースにMySQLをインストールする必要は?

A: 不要です

mysql:8.0イメージには、すでにOS込みで全部入っています。

Q3: コンテナの中のファイルはどこにある?

A: コンテナ内部の独立した領域

例:/var/lib/mysql/(コンテナ内のパス)

ホストマシン(あなたのMac)とは別の場所です。データを永続化したい場合はvolumesを使います。

Q4: 1つのコンテナに全部入れられない?

A: できるけど、おすすめしません

Dockerの哲学は「1コンテナ = 1役割」です。

理由:

  • 個別に再起動できる
  • バージョン管理が簡単
  • スケーリング(複数台に増やす)が容易

10. まとめ:Dockerコンテナの本質

覚えておくべき3つのポイント

  1. Dockerコンテナ = 小さな独立したLinux PC

    • OSごと入っている
    • 独立した環境として動作
  2. Dockerイメージ = OS + ソフトウェアのセット

    • mysql:8.0 = Debian + MySQL 8.0
    • php:8.2-apache = Debian + Apache + PHP 8.2
    • すでに構築済みなので、すぐ使える
  3. 軽量・高速の理由 = OSカーネルを共有

    • 完全な仮想マシンではない
    • でも使う側からは独立したPCに見える

比較表

項目 ローカルインストール Docker
インストール先 Mac本体 独立したコンテナ内
OS macOS Linux(各コンテナごと)
分離性 なし 完全に分離
削除の容易さ 難しい 簡単(コンテナ削除だけ)
環境の共有 難しい 簡単(設定ファイル共有)

おわりに

Dockerは「小さなLinux PCを簡単に作って動かせるツール」と理解すると、全体像がつかみやすくなります。

各コンテナが独立したPCとして動作し、それらがネットワークで連携する。この本質を理解していれば、複雑な構成も怖くありません!!多分、、、引き続き、学習頑張ります🔥

Discussion

PyonPyon
あなたのMac
└── macOSカーネル(これを共有!)
    ├── コンテナ1(Linuxの上層部分だけ)
    │   └── MySQL
    └── コンテナ2(Linuxの上層部分だけ)
        └── Apache + PHP

上記の図には少し齟齬がありまして、Mac上で動かす場合は正確には「macOS上にLinux仮想マシンを1つ作り、コンテナはそのLinux仮想マシンのカーネルを共有する」という構造になります

あなたのMac
└── macOS
    └── Linux仮想マシン(このカーネルを共有)
        ├── コンテナ1(Linuxの上層部分だけ)
        │   └── MySQL
        └── コンテナ2(Linuxの上層部分だけ)
               └── Apache + PHP

macOSとLinuxはUnix系でよく似たインターフェースを持ちますが、カーネルは別物になります。
そのため、macOSのカーネルをLinux系のコンテナに共有することは出来ません。WindowsやmacOSでDocker(Linux系のコンテナ)を動かす場合、間に1台分だけLinuxの仮想マシン(VM)が立つ構造になります

例えばホストPCがLinuxの場合は、まさに直接カーネルの共有する事ができるため、このようにVMを挟む必要がなくなります

あなたのLinux PC
└── Linuxカーネル(これを共有!)
    ├── コンテナ1(Linuxの上層部分だけ)
    │   └── MySQL
    └── コンテナ2(Linuxの上層部分だけ)
        └── Apache + PHP
12
nekorobinekorobi

DockerはLinux kernelをhostと共有してるので独立してはいない気が…

PyonPyon

【追記】
ごめんなさい、ちゃんと「完全な仮想環境ではない」ということは理解して書かれてましたし、記事の指向からして「小さなLinux」として理解することで初学者のイメージを助けるものでしたね

以下はそれをちゃんと読まずに説教じみて書いてしまった駄文ですが、せっかくなので残しておきます


「小さなLinuxを作る」「各コンテナが独立したPCとして動作する」は、抽象的な表現としては初学者の理解の助けになると思います。

その上で「本質理解」を深めていくのであれば、次はDockerがどのようにして上記のような動作を実現しているかを調べてみると良いと思います。
Dockerコンテナが行っているのは厳密には「独立したPCとして動作」しているのではなく「プロセスの隔離」であることが次のステップでは見えてくると思います

開発用に普段使いする上ではあまり意識する必要はありませんが、運用環境に載せるような場合にはこういった本質を知らないと痛い目に遭う可能性があります。

4
OZOZ

えぇ!?
始めてzennの記事でコメント📝いただきました✨嬉しい✨
Pyonさん、ありがとうございます😊

本質を理解したいので、Pyonさんのアドバイスをもとに調べてみようと思います!

ありがとうございました(^ ^)

3