目で見て覚えるDocker用語集

いつまでたってもKubernetesの正しい読み方が分からない今日この頃です。

#概要

- 簡単なDocker入門記事です。
- Dockerの書籍を読む前に見てもらえればいいな、ぐらいのニュアンスで作られてます。
- 文章少なめ、イメージ図多めです。
- そんなに深い話はしません。

# ターゲット

- これからDockerを触ってみようという人
- Docker触ってるけど用語が多すぎて頭がパンクしそうな人

# Dockerとは
![image-20200525-102249.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635116/4da00de6-cb1a-848f-69b5-4d568624ded2.png)

- Docker社が開発している、コンテナ型の仮想環境を作成、配布、実行するためのプラットフォームです。

# コンテナって何
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635116/7c1c5bf9-87d9-90c0-0453-333e586150f7.png)

- コンピュータの[仮想化](https://qiita.com/ok2/items/e57a6a7bfb4293c516fb)の方式の一つです。
- 従来の仮想化と違い、ゲストOSを用意しません。
- ホストOSの一部を分離して使用し、他と隔離された専用のエリアを用意します。
- 隔離された領域のことをコンテナといいます。

##コンテナだと何がいいの？
<img width="1031" alt="スクリーンショット 2020-05-26 10.59.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635116/1ca3c040-3fcf-7187-9a0b-31dd8a2f10c0.png">

- 既存の仮想化を二世帯住宅やマンションに例えると、コンテナ型仮想環境はキャンプ場に近いです。
- **キャンプ場はコンテナ技術が搭載されているサーバで、キャンプ場に設置されたテント一つ一つがコンテナです。**
- テントはキャンプ場のルール(サーバスペック)さえ守れば、大きさ・場所含めて自由に設置ができます。
- **家とは違い、トイレや水道などの共同箇所(OS)は各テント共同で使用しなければいけません。**
- 共同箇所の変更はキャンプ場のオーナーしかできません。
- **トイレや水道をテント内に設置しなくてすむので、設置に時間がかかりません。**
- **テントはキャンプが終わり次第片付けるので、場所(リソース)の再利用が容易です。**

#用語集
##Dockerエンジン
> エンジンとは、一般的には内燃機関を指すが、IT用語としては、ある特定の処理を行うための機能を提供する、ひとまとまりになった処理装置のことである。プログラムを指す場合が多いが、カスタムICなどのハードウェアを指す場合もある。
出典：https://www.sophia-it.com/content/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3

コンテナ型仮想化技術(機能)を提供するプログラムを指します。

##Dockerホスト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635116/1d5c9ecd-571a-40c4-2894-72c90e1c3393.png)
Dockerエンジンが動作しているサーバを指します。
Docker社公式アイコンのクジラ部分(赤枠)が該当します。

##Dockerコンテナ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635116/d8dd0b64-f14e-f953-7bbb-224536d610e0.png)
Dockerエンジンによって提供されたコンテナ型仮想環境を指します。
Docker社公式アイコンのコンテナ部分(赤枠)が該当します。
Dockerホスト上に複数のコンテナを搭載することができます。

##Dockerイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635116/ebf6a837-507a-d8c8-0903-23cf8f9f9503.png)
Dockerコンテナ構成をまとめたもの(テンプレート)を指します。
Dockerイメージを元にDockerコンテナを作成します。
Dockerイメージは使い回しができるので複数コンテナをまとめて作成できます。
別のDockerホストに同じDockerコンテナを作成することもできます。

###Dockerfile
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635116/6a40f3d8-d749-6a76-709a-045d14d53c27.png)
Dockerfileは、Dockerイメージを自動で作成してくれるファイルを指します。
基本となるイメージを設定することができます。
追加で入れたいアプリや環境変数・コマンドなどを設定できます。

