【初心者向け🔰】Docker 入門｜基本概念・環境構築（ざっくり解説）

## 概要
重要度が高く、近年、世界的にも急速に利用が広がっている技術ですが、現役の IT エンジニアでも意外と苦手な人が多い Docker について、ざっくり解説。

|#|記事|
|---|---|
|#1|**基本概念・環境構築**（今回）|
|#2|基本的な使い方|

### 前提
:::note warn
macOS で作業する前提で書いてます。Windows の方は適宜、読み替えてください🙏
:::

## Dockerとは
クジラのマークでお馴染みの Docker（ドッカー）とは、macOS/Windows/Linux 等の OS の上に、簡単かつ軽量に、仮想環境を作ることができるツール。
![docker_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/e6286688-7174-14a8-b1e7-d2b59a6ac96b.png)

- **「コンテナ仮想化」** の技術で、"コンテナ型の仮想環境" を提供（コア技術は Go言語で書かれている）
- 環境構築をコード化できるので、ファイル化すればいつでも誰でも再現可能
- コンテナや再現手順を共有すれば、利用者の OS やバージョンの違いを意識せずに済む
- ホストしている OS から１つのプロセスとみなせるので、通常は隔離状態だが、設定によっては、他のコンテナや、コンテナ化していない他のプログラムと容易に接続・連携できる
- アプリを公開する場合、通常はソースコードやビルドしたリソースをデプロイするが、コンテナごとデプロイすることも可能になる

### デメリット
Docker は正直デメリットが少ないので、先に上げておくと **「学習コストが高い（習得に時間がかかる）こと」** くらいだ。使いこなせない内は、"使わない方が良いのでは" と思うかもしれない。
特に、どうしても **インフラの知識が多少必要になる** ため、これまでインフラとは縁が薄かった開発者にとっては難しく感じるかもしれない。

現状、Docker は、起動や停止など簡単な操作以外の、ほとんどの機能を CLI （コマンド）でしか提供していない。直感的に操作可能な GUI が無いのが、ハードルを高くしているかもしれない。

### コンテナ型の仮想環境
従来の仮想環境といえば、ハイパーバイザー型の「Hyper-V」、ホスト型の「VirtualBox」等があったが、丸ごと OS もインストールするが必要があった。つまり、ホストOS の上に、更に仮想環境の OS も入れて動くため、動きも非常に重かった。
しかし、Docker の「コンテナ」は、ホストOS のカーネルを共有して、必要なものだけ仮想環境に入れて動くため、OS をインストールする必要がなく、従来型より動作が軽い。

更に、環境構築のコード化も、従来なら、Ansible等のサードパーティのツールを用意する必要があったが、Docker は標準で構築手順をコード化できるため手間も少ない。

尚、「コンテナ」の語源は、貨物船の荷物を入れるコンテナからきているらしい。

:::note warn
**注意点 👉「Docker は "OS" ではなく "プロセス" である」**

初心者によくある勘違いが、「Doker で簡単な処理を作ったが、実行するとコンテナがすぐに停止するのはなぜ？」というもの。
これは、Docker またはコンテナが、"仮想の OS やサーバを提供するもの" だと **勘違い** しているため。

Doker は「コンテナが一度起動したら、必ずずっと起動するもの」ではなく、**「目的の処理が完了（または失敗）したら、コンテナを停止する」** ものである。
動き続けるアプリケーションや DB 等をコンテナ化した場合などは、その処理が止まるまでコンテナは停止しないが、**本来はプロセスの１つとしてみなされ、処理を終えたら止まるもの** だと覚えておくこと。
:::

👉 実際、「Docker コンテナは、Linux が動く軽量な仮想マシンと捉える」の様な内容の初心者向け記事を見たので、これだと **"Docker コンテナ ＝ 仮想化された Linux OS" という誤解** を生み、「コンテナ起動したらずっと動き続けるもの」という誤った認識をしやすいと思いました。

