Dockerとは何かわからないので調べてみた


1.前書き
2.コンテナとは
3.コンテナ活用事例
4.実際に使ってみた
5.感想

# 前書き
* AWS SAA勉強時に、「Kubernetes」という単語がやたらに出てくる。読めない。
* 「クバネティス」「クバネテス」「クーべネティス」。ギリシャ語で「船長」。Kubernetes のスペルが K と s の間に8文字あることから k8s と表記されることもあり。
* Kubernetes=コンテナオーケストレーションシステム＝コンテナ管理システム。つまり何、、、？

参照
> https://www.tohoho-web.com/ex/kubernetes.html


最近流行り（もう古い？）のコンテナ関連技術。そもそもコンテナとは何か。調べてみた。


# コンテナとは
イメージがつきやすいServer仮想化と比較して、、、
* 仮想マシン：ハイパーバイザーで立ち上げられるハードウェアの環境にゲストOS、アプリケーションのインストール
* コンテナ：コンテナエンジンを通して共有されたホストOSのリソースにゲストOS不要でアプリケーションをインストール

引用
> https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883955
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883955/0e8ba81e-d7d3-ebf2-c985-f637f9130c79.png)

...つまりどういうことだ。

## コンテナ化のメリット

アプリケーション実行に必要なものがコンテナに収納されていることがポイント。
* 移動可能性の高さ
    * コンテナ化ツールがホストOSにサポートされてさえいれば、手間いらずで別のサーバに移植可能。ハイパーバイザーや仮想OSを**意識することなく**、作成したコンテナを開発、検証、実行環境へデプロイできる。

* オーバーヘッドの最小化
    * ホストOSのカーネルを利用するため、仮想マシン環境と比較してHV,仮想OSの管理が不要。
    * CI/CDの実現。開発、改善、デプロイの手作業をできるだけ少なく。

* アプリケーションパフォーマンスの向上
    * HVや仮想OSの起動処理が不要。

ホストOSとアプリケーションの間の距離を短くして、必要な分だけ移動できるようパッケージした感じと思った。

## Dockerについて
調べる前は「コンテナ」＝「Docker」というイメージがあったが、、、

DockerとはDocker社が提供する「コンテナ型仮想化技術」 を実現するプロダクト（ソフトウェアそのもの、またはプラットフォーム）

つまり？Docker社のおかげで、、、イメージ作成と実行を簡単にしてくれる。
>環境およびアプリケーションをDockerイメージとしてバンドルし、DockerエンジンによりDockerコンテナとして配備・実行できる。Linux・Windows・Macすべてに対応したDockerエンジンは開発・テスト・本番・デバッグなど様々な状況で容易かつ高速なアプリケーション配備・実行を可能にする。
>> https://ja.wikipedia.org/wiki/Docker

# コンテナ活用事例
仮想マシン環境で大規模な開発をしているとこなら、どこでも導入機会があるように思える。
リクルート社での活用事例。大量のアクセスが発生するWebsite, Applicationを多数抱えており、それらの更新頻度も高い。
>画像引用：https://www.slideshare.net/recruitcojp/Docker-50826578/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883955/360494be-4e6c-7d4c-e63d-f302d09c3faa.png)

# 実際に使ってみた
手っ取り早そうなDocker Desktop for Windows（WindowsOSで動かせるコンソール）で。
さくっと作れるとはいかがなものか。

1. WSLで動くらしいのWSLをインストール
`wsl --install -d Ubuntu`

2. Docker Desktopアプリをインストール（https://docs.docker.com/desktop/install/windows-install/）
アメコミ風でかわいい![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883955/c71ca47d-288e-e8c4-dd09-845f7db9c849.png)

（調べたら再インストールしないといけないみたい,,,）...トラシュー中
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883955/83ceada8-cae7-e4a6-fcb3-3d888673e8ee.png)

再起動で治った（一番怖いやつ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883955/41c34667-022b-5657-bfa3-f67f75e12549.png)

寄り道：Desktopアプリの案内に従ってコンテナを作ってみる。一瞬でコンテナ出来上がり。
>docker run -dp 80:80 docker/getting-started

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883955/94f66e3e-55b3-e287-d73c-f6e4b1f133fe.png)

3.簡単なWebページを準備してみる。Docker HubにあるApacheのイメージをPull。
>  docker image pull httpd

4.Apacheイメージからコンテナの作成と起動をする。
>$ docker container run -d -p 8080:80 httpd

5.するともうデフォルトのindex.htmlページが、、、簡単すぎる。
> http://localhost:8080

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883955/a2b3d820-c6e9-c15a-d514-0d75ef83d34a.png)

※コンテナはいつ何時でもスクラップ（ビルド）されることを想定に作るため、webページのコンテンツをコンテナ内に置いて置くのは危険。例えば、今回の環境だとローカルにファイル群を置いて、イメージ実行時にマウントするようにするとか？

# 感想
* コンテナ化によるアドバンテージは理解できるが、使いこなすにはコンテナに関する知識のキャッチアップが必要であり、HVで運用できている環境だと、いきなり舵を切るのは正直難しそう。
* 今後Docker Engineの種類が増えてくると、結局サポート/未サポート問題が出てくる？
* 結局「Kubernetes」とは、、、複数のコンテナ間の連携を取れるので、「アプリケーションのマイクロサービス化」で必要そう。次回にご期待。