使ったことがないDockerを使う気にさせる使用事例

##はじめに
Dockerを学ぶ場合、会社のプロジェクトで使うから勉強する事になるパターンと
よく使われていることから使ってみたい！という2パターンに分けられると思います(自分は後者でした)

勉強した際いまいちどう使えばいいのかわからず、業務で使って理解した部分が色々あったので
便利だなと思ったユースケースと利点についてまとめました。
読んで使ってみたいと思う人が一人でも増えればいいと思います。

##個人開発で使用する
####PC内にDockerでlinuxの開発環境を作る(Win or Mac)
#####メリット
######・母艦PCと言語バージョンが違う開発がパッケージ切り替え無しで実施できる
　DockerでLinux環境を作成し、その中に言語パッケージ等を入れて開発環境を構築します。
　本質は「どこから接続しても同条件で開発できる環境をDockerイメージとしてパッケージ化できる」点です。
　イメージさえあれば別PCを購入してもDockerさえ導入すれば同じ環境がすぐ構築でき、
　AWS等のクラウド上でコンテナを立てればSSH接続するだけですぐ開発に取り掛かることができます。
　※[Linuxを含んだDockerコンテナを作る](https://qiita.com/ko_koyama_m/items/0e65849b91a329529675#docker-for-mac%E3%81%AF%E4%BB%AE%E6%83%B3%E3%83%9E%E3%82%B7%E3%83%B3%E3%81%A8%E3%81%BB%E3%81%BC%E5%90%8C%E7%BE%A9)

######・実質linux内で開発しているためデプロイする場合のOS差異がなく、コンテナ作成から公開が簡単にできる。
　上とほぼ似ていますが、linux内での開発になるのでそのままdockerfileを記述しイメージを作成、
　ECR、GCR等のコンテナ用クラウドにアップすることですぐに開発したコンテナを公開できます。
　自分の環境で開発した物をEC2等にデプロイする場合と比べて環境差異が生まれる可能性が少なく便利です。

##会社のプロジェクトで使用する
####開発環境として使用する
######コンテナを用いて複数人の環境をすぐに作成できる
　Dockerイメージをpushするインスタンスを変更するだけで複数環境を簡単に作成することができます。
　開発環境の配布も可能なためプロジェクトインが簡単にできたり、テスト用のインスタンス生成等にも
　柔軟に対応が可能です。スタートアップ時にはいろいろなモジュールを変更して試してみることも多いため、
　変更しない部分(メインロジック等)を1個のDockerイメージにして変更がある部分のみを別イメージとして
　docker-composeの記述で環境を試し、必要ないコンテナはすぐ廃棄することで作業効率が向上します。
　(ローカルで同様の事をする場合、パッケージの削除・エラー解消などが必要となり膨大な作業が発生します)

####本番運用のために使用する
#####スケーリングが容易なため、サービスの規模に応じてベストな運用ができる
　ソーシャルゲームなどではイベントがあるとアクセスが多くなったり、夜間のアクセスが減少することから
　スケーリング不可なシステムだとリソースの無駄やアクセス過多によるサーバー落ちの可能性があります。
　Dockerを使用することによりコンテナ単位でのスケールアウト・スケールインが可能なため、
　アクセスに応じた構成をフレキシブルに適応しながら運用することができます。
　
#####サービス運用の潤滑化・高速化
　開発に関わる作業(テスト・デプロイ・スケーリング等)が楽になることからプロダクトそのものに集中でき、
　技術面だけではなく企画時間～作業時間など全体の時間削減に繋がります。
　※うまく説明ができるメンバーがいる前提であれば、テストメンバーを増やす際も環境構築が即時可能で
　　開発メンバーのスケーリングが容易にできるのはすごくメリットに感じました。

##Dockerに関する気になること
####別に使わなくても開発はできる・採用企業にジョインする難しさ
　そもそもDockerが使用されるまでの運用法が間違っているわけでもないので、新規に導入する時間を考えると
　案件を1件でも多く受注し、同じ開発を続けることも企業にとっては一つの選択だと思います。
　[2019年の記事では国内でDockerコンテナを本番利用している企業は9.2％](https://www.itmedia.co.jp/news/articles/1907/22/news087.html)という話もあり、該当企業に参加し
　その案件に参画するまでもいくつかの壁が存在します。

####0からの勉強コストが高い
　経験のあるメンバーがいない場合、7人のメンバーが1日でDockerを学んでも1人週の工数がかかります。
　どんな新しい技術でも調査時間は必要ですが、前述の「使用しなくても開発は進められる」ということもあり
　この時間を「必要」と捉えるか・チームで何人Docke経験があるかで導入のハードルが変化します。

####採用事例・知見の問題
　特に運用フェーズでの採用率の低さはナレッジが全然なかったことが大きい気がします。
　最近はAWSのイベントでも有名企業Docker採用事例のプレゼンテーションがあったり、
　企業が開催しているLT記事でも便利だなーと思う事例を見つけたりします。
　後追いで採用する上では参考にできるユースケースも増えており選択肢としては非常に魅力的だと思います。
　便利とは言っても決して銀の弾丸ではないので、他技術と比べ有利かを考えながら採用する必要があります。

##まとめ
####メリット
・**環境差異を最小限に抑える**ことができストレスが少なく開発・運用することができる
・使い方によってあらゆるフェーズで使えるため、**トータルの時間が削減**できる
・採用企業の面接を受ける時、Docker運用について受け答えができるとウケが良い

####デメリット
・ある程度勉強時間が必要なので**継続的に使用していくつもりがないならメリットが薄い**
・採用チームに参加できるか、あるいは導入を認めてもらえるかは企業次第

##参考
####個人開発
★[Dockerで開発環境構築を10倍楽にしたはなし](https://techblog.kayac.com/developing-with-docker-compose)
　[VS CodeのRemote Containersを使ってコンテナ内で開発する](https://qiita.com/takenoco82/items/39d1d9575a1249ef8e7b)
★[VSCode の Remote - Containers 拡張を試してみた](https://tech.actindi.net/2019/06/18/085723)

####運用・スケーリング関連
★[【AWS】Auto Scalingする前に知っておくべき7つのこと](https://miyabi-lab.space/blog/30)
　[ロマサガRSで大規模負荷を処理する Amazon ECS & Docker運用知見](https://pages.awscloud.com/rs/112-TZM-766/images/I3-04.pdf)
　[スケールアウトの基礎的な考え方](http://innobase.hatenablog.com/entry/2014/10/31/115327)
★[2018年なぜ私達はコンテナ/Dockerを使うのか](https://cloudpack.media/41647)
★[Mastodon・Netflixに見る、コンテナの未来 コンテナはサービス開発の主流になり得るか？](https://logmi.jp/tech/articles/315718)

※★は参考にした以上に個人的に面白かった記事です