### 永続化（マウント機能）
Docker は、コンテナが停止すると、中で起きた変更や保存内容は **揮発する（＝消える）**。
このため、コンテナ内の変更を保存したい場合、コンテナ内と外部（ホストOS側）を同期するような **「マウント機能」** が用意されている。マウント対象のフォルダ・ファイルは、変更があったらすぐに反省され、コンテナが止まっても揮発せず **"永続化"が実現できる。
具体的な設定値として、複数のマウントタイプが用意されているが、`Volumes` というマウントタイプが推奨されている。

### 「Dockerfile」と「イメージ」と「コンテナ」

|言葉|意味|
|---|---|
|コンテナ|実際に起動・動作している仮想環境そのもの。インスタンス（instance） ＝ 実体。|
|イメージ<br>（Docker image）|コンテナをインスタンス化するための設計図。コンテナは "イメージ" をもとに生成される。<br>その実体は Json ファイルおよびファイルシステムの `.tar` ファイルである。|
|Dockerfile|「ドッカーファイル」と読む。イメージを生成する設定ファイル。つまり、この設定ファイルがあれば、仮想環境がコード化できる。<br>大抵は、**Docker Hub**（後述）から記述したイメージをダウンロードしている。|

### Docker Compose
**「Docker Compose（ドッカー・コンポーズ）」** は、複数のコンテナを実行することができるツール。
「Dockerfile」は１つのコンテナを生成するための設定ファイルだが、`docker-compose.yml` ファイルは、複数のコンテナや構成サービスを設定することができる。

### Docker Hub
**「Docker Hub（ドッカー・ハブ）」** とは、クラウド上のレジストリ・サービス。例えると、Docker 版 GitHub みたいな Web サービス。利用には、事前にアカウント作成（基本は無料）が必要。
Docker イメージを提供してくれたり、自分が作った Docker イメージをプッシュして公開・配布したりできる。
GitHub同様、差分管理や、チームのコラボレーション、開発パイプラインを通したワークフローの自動化といったことも可能。
![docker_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/4d30597c-0590-e36e-fda6-911b955bd321.png)

## Docker 環境構築

まずやることは、**クライアントツールの導入** と **Docker Hub のアカウント作成** 。
![docker_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/33b26c9f-c6de-656a-0ceb-b86bb5eb8ea6.png)
クライアントツールとは、Windows や macOS にインストールする Docker のアプリ。

### Docker Hub アカウントを作成
[Docker Hub 公式サイト](https://hub.docker.com) で「Register」から無料プランを選択してアカウントを作成する。手順は簡単。

### Docker Desktop をインストール
[Docker 公式サイト](https://www.docker.com)からインストーラをダウンロードする。
![docker_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/f9c9b18d-29a7-de7b-6f63-03b311e765c6.png)

PC にインストールする。
![docker_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/764cffe7-e55d-d77f-47f0-c65a0d5e86af.png)

インストールしたアプリを起動する。
![docker_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/d40075cf-9269-9c87-51af-8a098356197f.png)

色々と出る画面を肯定（Yes など）していき、この画面にくれば起動完了。
![docker_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/ba2750cd-4239-3991-7406-46bd4801cf20.png)

Docker を利用する際は、このクライアントツールが起動している必要がある。

## まとめ
まずは基本的な概念やワードをおさえ、作業をしやすい状態にしましょう🙋‍♂️✨

- Docker はコンテナ型の仮想環境が作れる技術
- Docker Compose を使えば、複数のコンテナも連携して動かせる
- 環境構築をコード化できて、共有できる
- OS やバージョンの違いを気にせず、どこでも動かせる
- コンテナを止めると、セーブデータが消えるので、マウント機能で保存する
- Docker Hubで必要な環境の設計図をゲットしたり、自分の設計図を公開したりできる
- クライアントツールの導入と、Docker Hub のアカウント登録で利用できる