【初級編】Dockerってそもそも何？基礎からわかりやすく解説！

# はじめに
今更ではありますが、Dockerについて基礎から勉強したのでまとめます。
全てのコマンドの細かいオプションとかはまとめていません。
本記事の目的はDockerというツールを知るという初歩的（だけど重要）なものです。

# Dockerってそもそも何？
Docker（ドッカー）とは「仮想環境の構築ツール」です。

## 仮想環境って何？
仮想環境というのは、コンピュータの中に疑似的に作る仮の空間（何かを実現する場）のことを指します。もう少し噛み砕くと、**本来物理的に必要なものを仮想的にあるようにして動かすことのできる環境**のことです。

![スクリーンショット 2020-11-15 18.17.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/623708/a08a5358-0d13-70e1-8ff4-d86c64b2c437.png)
参照：[仮想マシンとは？よく聞く"仮想化" "仮想マシン"の基礎知識と特徴を解説](https://ferret-plus.com/8461)


例えば、Windows環境の中で、仮想的に作られたLinux OS環境や、別のWindows OS環境が用意できるというのが仮想環境の例です。一般的に仮想環境をつくる土台となるOSを「ホストOS」、仮想環境上のOSを「ゲストOS」と呼びます。仮想環境を構築することで、Linux用のパソコンとWindows用のパソコンをそれぞれを物理的に用意する必要がなくなり、一つのハードウェアで一元管理できるようになります。
また、メモリやハードディスク容量などを柔軟に調整ができるというメリットもあります。仮想環境を構築すれば、ハード機器の節約にもなります。


### 仮想マシンの種類
仮想マシンには、いくつか種類があります。それぞれのメリット、デメリットについて簡単に説明します。

①ホスト型
②ハイパーバイザー型
③コンテナ型

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/623708/d8c088b6-5c1c-368d-ccd8-476b78f05632.png)
参照：[仮想環境とは？メリットやデメリット、代表的なソフトウェア「VMware」について解説](https://bcblog.sios.jp/what-is-virtualenvironment-vmware/)

#### ①ホスト型
パソコンやサーバにホストOSをインストールし、そのOS上に仮想環境作成ソフトウェアをインストールして構築するタイプです。ホストOSの上にゲストOSが並びます。

・メリット：既存のサーバなどにインストールすればすぐに利用でき、手軽に始められる。
・デメリット：ホストOSを起動しなければならない。ハードウェアを起動した際に、ホストOSが立ち上がるまで時間がかかる場合がある。

#### ②ハイパーバイザー型
1つのハードウェアに「ハイパーバイザー」と呼ばれる仮想化ソフトウェアを直接インストールし、仮想化を構築するタイプがハイパーバイザー型です。ホストOSを起動しなくてよいので、ホストOS型と比べて早く起動できます。

・メリット：ホストOSがないため、リソースのほとんどを仮想環境に充てられる。
・デメリット：既存のパソコンやサーバを使い回せず、新しくハードウェアを購入しなくてはいけない。構築する際は、コスト面にも注意する必要がある。
#### ③コンテナ型
ホストOSに「コンテナエンジン」とよばれる仮想化ソフトウェアをインストールし、その中でコンテナと呼ばれる環境を作り、アプリケーションを実行させます。
コンテナにはゲストOSという概念はありません。ホストOSからは、一つのプロセスとして認識されます。そのため、余分なリソースが不要であり、軽快な環境を提供できるのです。実際に使用してみると、アプリケーションを短時間で起動できるでしょう。

・メリット：リソース効率がよく、コストパフォーマンスにも優れている。
・デメリット：新しい技術ということもあり、構築できるベンダーが少ない。便利な管理ツールなどが不足している。

## ここで改めてDockerとは？？

Dockerは前述した通り、「仮想環境の構築ツール」です。その中でも「**コンテナ**」という仮想環境を構築し、そのコンテナの中でアプリケーション、ミドルウェア、OSなどを動かすことができます。コンテナは非常に軽量で、起動や停止などを素早く完了させることができるのが魅力の一つです。
では実際にDockerがどんな仕組みで動くのか見ていきましょう。

# Dockerの仕組み
ここではDocker初心者なら抑えておきたい用語をもとに、Dockerの仕組みについて理解を深めていきます。

・Dockerエンジン
・Dockerコンテナ
・Dockerイメージ

## Dockerエンジンとは？
Dockerエンジンは「Docker自体そのもの」という理解でいいです。Dockerイメージの作成やコンテナ起動などを行うDockerのコアな部分です。このDockerエンジンはホストOS（Windows, Mac, Linux）にDockerをインストールすることで簡単に利用できます。インストールしたらホストOS上にDockerエンジンが動き、その上で各コンテナが動いているという感じです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/623708/c6cdea87-5c94-5188-cbf6-b0112bcd0f1e.png", width="500">

画像参照：https://www.ogis-ri.co.jp/otc/hiroba/technical/docker/part1.html


## Dockerコンテナとは？
DockerコンテナとはDockerエンジン上で動いている仮想環境のことです。
Dockerコンテナでは、CentOSやUbuntsuなどのOSから、NginxやMySQLなどのミドルウェア、RailsやWordpressなどのアプリケーションまで様々な環境を作ることができます。
これらのコンテナは「＊＊ホストOSのカーネル（Linuxカーネル）を利用して動いている＊＊」という特徴があります！
Linuxカーネルというのは、OSに必要な基本機能を集めた中心核のようなソフトウェアのことです。

ここで疑問なのが、「**Linuxを持たないWindowsやMac上でもDockerは立ち上がるのか？**」ということです。
答えは、立ち上がります！
なぜかというと、Docker起動の裏でLinux仮想マシンが動くようになっているため、各コンテナもこの仮想マシン上で動く仕組みになっているのです。

またこの仮想マシンであるLinuxはコンテナごとに独立している訳ではなく、コンテナ全てで共通したものが使われるため、ホストマシンのリソース（CPUやメモリ）を節約しながら動いているのです。そうすることで**コンテナ自体は軽量化されますし、何よりDockerのコンテナの起動が早い理由**なのです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/623708/2c9da8b1-609f-20e5-6484-84624142df97.png", width="500">

参照：https://kitsune.blog/docker-summary#Docker%25E3%2582%25B3%25E3%2583%25B3%25E3%2583%2586%25E3%2583%258A%25E3%2581%25A8%25E3%2581%25AF

## Dockerイメージとは？
DockerイメージとはDockerコンテナを作るための**マニュアル**みたいなものです。
このDockerイメージをもとにコンテナが作られます。各イメージは元のイメージとなる「ベースイメージ」となるものに、「レイヤー（層）」を重ねることで新しいイメージを作成することができます！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/623708/5ed34940-115f-5942-3806-fd1484ad94c1.png" width="500">
画像参照：https://dzone.com/articles/optimizing-spring-boot-application-for-docker

#まとめ
DockerについてとDockerの仕組みについて簡単にまとめました。
Dockerの概要は理解できても、Linuxの基礎知識がないとDocker環境設定で詰まってしまうと思うので、Linuxについても勉強していきたいところです。