ぼっちエンジニアのリーンなブログ

リーン・スタートアップ、プログラミングなどについてまとめます

よくわかるDockerの使い方。DockerをVirtual Boxなどの他のVMと同じような感覚で認識すると使いどころがよくわからない、という人に聞いて欲しい話

注意

ここでは、Dockerの実際の使い方の説明ではなく、 Docker初心者が陥りやすい「Dockerをどう使うべきか」という意味の使い方の話をします

Dockerを他のVMと同じように捉えるとひどい目にあう、という話

「DockerはVM」と考えるとひどい目にあう、というか便利さをあまり感じない。
正直Vagrantで良くない? となって考えるのを辞めてしまった人が多いのではないだろうか(なにを隠そう私がそうだった)

なぜなら、Dockerを普通のVMみたいに本番と同じ環境をローカルに実現するための手段と考えると、一つ重要な誤りがある。
Dockerで提供されているubuntucentosは、実際の本番で使っているOSとは異なるからだ
だってコンテナだし…。Virtual Boxとは違うのだよ!

だから、DockerをVagrantのように利用しようとすると、その行為自体が間違いなのだ。
確かに起動、削除、作成はVagrantより速い、でも本番と同じ環境をローカルに作りたいなら、同じではないから用途が違う。

何を隠そう私はそういう用途で使おうとしてひどい目にあいました。SSHさえやるのめんどくさいし。
しばらくすると、Vagantでよくね? ってなる

DockerにSSHするな!

Dockerを始めようと思ったら、とりあえず他のVMのことは忘れよう。本番と同じ環境を作る、という考えも捨てよう!
さらにはSSHしようという考えさえ捨てよう!

DockerはVMではない! と思った方が良い。

じゃあDockerはどう使う?

ここから本題

「Dockerは役割ごとに作るもの! OSとして使うものではない!」

というのが今のところ私の考えているDockerの使い方。

通常のVMの場合、そのVMの中に

とかをインストールしてそのVM単体でサービスが動くように作る

でもDockerはその中に一つの役割(ソフトウェア)だけ入れて使う
つまり、一つのサービスを構成するのに復数のDockerを使う、上と同じ構成にしようとすると、

  • nginxのインストールされたDocker
  • mysqlのインストールされたDocker
  • rubyのインストールされたDocker

の3つのDockerを利用するのが正しい

つまり、OSよりもレイヤー的には下になる

そんな使い方したら便利じゃないやん!

いや、その理屈はおかしい

これが便利なんだ!

nginx, mysql, rubyをインストールしようとすると、実際はそれ以外のものも全部yum, apt-getとかでインストールするよね

でも、Dockerならそれらが入ったDockerを落としてくれば、ほらもう出来上がり

そう、Dockerならね

例えばrubyのバージョンを上げたいとしよう。
rbenv? そんなのいらない、新しいバージョンのrubyが入ったDockerを使えば良いんだ!
ソフト的な部分は全部Dockerにまかせて、OS部分には設定ファイルだけ置いておけば、バージョンを変更するのも超簡単

Docker composeとか使えばそれだけで環境整えられるし、すごい便利
Chefに最小限のことだけさせて、あとはDocker composeで環境整えるっていうのが一番速いと思います

docs.docker.com

結論

Dockerを他のVMと同じレイヤーで捉えると混乱する
DockerはOSよりも下のレイヤーと捉えるべし
Docker composeで環境構築おいしいです ^q^