SideCI Blog

自動コードレビューサービスSideCIを提供している株式会社アクトキャットのコーポレートブログです。



Dockerコンテナの正しい?使い方。1コンテナ1アプリケーション

最近Dockerという仮想化技術がエンジニア界隈でバズってます。
これについて公式サイトにも載っている浅めのの知識を少しだけ書いてみました。

DockerはDockerレジストリからイメージを持ってきて動かす事が出来ます。 たとえば、Ubuntuマシン上でRedisを動かしたり出来ます。Redisと名前のついているコンテナイメージではありますが、それ以外も一応動いてます。完全にアプリケーションだけを分離するわけではありません。

普段さくらのVPSとかを使い慣れていると、VPS1つにNginxもRubyもMySQLも動かしたい!ような気がします。1インスタンスで十分全アプリケーションが動くのであれば、わざわざ分けるのはもったいないですもんね。

ところが、Dockerで動かすコンテナは「コンテナ」なので、コンテナをたくさんDockerに積んで動かすのが正しい動かし方・使い方だと思います。また、Linuxカーネルレベルの動作はホストOSの方がしてくれるからこそ、コンテナのように扱えるのかなと思います。
コンテナ上では最低限主要アプリケーションの動作に必要なアプリケーションや設定が含まれているといった感じですね。

具体的な詳細は公式をどうぞ!

Link Containers
http://docs.docker.io/use/working_with_links_names/

コマンドだけ抜粋すると下記のような感じですね。

$ sudo docker run -d --name redis crosbymichael/redis
$ sudo docker run -t -i --link redis:db --name webapp ubuntu bash

1インスタンス(DcokerのShip・ホストOS)上にコンテナとしてアプリケーションをこんな感じに展開していくのが正しいパターンかと思います。
コンテナ1: Nginx+Passenger
コンテナ2: MySQL
コンテナ3: Redis
コンテナ4: Fluentd
etc…
この場合はコンテナ1がベース?となるコンテナって感じですね。これらのコンテナの組み合わせで1サービスが出来るわけです。多少のリソース等の無駄はありますが、アプリケーションが分離出来るメリットとのトレードオフで仕方が無いですね。

これらをうまく使ったOSSとしてはDocker powered mini-Heroku in around 100 lines of Bashなdokkuなどが挙げられると思います。

こんな使い方やdokkuを使った場合だと、最初に挙げてた1インスタンス上で全アプリケーション(サービス・コンテナ)が動いているので、元々のニーズ自体は満たしていますね。コンテナすごい。

Dockerは楽しいですね!