[ぶっちゃけ何?]Docker🐋について解説

# Dockerって何だろう

<details> <summary><strong>目次</strong></summary>

1. Docker とは
2. コンテナとは
3. Docker はどのようにして動作するか
4. Docker を使うメリット
5. セキュリティは？
6. まとめ

</details>

# [Docker](https://www.docker.com/) とは
![altテキスト](https://pbs.twimg.com/media/FUqGOEdXwAEONlQ?format=jpg&name=900x900)
#### Docker は、アプリケーションをすばやく構築、テスト、デプロイできるソフトウェアプラットフォームです。インフラ関係やDevOps界隈で注目されている技術の一つで、Docker社が開発している、コンテナ型の仮想環境を**作成**、**配布**、**実行**するためのプラットフォームです。
Dockerは、**Linuxのコンテナ技術**を使ったもので、よく**仮想マシン**と比較されます。VirtualBoxなどの仮想マシンでは、ホストマシン上でハイパーバイザを利用しゲストOSを動かし、その上でミドルウェアなどを動かします。それに対し、コンテナはホストマシンのカーネルを利用し、プロセスやユーザなどを隔離することで、あたかも別のマシンが動いているかのように動かすことができます。そのため、**軽量で高速に起動、停止などが可能**です。

# コンテナとは
![Docker](https://yumanoblog.com/wp-content/uploads/2020/05/Docker%E3%81%A8%E3%81%AF%EF%BC%9F-1024x538.png)
Dockerを解説する、そして開発するうえで欠かせないのが「**コンテナ**」の理解です。
#### コンテナは、OSのプロセスをネームスペースの技術を使って分離した仮想環境です。
コンテナと聞くと、列車や船に積み込むための容器をイメージする方も多いでしょう。
物流業界におけるコンテナは、貨物を安全かつ効率的に輸送するために、寸法や強度が国際的に規格化されています。コンテナは20世紀最大の発明と評されるほど、近代社会のグローバル化に大きく貢献しました。
IT業界におけるコンテナは、この物流のコンテナをヒントにしています。コンテナを具体的に説明すると、「***プロセスだけを分離して動かす技術***」です。
[wikipedia](https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9)では"プロセス"は次のように定義されています。
> プロセスとは、処理のことである。情報処理においてプログラムの動作中のインスタンスを意味し、
> プログラムのコードおよび全ての変数やその他の状態を含む。オペレーティングシステム (OS) によっては、プロセスが複数のスレッドで構成される場合があり、命令を同時並行して実行する

普通のコンピュータでは、OSがあり、その上で各プロセス(アプリ)が動いていますよね。これに対して、コンテナでは「**プロセスだけがOSの上で"分離して"動作している**」といったイメージです。
つまり、コンテナとは「OSから分離したプロセスを動かす実行環境」というイメージでよいでしょう。

# Docker はどのようにして動作するか
![Docker](https://pbs.twimg.com/media/DEavFDzVYAAbxPV.jpg:small)
Docker は、コンテナ（前述）という標準化されたユニットにソフトウェアをパッケージ化します。コンテナには、ライブラリ、システムツール、コード、ランタイムなど、ソフトウェアの実行に必要なすべてのものが含まれています。Docker を使用すると、**どのような環境にもアプリケーションをすばやくデプロイおよびスケールでき、コードを実行することができます。**
Docker はコードに**標準的な実行方法**を提供します。Docker はコンテナに対するオペレーティングシステムです。仮想マシンがサーバーハードウェアを**仮想化** (直接管理する必要をなくす) ように、コンテナはサーバーのオペレーティングシステムを仮想化します。Docker は各サーバーにインストールされ、シンプルなコマンドを使って**コンテナを構築、開始、停止できます。**

# Docker を使うメリット

![Merit](https://t4.ftcdn.net/jpg/03/42/82/55/240_F_342825535_OQO5kdmi5rEetSOdZmISDqBELIXL9LXO.jpg)

* **簡単に環境構築**
* **軽量でスピーディーな開発**
* **ハードウェアの資源削減**
* **共有化されたシステム**
* **物理サーバの考慮を後回しにできる**

## 簡単に環境構築

![環境構築](https://www.yume-tec.co.jp/column/wp-content/uploads/2020/04/pixta_41701374_M-580x330.jpg)
今までの開発は同じ環境を別のマシンで再現するためには多数の手順があり、操作ミスや手順の記憶違いなどのヒューマンエラーで開発を遅延する可能性がありました。

Dockerは環境がまるっと提供されるので**少ない手順で同じ環境が構築できるためよりスピーディーで正確に同じ環境を再現することができます**。

## 軽量でスピーディーな開発

![開発](https://static.coeteco.jp/coeteco/image/upload/c_fill,dpr_2.0,f_auto,g_auto,h_197,pg_1,q_auto,w_375/v1/cs-product/refile/store/acb74a3b78b2d74ed32118387d4949e5ae4da6e9bdf4678d8ca7251084b7)
コンテナは軽量のため、立ち上げる速度は一瞬です。
それと比較して**仮想マシンはOSをいくつも立ち上げる必要があり、処理自体がかなり重いです**。
コンテナはメモリやディスクの消費量を少なく抑えた状態で仮想化できます。
これにより、立ち上げるスピードも圧倒的に早くなり開発に集中できます。

## ハードウェアの資源削減

![ハードウェア](https://geekly.co.jp/column/wp-content/uploads/2019/02/6-47-660x440.jpg)
コンテナのサイズは非常に小さく、一つの物理サーバに多数のコンテナを稼働させることができます。
その結果、物理サーバを購入するコストが削減されます。

## 共有化されたシステム

![共有](https://i0.wp.com/www.stock-app.info/media/wp-content/uploads/2020/11/2038584_s.jpg?resize=640%2C427&ssl=1)
Dockerの特徴はコンテナだけでなく、共有化サービスの『[Docker Hub](https://hub.docker.com/)』があります。
『Docker Hub』を通してインターネットを通じて世界中の開発者の成果物を入手したり、成果物をアップロードすることができます。
**優れたプログラマが作成したイメージを効率よく、活用する仕組みが整えられています。**

# セキュリティは？

![Secure](https://business.ntt-east.co.jp/content/cloudsolution/images/column/img_column154_01.jpg)

セキュリティはDockerにおいて**ものすごく重要**です。
それはOSを共有しているため、仮想化に比べると隔離レベルが低いからです。これは社内などすべてのコンテナが自社のもののケースでは問題になりにくいですが、複数のユーザのコンピュータにかかる処理の負荷を混在して実行させる環境では大きな問題になることもあり得ます。

# まとめ
今回は軽くDockerの全体像をつかむ程度の内容の記事でした。
Dockerって大体こんなもんなんだなと思ってもらえれば幸いです。
↓要点は以下です↓

----
* Dockerはアプリを素早く構築できる
* コンテナというものがある。（上記）
* 簡単でかつ誰でも使えてスピーディー
* 効率よく作れる
----

Dockerを使ってさらに効率的な開発を行っていきましょう!!
それでは！



# 注意事項
:::note warn
**このブログで言っている情報がすべて正しいかはわかりません。私も可能な限りの努力をしていますが、主観がはいっていたり、そもそも誤った情報の可能性があります。**
:::

↓誤った情報を見つけたら以下のメールまたは私のツイッターDMに記事のリンクとともにお申し付けください。↓

:::note info
**Mail: kbk.public@proton.me**
:::


<details>
<summary><strong>ひな形</strong></summary>

```
[記事リンク]

<リンクを記述>

[お問い合わせ内容]

<内容を記述>

[その他]

<内容を記述>

[ニックネームや活動名またはそのリンク(任意)]

<リンク等>

```

</details>