Docker怖くなくなったかも

こんな本を読みました。

[仕組みと使い方がわかる Docker＆Kubernetesのきほんのきほん (Compass Booksシリーズ)](https://www.amazon.co.jp/%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%A8%E4%BD%BF%E3%81%84%E6%96%B9%E3%81%8C%E3%82%8F%E3%81%8B%E3%82%8B-Docker%EF%BC%86Kubernetes%E3%81%AE%E3%81%8D%E3%81%BB%E3%82%93%E3%81%AE%E3%81%8D%E3%81%BB%E3%82%93-Compass-Books%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E5%B0%8F%E7%AC%A0%E5%8E%9F-ebook/dp/B08T961HKP/ref=tmm_kin_swatch_0?_encoding=UTF8&qid=1656552824&sr=8-5)
![514Mfb930CL._SX386_BO1,204,203,200_.jpg](https://giztech-prj-sango.s3-ap-northeast-1.amazonaws.com/article_images/UOTwmjvxMLgkPkuUrpyhtlquYIdlQ2NbgD50a0yJ.jpeg)

## Dockerこわい
どのプロジェクトでも必ずと言っていいほど導入されているDocker。
用意されているコマンド打ったらなんか動いて、気づいたら開発できるようになっている。得体が知れない。コンテナとか言われてもわからん。こわい。クジラさんかわいい。
と、ずっとモヤモヤ思ってました。

### フロント担当だし
と、思ってずっと勉強することを避けてきたんですが、モヤモヤのまま月日を過ごしていたので早く解消したいとも思ってました。

こういうのは早く払拭したほうがいいと思ったので立ち読みから入ってみました。絵が多い！わかりやすい！！amazonの評価も高い！！！のでkindleで購入して読んでみました。

### フロント担当も
普段フロントを主に担当していて僕みたいにモヤモヤしてる方って結構多いと思ってます。僕みたいな人が少しでもDockerについて調べるきっかけになれば嬉しいです。

## Linuxの上でしか動かない
まず衝撃だったのがDockerはLinux OS上でしか動かないということ。
WindowsやMacで動かすことができるのは[Docker Desktop](https://www.docker.com/products/docker-desktop/)インストール時によしなにやってくれてるから。
具体的にはマシンのOS上にLinuxの仮想環境を立ててその上でDockerEngineを動作させてるらしいです。

## コンテナ
Dockerといえばコンテナだと思うのですが、こいつがわからなくてずっとモヤモヤしてました。

ちょっと遠回りします。
MacやWindows使って開発してるとターミナル使うと思うんですが、あれはOSに対してコマンドで命令を出すやつで、CLIってやつです。

サーバーでも同じようなことができます。
PCから物理的なサーバーやAWSのEC2の中にリモートで入ってCLIで命令を出すことができます。なぜならサーバーにもOSが入っていて、OSによって動いているからです。ちなみにそのOSはLinuxがほとんどらしいです。

何が言いたいかというと、目に見えるPCであっても目に見えないサーバーであってもターミナルで同じような操作をすることができるということです。そしてディレクトリやファイルの管理など同じようにできます。なぜならどちらとも何らかのOSによって動いているからです。結局のところサーバーは画面がついていないPCです。

話を戻します。
コンテナとはOSのようなものを一つのPCやサーバーの上に複数立ち上げることができる技術のことです。『OSのようなもの』と言いましたが、明確にはOSではないからです。なぜならカーネルと呼ばれるOSの核の部分が存在しないからです。しかし、**CLIによって命令を出すことができます**。そしてそれはLinuxベースでできています。

PCのターミナルから物理的なサーバーやEC2の中にリモートで入って操作できるように、コンテナの中にもターミナルで入って操作することができます。

### 何がいいのか
Docker メリットで調べたらたくさん出てくると思うので、僕が直に感じたものとしては下記です。

- コマンド一発で環境が整う
- 端末間での環境の差異を無くせる
- 一つの端末上で異なるバージョンの同じ名前のソフトウェアを管理できる。

## コマンド一発で環境が整う
大体READMEに書いてあるDockerコマンド打てば環境が整ってしまいます。環境が整うとはコンテナが作成されて起動して開発ができる状態に入ることです。

Dockerが導入されているプロジェクトに入ったことある人は『Dockerfile』や『docker-compose.yml』という名前のファイルを見たことあるかもしれません。あれらをもとにコマンドでコンテナを作成・起動します。

コンテナはDockerイメージと呼ばれるファイルをもとに作成されるのですが、Dockerイメージを作成（ビルド）するためのファイルが『Dockerfile』です。
なので流れとしては、下記になります。

Dockerfileをもとにビルド -> Dockerイメージ -> Dockerイメージをもとに作成 -> コンテナ -> コンテナ起動

『docker-compose.yml』はコンテナを作成・起動する際（作成・起動は同時に行うことが多い）にイメージ、オプション、引数をまとめて書くことができるファイルです。このファイルからコンテナのイメージを参照してコンテナが作成されます。

## 端末間での環境の差異を無くせる
チーム開発をする上で大きなメリットではないでしょうか。
コンテナは『Dockerfile』や『docker-compose.yml』をもとに作られると書きました。それらのファイルにイメージのバージョンを指定できます。

例えばPythonであれば3.9で固定したり、Node.jsが必要であればLTSで固定できたり、MySQLであれば5.7を使うのか8.0を使うのか指定できたりします。
これを個々に人為的にインストールするとドキュメントがあってもどこかで差異が生じてしまい開発に支障が生じかねません。

DockerであればGithubからプロジェクトをクローンして、プロジェクトファイル内の『Dockerfile』や『docker-compose.yml』をもとに環境を作るので機械的に強制的にバージョンを揃えることができます。

## 一つの端末上で異なるバージョンの同じ名前のソフトウェアを管理できる。
僕が直に感じてる恩恵はNode.jsのバージョンをプロジェクトごとにわざわざ切り替える必要がない点です。

『端末間での環境の差異を無くせる』でバージョンを固定できると書きました。それはPC上ではなくコンテナ上の話なのでコンテナを複数たてていればそれぞれ異なったバージョンのNode.jsを使用できます。
それはMySQLなんかも同様です。

例えばnodebrewなんかで、
nodebrew ls
nodebrew use バージョン
でNode.jsのバージョンを切り替えながら開発をする必要がありません。

余談ですがNodeのバージョン管理は[VOLTA](https://zenn.dev/taichifukumoto/articles/how-to-use-volta)がキテるみたいです。

あとは開発環境が軽量とかあるみたいです。パフォーマンス面は正直わからないですがVirtualboxだったりLinuxOSをわざわざ入れて開発するよりは軽いというのは何となく想像できます。

## Docker怖くない！

[仕組みと使い方がわかる Docker＆Kubernetesのきほんのきほん (Compass Booksシリーズ)](https://www.amazon.co.jp/%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%A8%E4%BD%BF%E3%81%84%E6%96%B9%E3%81%8C%E3%82%8F%E3%81%8B%E3%82%8B-Docker%EF%BC%86Kubernetes%E3%81%AE%E3%81%8D%E3%81%BB%E3%82%93%E3%81%AE%E3%81%8D%E3%81%BB%E3%82%93-Compass-Books%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E5%B0%8F%E7%AC%A0%E5%8E%9F-ebook/dp/B08T961HKP/ref=tmm_kin_swatch_0?_encoding=UTF8&qid=1656552824&sr=8-5)
結局のところ、僕と同じ状態の人は冒頭で挙げた本を読んでいただきたいです。わかりやすすぎました。
Linuxやコマンドがわからない人でも最低限の説明から入ってくれるので理解できると思います。作者がわからない人の立場に立って話してくれているなと寄り添おう寄り添おうとしてくれているなとヒシヒシと伝わってきます。
帯の「今度こそ、Dockerがわかる！」は嘘じゃありませんでした。書籍はいつも帯で盛り過ぎですけど盛り無しでした。

いろいろ間違っていたら指摘ください。ありがとうございました。