Dockerの基本

## まえがき
Dockerについてざっくり理解できたのでメモ。
他にも学んだことはここに追加していく・

## Dockerとは複数のプログラムを隔離する仕組み

これにより同じサーバー内でも複数のプログラムを隔離できる仕組み。

これにより同じ環境内に複数のプログラムを配置しなくていい。

### 従来の環境

従来ならば同じサーバー、すなわち同じ環境内に複数のソフトウェアを配置していた。

![99AD1B73-3AF3-4EEB-831D-83CE86B69C51.jpeg](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/2003fedd-4b35-4bd2-a1b1-04152a36028c/99AD1B73-3AF3-4EEB-831D-83CE86B69C51.jpeg)

### Dockerの環境

Dockerを使えば同じサーバー内でも、複数の独立した環境を作る事ができるので、ソフトウェアを独立させる事ができる。

![71DE5B4C-5000-41E1-A682-504AE4CBC16A.jpeg](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/01df4d1b-f91e-400f-b2c7-6fefc7efdd63/71DE5B4C-5000-41E1-A682-504AE4CBC16A.jpeg)

## Dockerはサーバー上で使用される

基本的には。クライアント側でも使えるが、Dockerはサーバー側で使われる事がほとんど。

### サーバーの2種類の意味

- 機能的な意味のサーバー（Webサーバー、メールサーバーなど）
- 物理的な意味のサーバ（目に見える、机に置いてある）

そして物理的なサーバーの中に機能的なサーバーを複数含めることができる。

### サーバーの機能はソフトウェアで決まる

サーバーにApacheをインストールした場合、ApacheはWebサーバーの機能を提供するソフトなので、Webサーバーになる。メール機能のソフトをインストールした場合、メールサーバーになる。

Webサーバーの機能のソフトと、メール機能のソフトをインストールするとWebサーバー兼メールサーバとなる。

## DockerEngineとコンテナ

- コンテナとは独立した環境を実現する箱。箱の中に好きなソフトウェアを入れることで独自の環境を作ることができる。またコンテナという箱のおかげで周りの世界から切断されるので、独立した環境を実現してくれる。
- コンテナは容量が許す限り、いくらでもおける。

![1DD43844-69AD-4A3C-80CC-B4F5D80526A9.jpeg](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/14bf7a2e-9378-444c-bb79-dec428d929f5/1DD43844-69AD-4A3C-80CC-B4F5D80526A9.jpeg)

### コンテナはイメージから作られる

イメージとはコンテナの設計図。イメージからコンテナが作られる。

![26D3D83D-6C97-4287-89E8-BCAD9D59BFC5.jpeg](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/03210a25-b96d-487f-b9e5-9a7ee4773ede/26D3D83D-6C97-4287-89E8-BCAD9D59BFC5.jpeg)

## サーバー用のOSはLinux系が多数

- LinuxかUnix系がサーバー用のOSとして選ばれることがほとんどである。
- なのでサーバー用のソフトウェアもLinux上で使われることを想定したものが多い。
- こうした理由からDockerはLinux上でしか動かない。

## DockerはLinuxを必要としている。

Linux用に作られたソフトウェアしかコンテナに入れることができない。仮にコンテナに入れれたとしても、動かない。

![29927A9B-B4EB-43F5-8ACD-94BB987F591D.jpeg](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/aea46a9d-da3c-41bf-aa51-416cf497e788/29927A9B-B4EB-43F5-8ACD-94BB987F591D.jpeg)

## コンテナは持ち運べる

Dockerさえ入っていればどんな環境でも大丈夫。OSが違っていてもいい。

Dockerがあれば他のハードウェアでも超簡単に環境を揃えることができる。

![40B1AF46-8F91-49B9-8C62-4E96F9235091.jpeg](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/a004e67a-d833-4b19-9ad0-b7f2fb58bda3/40B1AF46-8F91-49B9-8C62-4E96F9235091.jpeg)

## 複数のプログラムを隔離するメリット

同じ環境内に複数のプログラムを配置することの何が良く無いのか。

### 同じ環境内に複数のプログラムを配置した場合

ソフトAとソフトBがあるとして、共通のライブラリに依存しているとする。

ソフトAをアップデートして、依存ライブラリのバージョンが８以上でないと動かなくなったとする。そしかしソフトBは依存ライブラリのバージョンが７以下でないと動かないとする。片方のアプリケーションが壊れてしまった。

このようなケースを考えると複数のソフトウェアが同じ環境に存在するのは安全ではないと言える。

![02927067-7415-48A9-B6BF-63A6AC7E2D4B.jpeg](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/8d89e140-024c-4031-9fbe-e1812d5a9a52/02927067-7415-48A9-B6BF-63A6AC7E2D4B.jpeg)

### Dockerを使ってコンテナを隔離した場合

Dockerを使ってコンテナ（環境）を分けた場合、それぞれのコンテナにライブラリをインストールする事ができる。依存ライブラリのバージョンが8.0以上じゃないと動かない場合は、ソフトAのコンテナに8.0以上 のバージョンをインストールすればいい。ソフトBの方はバージョン5.0以下しか動かないので、バージョン５をインストールすればいい。このような仕組みによって、アップデートによってアプリケーションが壊れる事がなくなった。

![97D6B8A3-0FE0-415C-9E1F-A0FF13F0BAF7.jpeg](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/cb7fd1c6-455f-484d-8f64-969014842640/97D6B8A3-0FE0-415C-9E1F-A0FF13F0BAF7.jpeg)

### Dockerを使わなくても解消できる方法

Dockerでコンテナを分けなくても、もう一台のサーバーを購入できれば、この問題は解決できる。

しかし莫大なコストがかかる。