Dockerのなにが素晴らしいのか入門

# 背景
ちまたで「Docker」という技術が流行り始めたのも結構前ですね  

私自身「へー、名前がかっこいいしクジラかわいい、けど俺にはハードル高いわー」と
特に気にしていませんでした

しかし昨年、「[2018年の最先端バックエンドエンジニアに必要なスキルについて考えてみました。](https://qiita.com/poly_soft/items/fb649573c19b7a5c0227#docker)」という記事を読み、とても印象に残りましたし、「やばいのかな…」という不安を覚えました  

そこからコツコツ色々と調べて、無理やり業務に使っていったところ、「これはいいものだ…」とすっかりDockerにハマりました

---
これはみんなに伝えなければ！

でもDocker未経験の同僚に素晴らしさを説明したりすると、いまいち伝わらない

本やネットでいくらでも関連情報は出てくるが、「なにができてどう素晴らしいのか」がパッとわかりにくいのではないかと思い、難しいことは別にして「Dockerがあるとこんないいことあるよ！」という記事を書こうと思いました

技術的なことは端折って、個人的なイメージで語りますのでご了承ください

---
# Dockerでできる素晴らしいこと
---
## 初級 OSSアプリの構築が秒で完了
---
プロジェクトを進める上で、色々な便利ツールが溢れてますよね

最近ではないとプロジェクトが成立しないこともある気がします
以下のような代表的なものはみなさん使用経験があるのでは？

+ slack
+ Backlog
+ Github
+ CircleCI

---
しかしながら、予算の都合やセキュリティの問題で使えないこともあります、悔しいですね
諦めますか？嫌ですよね？どうしますか？  
オンプレサーバ立ててOSSの代替サービス使いますよね！

代替できる代表的なOSSの例

+ slack　→　[mattermost](https://github.com/mattermost)
+ Backlog　→　[Redmine](http://redmine.jp/)
+ Github　→　[GitLab](https://gitlab.com/gitlab-org)
+ CircleCI　→　[Jenkins](https://jenkins.io/)

---
では、代替サービスを動かすオンプレサーバを準備しましょう

ん？４つ使うとすると４つサーバ立てる？１つのサーバで同居できるの？

Redmineはrubyが必要、JenkinsはJava、DBはMySQLで、あnpmないじゃんnodeも入れなきゃ…

いやいや、てかこんなの時間かかりすぎだわやめよやっぱExcel神だわ…

---
##### Dockerがあるじゃない！！
---
+ Dockerがあれば、前述の4つOSSが１つのサーバで稼働！
 + パフォーマンスは様子を見て
 + ポートは被らないように調整
+ 構築だって慣れればきっと数分だ！
 + Dockerとdocker-composeは事前に準備
 + もちろんサーバも事前に準備を

---
### mattermostのDocker稼働までの例
---
+ サーバを用意します
 + できればLinux、WindowsかMacならVMを  
+ Dockerとdocker-composeをインストール
 + [ドキュメント](https://docs.mattermost.com/install/prod-docker.html#production-docker-setup-on-ubuntu)の１と２にしたがって
+ Dockerコンテナを起動
 + [ドキュメント](https://docs.mattermost.com/install/prod-docker.html#production-docker-setup-on-ubuntu)の3にしたがって
 + ポートを変えたい時は/mattermost-docker/docker-compose.ymlのwebのports(49行目)を編集
+ http://[用意したサーバのIP]:[port番号]にアクセス！

※ うまくいかないことも多いので、その時は色々調べてください

---
##### これだけ！（きっと10分程度）
---
mattermostに限らず、イケてるOSSはDockerを前提とした構築方法を用意していることがほとんどです

構築にかかる手間がほぼかからないので、積極的に試してみてください

ついでにDockerのコマンドとか、docker-composeってなにとか、調べる必要が出てくるので、Dockerへの足がかりとしては最適かと思います

---
## 中級 ローカル開発環境としてのDocker
---
みなさんはwebアプリの開発をする際、どうやって開発してますか？
Windowsの方はXAMPPが多いですかね、Macの方はBrewで環境作るんですかね
でもローカルに色々入れると環境汚れる気がしませんか？
php7.2で開発してる途中にphp5.4の案件割り込んできたらそれはもう面倒ですよね？

---
##### Dockerがあるじゃない！！
---
Dockerに出会って以来、私の開発環境はDocker一択になりました
Dockerを使うメリットは

+ 最初にDockerfileを作っておけば、いくらでもやり直せる
 + Dockerfileはとっつきにくかったが、Linuxを環境構築するスクリプトだと気づいたら全然楽だった
+ 作ったDockerfileやDockerImageは、メンバー間での共有がとっても簡単
 + vagrantでもいいじゃんと思っていたが、他の人とのやりとりしやすさが全然違う、Docker最高
 + DockerImageの共有には、DockerHubのようなImage用のリポジトリが必要
+ 本番環境での運用も可能！
 + 開発環境で作ったDockerImageは、条件によってはほぼそのまま本番環境に使えそう(使ったことはない)
 + ということは、本番環境構築のためのコストやリスクが削減できる！（はず）
+ 思ったよりも開発に制約がない
 + ソース編集やデバッグも、ローカルでの実施とほぼ同じ感覚でできる
+ CIとの相性抜群
 + ユニットテスト用の環境も、DockerImageを簡単に利用([参考記事](https://mag.osdn.jp/17/05/08/190000))
 + 環境の違いによるテスト不備を最小限にできるのでは？

---
### laravel開発環境構築の例
---
+ サーバを用意します
 + 私はWindowsにVirtualBoxとvagrantを入れて、CoreOSで運用してます
+ Dockerとdocker-composeをインストール
+ Dockerfile類を用意します
 + 「[Dockerを使ってLaravel開発環境構築](https://qiita.com/A-Kira/items/1c55ef689c0f91420e81)」に従って、各ファイルを準備します
 + 但しそのままではエラーが出るので、「[この記事](https://yourmystar-engineer.hatenablog.jp/entry/2019/07/15/140644)」や「[この記事](https://qiita.com/bunty/items/681a74de001b7ed1c022)」を参考に修正します
 + これらは、過去の情報を参考にする以上避けられない事象なので、先人の方々に感謝しつつ地道に原因と対策を調査するしかないです
+ Dockerコンテナを起動
 + docker-compose up -d
+ コンテナに入ってLaravelプロジェクト作成
 + laravel new

---
##### これだけ！（きっと10分程度）
---
色々と端折っているので、この内容だけでは不十分かもしれません
細かい手順や仕組みに関しては、みなさんで調査して補っていただければと思いますが、できることが伝わればいいなと思います

---
## 上級 本番環境としてのDocker
---
本番環境での運用についても昨今色々と実績があり、Kubernetes等の盛り上がりもあって現実的な選択肢になっているようです
が、私自身が実践していないので今回は紹介できませんごめんなさい

---
# 所感

ということで、Dockerの素晴らしさが誰かに伝わるといいなと思って書きました
とりあえず使ってみることから始めてみませんか！