###docker image build
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635116/4dea5e45-060a-5bb8-b4a3-7b80729cb017.png)
Dockerfileを元にDockerイメージを作成することを指します。
作成されたDockerイメージを元にDockerコンテナを作成します。
作成されたDockerイメージは後述のDocker Registryに登録・管理することもできます。

##Docker Repository
>ソフトウェア開発などに用いるプロジェクト管理システムやバージョン管理システムなどで、プロジェクトを構成するプログラムのソースコードやドキュメント、関連する各種のデータやファイルなどを一元的に管理する格納場所のことをリポジトリという。
出典：http://e-words.jp/w/%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA.html

同名のDockerイメージの集まりを指します。
差分管理やバージョン管理をタグをつけることで区分けしています。

##Docker Registry
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635116/5b093774-95b8-a013-c43b-9c09ed338e9e.png)
Dockerイメージを持つDocker Repositryを保管・管理するサービスを指します。
publicなもの(Docker Hub etc)とprivateなものの2種類があります。
privateなものについては、Docker上で別途Docker Registry専用のコンテナを構築する必要があります。

###Docker Hub
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635116/d91cc0de-7e30-0da3-0824-7031c6546685.png)
Docker Registryの1種でコンテナ共有サービスを指します。
作成したDocker Repositryをアップすることで、Git Hubのような配布・変更管理などの機能を提供します。

##Data Volume
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635116/b315e889-fc1e-f97b-ab00-1080683ce802.png)
Dockerコンテナ内のディレクトリをDockerホストのディスクに永続化する仕組みを指します。
上記を使用することで、Dockerホスト・コンテナ間でのディレクトリの共有・再利用ができます。
ステートフルなアプリケーションをコンテナで実現する際に使用されます。

###Data Volume コンテナ
コンテナ間でディレクトリを共有する仕組みを指します。
Data Volume用のコンテナを用意し、他のコンテナは全てData Volume用のコンテナを参照します。
仲介役のコンテナがあるため、アプリケーション用コンテナはDockerホスト側の情報を知る必要がありません。

##Docker Compose
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635116/33a19f9b-c325-0ca4-9313-6eb33f9916ef.png)
複数コンテナを構築・実行する手順の自動化・管理を容易にするツールを指します。
複数のコンテナを使って1つのアプリケーションを構築する場合などに使用します。（例）master - slave etc

###docker-compose.yml
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635116/72f9dd39-1ad3-7946-1b01-18abd568b62c.png)
複数コンテナの構築・実行手順をまとめたファイルを指します。
構築したいコンテナのイメージ(or Dockerfile)が定義されています。
他にも起動順・条件やコンテナ間の接続情報なども定義することができます。

##Docker Swarm
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635116/668909d6-58fd-36d6-b5eb-0e78427b5dcd.png)
複数のDockerホストを束ねてクラスタ化するツールを指します。（ロゴも大勢のクジラでコンテナを運んでいます）
Docker Swarmを使ってクラスタ化されたクラスタをSwarm Clusterといいます。
Docker Swarmはコンテナオーケストレーションシステムの1つです。

> オーケストレーションとは、複数の統合されていないシステムにわたる多数のステップを含む
プロセスやワークフローを自動化する方法を指します。
出典：https://www.redhat.com/ja/topics/automation/what-is-orchestration

###Docker Node
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635116/b316c177-d853-8eda-77d2-525c17e71bd7.png)
Swarm Clusterを構成するDockerホストのことを指します。
Docker Nodeには『manager』と『worker』の2種類があります。

####manager
Swarm Cluster内のDocker Nodeを管理するDocker Nodeを指します。
後述のworkerの機能も兼業することができます。
アイコンの黄枠で囲まれたクジラが該当します。（上に乗っているクジラの面倒を見ているイメージです）

####worker
コンテナを実行するDocker Nodeを指します。
アイコンの赤枠で囲まれたクジラが該当します。

