「Dockerってつまり何なの！？」「VirtualBoxとの違いは？」Dockerはパソコンのアパートだ！

# 記事を書いた人

はじめまして🤗
事務職から未経験でエンジニアに転職した、のえぞうと申します。
北海道で育ち、現在も北海道に住んでいます。

未経験で辛かったこと、理解するのが難しかったこと、たくさんありました。

この記事を読んでくださる皆様のお幸せとご活躍を願い、ほんの少しでもお役に立てれば、
なまら（北海道弁で「とても」の意）嬉しいです。


# まえがき 

こちらは 🔰初学者向けの易しい記事🔰です

この記事にたどり着いた方々、
少なからずDockerについてのモヤモヤ💭を抱えているのではないでしょか？🤨
また初学者に説明するためのヒントをお探しの方もいるかも知れませんね。

この記事では 
**【🔰初学者がDockerの概念についてイメージを掴む✊】**
ことを主目的としています。

:::note warn
あくまで私自身の経験や考えに基づく内容となっておりますので、『こういう見方もあるんだ』くらいに受け取ってもらえたら嬉しいです。
:::

<dl>
  <dt>具体的なコマンドは記載しません🚫</dt>
  <dd>検索キーワードをリストアップしていますので、必要に応じてご活用ください。
</dd>
  <dt>読み方👀</dt>
  <dd>初学者の方には上から順に読んでいただければと思いますが、ある程度経験のある方はかいつまんでいただければと思います。</dd>
</dl>


👇以下本編です👇

# Dockerって何だろう

**データやプログラムを隔離する仕組み** のことです。

## コンテナとDocker Engine

パソコンの中身をアパートのような細かいお部屋に分ける（隔離する）と考えてみてください。
各部屋は独立しており、データやプログラムなどが住んでいます。

このお部屋のことをDockerの世界では「コンテナ」と呼びます。

![Dockerハイム.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825205/bd6b6207-76fa-8152-110b-377e15ffd2e8.jpeg)

:::note info
キーワード

・Docker Container

:::

## 物件情報（イメージ）からお部屋（コンテナ）を作る

Dockerイメージ🗒とはコンテナの設計書のようなものです。
コンテナに入れるソフトウェアによってイメージ🗒を使い分けます。

（ここは擬人化の限界を感じますが・・）
Dockerイメージ🗒をビルド🛠（大工さんがお家を建てる）すると、間取り・家財道具から住人（ソフトウェア）までセットで様々なお部屋をつくることができるます。
いわばDockerイメージ🗒はお部屋（と住人）の物件情報であり、イメージを元に何個でもお部屋（と住人）を複製することができます。

<details><summary>大工さんが住人を作る？</summary>

大工さんが住人も作り出すというのは少々違和感があるので、
「家族向け5LDK」とか「単身者向け1K」とか、
大きな意味でのお部屋の設計書と思っていただきたいです😓

</details>

お部屋（コンテナ）は複製することができ、Docker上にいくつも載せることができます。
アパートに例えると、建物内に空きスペースがある限りいくつもお部屋を増やすことができ、何人もの住人が入居できるようなものです。

この例をパソコンに当てはめて、まとめると
- 物件情報（お部屋の図面と誰向けか）がDockerイメージ
- 建物のサイズがパソコンのストレージ容量
- お部屋はDockerコンテナ
- 住人はデータやソフトウェア
ということになります。

![DockerBuild.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825205/1556fdc1-f309-d224-5900-802d39ce6457.jpeg)


:::note info
キーワード

・Docker Image
・Docker Build

:::

## なぜお部屋（コンテナ）を分けたいのか

システムはいくつものプログラムで構成されていることが多いです。
もしDocker（などの仮想化技術）を使用しなければ、パソコン1台が壁の無い一つの大広間のようになってしまいます。
人間に例えると、大広間でプライバシーが全く無い共同生活をするイメージです・・。

これでは住人（ソフトウェア）同士で揉め事が起きることもあるかもしれないですね。
あるいは、一人で静かに集中するのが好きな住人は居心地が悪かったり、自分の仕事（タスク）に集中できなかったりするでしょう。

お部屋を分けた方が住人達の間でトラブル😡が起きる可能性が低くなることは想像に難くないと思います。

