DOCKER

Docker、
便利だけど
中で何してるの?

「なんか動いてる」から
「何をしているか分かる」

Docker、呪文みたいじゃないですか?

docker compose up と打つと何かが動き出す。
docker exec -it ... bash と打つとなぜか別の画面になる。 …でも、何が起きてるか説明できますか?
今日は 「Docker って結局なに?」 を、
1つずつ疑問を解きながら見ていきます。
QUESTION 01

そもそも Docker って
何をしてるの?

Docker は プログラムとデータを箱に入れて隔離する 仕組みです。
この「箱」のことを コンテナ と呼びます。 コンテナの中には、プログラム・データ・動くために必要な部品がまとめて入っています。

マンションの部屋をイメージしてみる

マンションの各部屋は、壁で仕切られています。
隣の部屋の中身は見えないし、触れない。

でも、水道や電気といった建物の基盤は共有している。

Docker のコンテナも同じです。
各コンテナは完全に独立しているけれど、
マシンの基盤(OS の心臓部)は共有しています。

MACHINE (マンション) コンテナ A Web サーバ + データ + 部品 コンテナ B DB サーバ + データ + 部品 ← 壁で隔離 → 共有の基盤(OS の心臓部) 部屋は独立。でも基盤は共有。
QUESTION 02

なぜ隔離する必要があるの?

同じマシンに複数のプログラムを直接入れると、
お互いが干渉し合って壊れることがあるからです。
WITHOUT DOCKER
直接入れると…

ライブラリのバージョンが競合したり、
1つ更新すると他が壊れたり、
「自分の環境では動く」問題が起きる。

WITH DOCKER
隔離すると…

各コンテナが独自のバージョンを持てる。
他のコンテナに影響しない。
チーム全員に同じ環境を配れる。

QUESTION 03

基盤を共有」って
どういうこと?

Docker を理解するには、まず OS のしくみ を知ると分かりやすくなります。
OS は大きく分けて 2つの部品でできています。

OS = カーネル + 周辺部品

KERNEL
カーネル = OS の心臓部

CPU・メモリ・ディスクなどのハードウェアを直接操作する唯一の存在

PERIPHERAL
周辺部品 = 翻訳者

プログラムからの命令を受け取って、カーネルに橋渡しする役目。
コマンドやライブラリなどがこれにあたります。

プログラム(アプリ) 命令を出す 周辺部品 コマンド・ライブラリなど 翻訳して渡す カーネル(心臓部) ハードウェア(CPU / メモリ / ディスク)

Docker のコンテナは
カーネルを借りている

コンテナは隔離されているので、ホスト OS の周辺部品にはアクセスできません。
だから 自分専用の周辺部品を持っています
でもカーネル(心臓部)は ホストと共有
カーネルを共有するから、Docker は軽くて速い。 仮想マシン(VirtualBox 等)は OS をまるごとコピーするから重い。Docker はカーネルを借りるだけ。
QUESTION 04

イメージ」と「コンテナ
って何が違うの?

イメージ = テンプレート(型)
コンテナ = イメージから作った実体(製品)
たい焼きの型(イメージ)から、たい焼き(コンテナ)を何個でも作れるイメージです。

1つの型から何個でも作れる

MySQL イメージ テンプレート CONTAINER 開発用 CONTAINER テスト用 CONTAINER 本番用 全部同じ型から作られた同じ環境
DOCKER HUB
イメージの配布サイト

mysql, nginx, ruby など、すぐ使える公式イメージが揃っています。

慣れるまでは公式イメージを使うのが安心です。

QUESTION 05

なぜコンテナの外から
コマンドを打っても動かないの?

コンテナの中と外は 完全に別の世界 だからです。
MySQL も、そのコマンドも、全部コンテナの中にしか存在しない。
だから外から打っても「そんなコマンドないよ」と言われる。

外から打っても届かない

HOST (あなたの Mac / Windows) ターミナル $ mysql ... X コンテナ MySQL + データ + コマンド mysql コマンドはコンテナの中にしかない だからホストで打っても「command not found」 中に入るには docker exec を使う
NG: ホスト側で直接実行 $ mysql -u root → command not found
OK: コンテナに入ってから実行 $ docker exec -it my-db bash
→ コンテナの中に入る
→ その中で mysql -u root
QUESTION 06

コンテナって
ずっと使い続けるもの?

いいえ。Docker の基本思想は 「作って、使って、捨てる」 です。
更新が必要になったら、コンテナを修理するのではなく、
新しいイメージから作り直す方が確実で速い。 紙コップのようなもの。汚れたら洗わずに捨てて、新しいのを使う。
QUESTION 07

コンテナを捨てたら
データも消えるの?

はい。何もしなければ コンテナの中のデータは一緒に消えます
でも、DB のデータや設定ファイルは消えたら困りますよね。
そこで使うのが Volume(ボリューム)です。

Volume = 外付けの保存場所

Volume は、コンテナの外側(ホスト側のディスク)にデータを保存する仕組みです。

  • データはホスト側に保存される
  • コンテナを消してもデータは残る
  • 新しいコンテナにつなぎ直せる

コンテナは入れ物、Volume は中身。
入れ物を捨てても、中身は出しておけば大丈夫。

コンテナ MySQL アプリ (プログラム本体) 接続 VOLUME DB のデータ ホストのディスク(実体はここ) コンテナを消しても Volume は残る
QUESTION 08

なぜ Volume を
消してはいけないの?

コンテナやイメージは、いつでも作り直せます。
でも Volume の中身(データ)は、消したら二度と戻りません。
Volume を消す = DB のデータを完全に消す、ということ。 コンテナは紙コップ、Volume は中身の飲み物。コップは捨てていいけど、中身ごと捨てたら終わり。

消していいもの、ダメなもの

OK
コンテナ → いつでも作り直せる
OK
イメージ → Docker Hub から再取得できる
NG
Volume → 消したらデータが完全に消失する
特に docker system prune --volumes は全 Volume を一括削除するので要注意。
QUESTION 09

よく使うコマンド、
何をしてるの?

1
docker run → イメージからコンテナを作って起動する
2
docker exec -it ... bash → 動いているコンテナの中に入る
3
docker stop → コンテナを停止する
4
docker compose up → 複数コンテナをまとめて起動する
5
docker build → Dockerfile からイメージを作る
QUESTION 10

Mac や Windows でも
動くの?

Docker は Linux の仕組みを使っています。
Mac や Windows では Docker Desktop が裏で軽量な Linux を動かしてくれます。
Docker Desktop をインストールすれば、あとは意識する必要なし。 Windows の場合は WSL2(Windows Subsystem for Linux)が必要です。

今日のまとめ

1
Docker はプログラムを隔離する箱(コンテナ)を作る仕組み
2
コンテナは OS のカーネルを共有するから軽くて速い
3
コンテナの外からコマンドは届かない。中に入るには docker exec
4
コンテナは使い捨て。イメージから何度でも作り直せる
5
Volume だけは消さない。コンテナは消していいけど、データは戻らない
DOCKER

呪文が言葉に変わったら
もう怖くない。

まずは docker exec で中に入ってみよう。
— ご清聴ありがとうございました
1 / 21