Docker Advent Calendar 2018 12日目です。
こんにちは、はじめまして。
Dockerは業務で初めて触り、予想外に素晴らしいと思ったので、いつかまとまった勉強をしたいと思っていました。なので、Qiitaに記事を書きがてら勉強することにしました。
Dockerとは何か、どういうメリットがあるのかを解説します(コンテナの概念についてはスコープ外とします)。
対象はDockerを名前くらいしか知らない人や、開発時のDockerのメリットを把握したい初学者です。
Dockerとは
Dockerは Linux上で動作するツールのひとつで、サーバー設定などのインフラと、Webサービスなどのアプリケーションをひとまとめにして、コンテナとして保存したり配布したり手軽に再現したりできるものです。
メンバーの誰もが手軽に同じ環境を手に入れることができるとして、ローカル環境の構築手段として開発フローに取り入れられます。
また、インフラと一体化していることに着目して、コンテナごとデプロイして運用することで環境差異の影響を最小限にしながら高速デプロイをするといった使い方が代表的なようです(断言できないのは、私自身が本番環境にコンテナをデプロイするようなプロジェクトに携わったことがないから)。
このDocker、本来であれば MacやWindowsでは使用できないのですが、Docker for Mac等を導入することで MacやWindowsでもDockerを使用できるようになります。
これはDocker for Mac等に LinuxKitという軽量で高速な仕組みが内蔵されており、その上でDockerが動くという形になっているため、らしいです(詳細は知らない)。
Dockerの特徴
コードベースでのインフラ定義
Dockerではどんなサーバー構成にするか、インストールするライブラリやツールは何かを Dockerfile等にコードベースで定義することができます。
これにより手作業やローカル環境の差異によって起きるミスを最小限にできます。
環境構築における差異の最小化
Dockerfile等をもとに環境を構築するので、基本的には同じ環境で同じアプリケーションを実行することができます。コードによる構成管理(Infrastructure as Code)の思想。
※ただし「ライブラリの最新バージョンを取得」のような設定がされている場合、環境の構築をした時期によっては環境差異ができてしまうので注意すること。バージョンはしっかり指定しよう。
※設定を変えたりした場合、全員のDockerfileを書き換えてビルドするのではなく、設定が変わったコンテナをイメージ化して配布した方が手作業も減るし、環境差異を減らすことにもつながる。
軽量でシンプル
VirtualBoxと比較すると、パソコンに負荷を与えない軽量設計になっています。メモリ8ギガの旧式PCで「パソコンが重くてなかなかPHPStormが起動しないよぉ」と泣き言を言ってるプログラマにはとてもありがたいです(切実)
PC立ち上げ時にDockerを自動起動するように設定しておけば、ローカル環境へのアクセスも楽ですし、VirtualBoxを起動して仮想環境を起動して、サーバーにログインして httpd startする手間が省けるので、ちょっと嬉しい。
デプロイが簡単になる
本番環境でDockerを運用したことがないので他サイトや書籍の受け売りになってしまいますが、大事なポイントだと思うので書いておきます。
コンテナは、インフラとアプリがセットになっているようなものです。
これをそのまま本番サーバーにデプロイすることで、高速で環境依存バグの少ないデプロイが実現できます。
また、ローカルと本番で同じ構成のコンテナを使うということは環境が統一されるということで、デプロイ後に差異がないか確認する作業が最小化できたり、確認やテスト時間の短縮につながりそうだと思いました。Dockerってすごいなあ(小並感)
実際に使ってみて
プロジェクトに新しくメンバーが入ってきても、Docker入れてREADMEに書いてあるコマンド実行してね、で差異なくローカル環境ができるので効率的。
今までは「すみません、手順通りにやったらエラーが出まして」とか「サイトがちゃんと表示されないんですけど」みたいな質問が必ず飛んできていたので、ありがたみを感じます。
Dockerさえあれば、もうnodeのバージョンをプロジェクトごとに変更する必要はないですし。
さいごに
ある記事では、ITエンジニアとして仕事をしていて Dockerを自分で動かしていない人は相当遅れていると書いてあったりして、わりと必須感があったのでいま勉強しています。あとプロジェクトで環境構築や環境の差異に苦しんだ経験が多いので、そのあたりも勉強の動機になっています。
まだDockerの簡単な概念を知っただけの初心者なので、間違ったところなどがあれば指摘をお願いします。
本番でもバリバリDocker使うプロジェクトやりたい(小声)