パソコンの世界では、各ソフトウェアのバージョンが合わなかったり、同じ環境に共存できないソフトウェアがあったりします。
そこで壁を設けることで、こういったパソコンの世界の同居問題を解消し、全体で1つのシステムとして人間の期待通りに仕事をしてもらうことが目的です🏡🏘🏠

# Dockerが動く仕組み

## 仕組み

コンテナの中には「OSのようなもの」があらかじめ用意されています。

一般的に使うコンテナは、1から構築したとしても、
本当に空っぽではありません。
（※本当に空っぽのコンテナを作る方法もありますが、ここでは気にしなくてOKです。）

つまり、

コンテナ（「OSのようなもの」が住んでいるお部屋）
Docker Engine（アパート全体）
OS（土地）
物理的なホストマシン（地球）

![構成図.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825205/626524f3-6cfd-b3e5-1c8d-180dcfb42ee8.jpeg)


ということです。

OSと別に「OSのようなもの」が存在することを疑問に思うかもしれないませんが、
**これこそがDockerの特徴**なのです🧐

<details><summary>OSを擬人化すると？</summary>

ここでは「OS」を「指示を出すもの」と捉えていただければと思います。
ハードウェアは自分で判断したり、良いさじ加減で仕事をする、人間のような能力はありません。

OSは、人間からの入力（命令）を翻訳し、ハードウェアに対してより具体的な指示を出す「通訳兼現場監督」といった存在です。

</details>

### OSを構成するものは？

- 「カーネル」と呼ばれる核になる部分
- カーネルの「周辺の部分」
の2つで構成されています。

『カーネルの「周辺の部分」』がソフトウェアからの連絡をカーネルに伝え、カーネルがハードウェアを操作するします。

:::note info
キーワード

・OS
・カーネル

:::

### 情報や命令の流れ

プログラム
↓
カーネル周辺部分（OS）
↓
カーネル（OS）
↓
ハードウェア

・・ということは、土台となる物理的なホストマシンのOSの「周辺の部分」が、コンテナの中にあるプログラムの命令を受け取ることができないのです！
（アパートの住人が部屋の中から命令を叫んでも外には聞こえない）

そのためコンテナの中にOSの「周辺の部分」を入れてプログラムの命令を受け取り、
受け取った命令を土台のカーネルに伝える仕組みになっています。

（カーネル周辺の部分は、部屋の中にインターホンを設置して、外に命令を伝えることと似ています。
「あ、配送屋さん！ご苦労様です、荷物そこに置いておいてくださ～い！」）

## VirtualBoxとかも聞くけど、なんかDockerの方が良さそうって聞く・・

DockerやVirtualBoxは仮想化技術という点では同じものです。

**決定的な違いは「カーネルをホストOSと共有するか否か」** にあります。

VirtualBoxはゲストOSごとに仮想環境を構築するが、
DockerはホストOSのカーネルを共有するため、より軽量かつ高速な環境を利用できます。

「軽い」とか「VirtualBoxより良い」とか言われるのは、多くの場合このためだと思われます。

:::note info
キーワード

・仮想化技術

:::

# あとがき

**私は正直、コーディングが得意ではありません😥**
今でも分からないことだらけだし、始めは本当にコードを読むのもままならない状態でした。

的確に質問すらできなかった私を見捨てず、どこがわからないのかを確認しながら、1つ1つ丁寧に教えてくれたBTMの仲間の皆さんのおかげで
何とかここまでエンジニアを続けることができました。

でもそんな私だからこそ「わからない」が「わかる」と思っています。

それを活かして、この記事を読んでくれた方のお役に立てたなら、間接的にですがほんの少しだけ恩返しができれば良いなと思っております。

何かを作るということは「楽しさ」や「喜び」だけではありません。
つまずいたり悩んだりする時間も多いと思います。

でも私はBTMでだからここまで続けられた、これは間違いないです🥺

- エンジニア転職を目指している方
- エンジニアだけど今の会社に違和感を感じている方
- 独立に挑戦したけど案件探しや経理業務など様々な雑務に打ちのめされて会社員の福利厚生を再び手に入れたい方

BTMでは切磋琢磨しながら成長していける仲間がたくさんいます。

:::note info

BTMに少しでもご興味を持っていただけましたら、
ぜひ[BTM採用ページ](https://www.b-tm.co.jp/recruit/mid-career.html)を覗いてみてください。
:::

ここまでお読みいただきありがとうございました。
したっけね～👋（それではまた！）