【Docker超入門①】Dockerって何がすごいの?〜仮想マシンとの違いから最初の一歩まで〜
はじめに
実はわたくし、Dockerというものを今まで使ったことがないんです。
案件に参画して1年たちますが、払い出された仮想環境がなぜか数GBしかないので
DockerとかVSCODEとか、今まで全く利用できなかったんです。
そんな私が一念発起して、Dockerを基礎から2週間かけて勉強してみました。
間違ってること、補足あればぜひ教えてください。
シリーズ構成:
- 第1弾(この記事):Dockerって何がすごいの?
- 第2弾:イメージ・コンテナ・Dockerfileを完全理解する
- 第3弾:docker-composeでPython + PostgreSQLを連携させる
それでは、いってみましょう!
1. そもそも仮想マシンとは?
通常、1つのPCには1つのOSが入っています。
でも開発のとき、こんなことが起こるらしい。。
- Linuxが前提のシステムを開発したい → でもPCはWindows...
- 本番環境と同じ環境で動かしたい
- 隔離された環境で開発したい
そんな時に使うのが仮想マシンやコンテナです。
仮想マシンの構造
物理ハードウェア
└── ホストOS
└── ハイパーバイザ(仮想化ソフト)
└── ゲストOS(仮想マシン)
└── アプリ
ハイパーバイザーというのは、ゲストOSを使うための土台を作ってくれるソフトです。仮想CPUの割り振りやメモリ、ディスクなどの割り当てをやってくれます。
ただ、これは結構重たいらしい。
OSを2つ動かさなければならないし、ハイパーバイザーも動作が重ため。
2. コンテナの登場
そこで、コンテナの出番です。
コンテナの構造
物理ハードウェア
└── ホストOS
└── Docker Engine
└── アプリ
コンテナもまた、仮想マシンと同様に独立した環境を作るための技術です。
仮想マシンとの最大の違い
ホストOSを共有しているところ!
OSの一番司令塔的な役割を持っている「カーネル」と呼ばれるシステムがあります。これはCPUやメモリなど、本物のハードウェアに直接指示を出しながら処理を行う、一番土台の役割を持っており、すべてのアプリはこの「カーネル」の上に載っています。
コンテナは、ホストOSのカーネルを使わせてもらって、別環境を疑似的に作成するシステムなのです。
OSを2つも乗っけなくてよい分、非常に軽くなります。
Docker EngineはホストOSのカーネルといろいろやりとりしてくれる役割を担っています。
比較まとめ
| 項目 | 仮想マシン | コンテナ |
|---|---|---|
| 起動速度 | 遅い(分単位) | 速い(秒単位) |
| リソース消費 | 大きい | 小さい |
| 独立性 | 完全に独立 | カーネル共有 |
| 用途 | 異なるOS環境が必要な場合 | 同一OS上での環境分離 |
3. 【補足】Windowsユーザー向け:WSL2って何?
ここはWindowsユーザー向けの補足です。Mac/Linuxの方は読み飛ばしてOK!
DockerはもともとLinux環境前提のシステムです。
「あれ、Windowsなのにカーネル共有できるの??」って疑問がわいたんですが...
できません。
できないので、Windows環境でDockerを動かす時は、「WSL2」(Windows Subsystem for Linux 2)というソフトをDockerの下にインストールします。
これはWindows上で、Linuxカーネルへの指示を処理できるようにするためのソフトです。
まぁ、「Windowsの上でLinux動かすのに必要なんだな〜」くらいに思ってます。
Docker Desktopをインストールすると、一緒にWSL2も入れてくれることが多いので、難しいことは考えなくて大丈夫です!
4. 「環境差異」という地獄を理解する
システムを構築する際は基本、環境が分かれていることが多いです。
「開発環境」「検証環境」「本番環境」 ですね。
(もっとたくさん環境を作ってるプロジェクトもあります。私はマックス8個環境があったことがあります。移送が地獄だった...)
で、開発環境では動いていたのに、本番環境では動いてなかった! なんてことは結構起きるのです。
- 前提のライブラリが入ってなかった〜
- テーブルがなかった〜(あってはならないんですけど、あったんですよ実際...)
なので環境管理はシステム開発者にとって実は超重要!
コンテナが解決する
コンテナは独立した環境を作るソフトなんですが、この環境、簡単に他に持ち出して適用することができるのです!
開発環境で作ったコンテナをそのまま検証、本番環境にもっていく、なんてこともできるわけ。
これで、環境差異を大きく減らせますね。
また、プロジェクトに新規参画してきた人が、他の開発者さんと同じ環境で開発・テストを行うために、コンテナをもらってきて自分の環境上に建てる、なんて使い方もGOODです!
5. 初めてのDocker起動:hello-world
ではでは、初めてのDocker起動です!
Dockerがインストールされているか確認
PowerShell(私はWindowsなので)を開いて...
docker --version
Docker version 28.x.x, build xxxxxxx
みたいに表示されればOK!入ってそうですね。
hello-worldを実行
docker run hello-world
何かいっぱい出てきた...
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
17eec7bbc9d7: Pull complete
Digest: sha256:f7931603f70e13dbd844253370742c4fc4202d290c80442b2e68706d8f33ce26
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
出力の意味を読み解く
| メッセージ | 意味 |
|---|---|
Unable to find image 'hello-world:latest' locally |
「hello-world」がローカルにないよ! |
Pulling from library/hello-world |
最新のやつ持ってくるよ! |
Status: Downloaded newer image for hello-world:latest |
持ってきたよ! |
Hello from Docker! |
成功! |
これでDockerが正常に動いていることが確認できました!
まとめ
今回以下のことを学びました:
-
仮想マシンとコンテナの違い
- コンテナはカーネルを共有するから軽い
-
Dockerを使う理由
- 環境差異の地獄から解放される
- 同じ環境を簡単に配布・再現できる
-
最初の一歩
-
docker run hello-worldでDockerの動作確認ができた
-
次回
次回は、Dockerを使う上で最も重要な概念である「イメージ」と「コンテナ」について深掘りします。
- イメージ = 設計図、コンテナ = 実体
- 基本コマンド(
pull,run,ps,stop) - Docker Hubからnginxやpostgresを取得して遊ぶ
- 自分でDockerfileを書いてみる