###Service
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635116/2dd6d96a-799c-c557-7d1d-6c62b3b6dbf5.png)
アプリケーションを構成する一部のコンテナを制御するための単位を指します。（アイコンの赤枠が該当）
webアプリケーションを例にすると、Serviceは『web』と『API』の2つで構成することができます。

###Stack
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635116/d6e36eb3-b473-2fdf-7d89-86f92c25813c.png)
複数のServiceをグルーピングした単位を指します。（アイコンの赤・黄・青枠がそれぞれ該当）
Stackはアプリケーション全体の構成を定義することができます。
Stackで利用するoverlayネットワークを設定しないと、Stackの数だけoverlayネットワークが作成されます。

####overlayネットワーク
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635116/c84edc71-e77d-cdd7-90b8-25555d1703cc.png)
コンテナ間通信が可能なネットワークのことを指します。
Stack作成時にデフォルトでネットワークが作成されます。
設定で別のoverlayネットワークに対象のStackを所属させることもできます。
同じoverlayネットワークに所属していれば、異なるStackのコンテナ間でも通信ができます。

####stack file
Stack内の情報をまとめたファイルを指します。
内容として、Service情報、Dockerイメージ、構築するコンテナ台数、所属するoverlayネットワーク情報があります。

##Kubernetes
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635116/f540df06-7f6d-447e-ce88-9a9137933b92.png)
Google社主導で開発されたコンテナオーケストレーションシステムです。
読みは「クバネティス/クバネテス/クーべネティス」、表記は「k8s」などがあります。
現在、主流のコンテナ管理ツールです。
機能としては、docker-composeやdocker swarmの機能を全て持っています。
さらにコンテナ間のネットワークルーティング管理等もできます。
公式アイコンにあるようコンテナ船の舵取りのような位置付けです。

詳細は別途Kubernetesの用語集記事を作成予定です。

#まとめ

- コンテナ技術はサーバ仮想化技術の一つです。
- コンテナ技術を提供するプログラムがDockerです。
- DockerコンテナはDockerイメージを元に構築されます。
- Dockerイメージを管理するツールがDocker Registry(Docker Hub)です。
- Docker Composeは複数のコンテナを管理・操作するツールです。
- Docker Swarmは複数のDockerホストを束ねクラスタ化するツールです。
- Docker ComposeやDocker Swarmの高機能版がKubernetesです。

#おまけ
コンテナ技術も仮想化技術の一種なので、もちろんクラウドサービスの対象になります。
代表的なサービスを以下に紹介します。

※AWS贔屓なのはAWSぐらいしかクラウドサービスを触ったことがないためです汗

##代表的なコンテナクラウドサービス
###AWS
####ECS（EC2 Container Service）
AWS が開発したコンテナ管理サービスを指します。
コンテナの実行環境として、EC2・Fargateのどちらも選択できます。

####EKS（Elastic Container Serice for Kubernetes）
Kubernetesのマネージドサービス(コンテナ管理サービス)を指します
コンテナの実行環境として、EC2・Fargateのどちらも選択できるようになりました。

####Fargate
サーバレスのコンテナ可動サービスを指します。
コンテナを登録するだけでリソースを気にせずに利用することができます。
コンテナ単位に課金されます。

###Microsoft Azure
####AKS（Azure Kubernetes Service）
KubernetesをAzureで動かすためのコンテナ可動サービスを指します。
####ACR（Azure Container Registry）
コンテナのイメージ用に利用できるプライベートレジストリサービスを指します。

###Google Cloud
####GKE（Google Kubernetes Engine）
Kubernetesをベースとしたコンテナ管理サービスを指します。
####Cloud Run
フルマネージド環境でステートレスコンテナを実行できるコンテナ可動サービスを指します。
サーバーレスなのでインフラストラクチャ管理が一切不要です。
コード実行時に課金されます。

#最後に
Dockerは用語の説明見るよりも、各ツールのアイコンを見た方がイメージしやすいです。
最近の技術というだけあって、アイコンにもユーザビリティが溢れている点はとてもいいですね。