メソッド屋のブログ

米マイクロソフト Software Development Engineer 牛尾の日記です。ソフトウェア開発の上手なやり方を追求するのがライフワーク。本ブログは、個人の意見であり、所属会社とは関係がありません。

docker の実行環境を選択する

 現在、様々な環境で docker が動作します。先日同僚から、「docker はいろんな環境で動作するが、どの環境で動かせばいいの?」と質問を受けました。

今、初めて docker を始める場合、どこで環境を作ればいいのか迷ってしまうほどたくさんの選択肢があります。この問いに自分なりに答えてみたいと思います。

f:id:simplearchitect:20160316220118j:plain

このポストは現在(2016/3/15)のところの私の個人的な意見を書いておきたいと思います。よりよい選択があれば是非コメントいただきたいと思います。

 またこの話は、私より1000倍 docker に詳しい方に共有しておいたので、彼がもっといい記事を書いてくれるかもしれません!

1. 開発環境

開発や、docker を試してみたい目的で docker を動かす環境が欲しい場合、現在はほぼ一択で、「Docker Machine」を使うと良い。Docker Machine は、docker の実行環境を簡単なコマンドで作ってくれる。サーバーは自分で作る必要はない。

docker のページから Docker Toolbox

Docker Toolbox | Docker

をダウンロードしてインストールしよう。準備はこれだけ。これは簡単だ。Win / Mac をサポートしている。

上記のコマンドで --driver オプションを指定している。オプションを指定すると、VirtualBoxHyper-V もしくは、Azure などのクラウド環境にサーバーを作ることができる。開発時には、手元のPCに環境を作るVirtualBox か、Hyper-Vが良いだろう。無駄にお金を使う必要はないし、何も違いがない。そもそも手元の方が早い。クラウド環境だと、ファイアーウォールの設定等実際に運用する時には必要なことを考慮する必要がある。

$ docker-machine create --driver=virtualbox dev

Docker Toolbox をインストールしたあと、これだけで docker を実行する dev という名前のサーバーが起動する。実際には、docker 実行環境がインストールされたバーチャルマシンが起動する。docker は、手元のPCでもサーバーでも全く同じように動作するのが売りなので、大抵のことはDocker Machine で十分だ。この後、docker-machine env devとタイプしたときに一番下に出てくるワンライナーを実行すると、環境設定が終了して、docker が使えるようになる。Windows ユーザへのTips としては、--shell=powershellとか--shell=cmdとかつけてあげると、それぞれの環境用の環境変数設定用ワンライナーを生成してくれる。下記はPowerShellを使った例だ。

PS C:\WINDOWS\system32> docker-machine env dev2 --shell=powershell
$Env:DOCKER_TLS_VERIFY = "1"
$Env:DOCKER_HOST = "tcp://192.168.99.100:2376"
$Env:DOCKER_CERT_PATH = "C:\Users\tsushi\.docker\machine\machines\dev2"
$Env:DOCKER_MACHINE_NAME = "dev2"
# Run this command to configure your shell:
# C:\Program Files\Docker Toolbox\docker-machine.exe env dev2 --shell=powershell | Invoke-Expression
PS C:\WINDOWS\system32> docker-machine.exe env dev2 --shell=powershell | Invoke-Expression
PS C:\WINDOWS\system32> docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS
NAMES
PS C:\WINDOWS\system32>

これだけで docker が既に使用可能になる。詳しくは docker-machine のコマンドのマニュアルを見て欲しいが、docker-machine ssh dev とタイプすると dockerのサーバーが起動している仮想マシンにログインすることもできる。このツールで大抵のことができる。

docs.docker.com

開発環境として、Docker Machine を選んでいる理由は、何と言っても手間が少ない、お金がかからないということに尽きる。docker の開発は基本的に

  • Dockerfile を作る / テストする
  • Docker-Compose のファイルを作る / テストする
  • Dockerfile / Compose のファイルをリポジトリに格納する
  • DockerHub にイメージをプッシュする

ということを実施することが多いだろう。Docker Compose は、dockerコンテナを組み合わせて環境を作るためのテクノロジだ。例えば、webとdbの組み合わせでシステムを構築したりすることが多いだろう。そういう場合に、Docker Compose 使うと設定ファイルを書くと、いい感じで動作してくれる。

docs.docker.com

Web-DB 構成を起動する docker-compose.yml の例

web:
  build: .
  ports:
   - "5000:5000"
  volumes:
    - .:/code
  links:
    - redis
redis:
  image: redis

大抵はこれらのワークフローが簡単に構築できる環境があればいい。

2. シングルサーバ運用環境

次に、複雑な構成は不要だが、docker で作ったアプリケーションを手軽に公開したい場合のオプションを幾つか紹介する。

2.1. Docker Cloud

最も簡単なのはおそらくDocker Cloud だろう。docker 社が作成している SaaS で、ほぼ何もしなくても、docker が動作するインスタンスを画面 もしくはコマンドラインで起動することができる。実際のインスタンスは Azure などのいくつかのパブリッククラウドで動作する。簡単さでは右に出るものがない感じだ。

現在のところの課題は、Docker Compose が動作しないこと、リージョンによっては動作しなくなることがあるので、試してからにした方がいい。だが、今後、Docker Compose 対応すれば最も注目度の高い環境になると思う。

f:id:simplearchitect:20160316222443p:plain

2.2. docker on Ubuntu

docker の入ったシングルサーバ環境をクラウド環境などに作る方法はたくさんある。

  • docker-machine
  • docker cloud
  • ARM などの IaC のテンプレート
  • Vagrant / Terraform の docker プロビジョナーを使う
  • CoreOS :

 Docker Cloud を別とすると、Docker Machine がもっとも楽な方法だ。docker だけでなく、Docker Compose や、後述する Docker Swarm も使えるのも良い。

ただ、きっとこのオプションを選ぶ人は動作させるサーバーを「自分でコントロールしたい」と思う人だろう。自分でコントロールしつつ、できるだけ楽に docker 環境をデプロイしたい場合は、環境をデプロイする IaC テンプレートを利用するのが良いと思う。環境のデプロイがコード化されているのですぐにデプロイできるし、気にくわないところは、コードを変更して自分のものにしてしまえばいい。

 私は、Microsoft の中の人なので、Azure ぐらいしかよく使っていないが、他のプラットフォームでも同様のものはあるだろう。Azure の場合だと、Azure Resource Manager というテンプレートがあり、パラメータを設定してワンボタンでdocker 環境をデプロイできる。コードは JSON で書かれた簡単なものだが、自分のコードにしてカスタマイズすることもできる。Azure Portal からも、docker が動作する環境を複数選ぶことができる。HashiCorp の terraform を使うのも良い手だ。クラウドを選ばず記述できる。

blogs.technet.microsoft.com

Terraform by HashiCorp

 この際、CoreOS や Ubuntu ... 等の選択肢があるが、私が個人的にお勧めするのは現状では Ubuntu になる。世の中の手順や、3rd パーティツールの対応具合を見ても、最もテストされている環境と思われる。その点は CoreOS も悪くないのだが、自分でコントロールしたいという用途の場合は、CoreOS は、当然といえば当然だが、通常の Linux にあるコマンドがなく自分でインストールする必要になるケースが多く、サイズが小さいことを重視したい人にはお勧めだがそうでなければ Ubuntu という選択でよいと思う。例えば CentOS などを選択したい人もいるかもしれないが、3rd Party ツールのサンプル等でも大抵は Ubuntu なので、比較すると圧倒的にペインが少ない可能性が高い。

 サーバーを運用するときは、docker だけ使えればいいというケースではない場合も多いように思う。その場合は Ubuntu がお手軽だろう。ただ、今後は、CoreOS のようなサイズが小さいソリューションが重視される傾向にあると思う。昨今の PaaS の動向からすると、CoreOS のようなものは、PaaS の中身として使われることが増えるのではないだろうか?

3. クラスタリング環境

 さて、複数サーバーでクラスタリングを構成したい場合もいろいろ有力なオプションがある。それぞれに関してのざっくりした感想を共有したい。クラスタの場合は、決定的なソリューションは存在しない。各ソリューションによって、特色が違うので、その好みによって使い分けるといいだろう。

  • Docker Swarm
  • docker cloud
  • Mesos / Mesosphere DCOS
  • Nomad
  • Kubernates

最初にお断りしておくが、私はKubernates だけ試していないのでその感想は他の方にお譲りいたします。

3.1. Docker Swarm

Docker Swarm はクラスタリングを構成する環境としては、Docker Compose もサポートされているため操作は快適に感じる。単にクラスタを構成したい場合のオプションとしてはかなりいい感じ。唯一の欠点をお話するとインストールが面倒臭いことにある。  この点は、上記でご紹介した「IaC テンプレートの利用」がら楽だろう。Azure とかの例しかしらないので、恐縮だが、Azure の場合だと、Swarm クラスタをワンボタンでデプロイできる テンプレートが公開されているし、より凝ったものでも、Azure Container Service というサービス化されたテンプレートも公開されている。

docs.docker.com

azure.microsoft.com

3.2. Docker Cloud

Docker Cloud もスケールとかは可能だ。楽さにかけては No.1 ただし、前述したとおり Docker Compose に似た仕組みは動くが、Docker Compose はまだ動作しない。今後楽しみだ。

3.3. Mesos / Mesosphere DCOS

Mesosphere DCOS はクラスタ自体を1台のコンピュータのように扱える「データセンターOS」と呼ばれる仕組みだ。リソースのアロケーションとジョブ / サービスの実行、インストールが大変簡単だ。AirB and B で生まれて、TwitterApple でも使われているが、結構ごっついトランザクションをさばく必要のある基盤で使われる。 docker の実行も上記の2つに比べるとリソース割り当てを意識する必要があるので簡単ではないが、負荷の高い環境では要注目!

課題はインストールの面倒くささ。これはSwarm 以上のめんどくささだが、これも同じく「IaC テンプレート」が用意されている。Azure Container Service も内部は Mesosになっているので、そういったものを利用するといいだろう。

mesosphere.com

azure.microsoft.com

3.4. Nomad

 最後にご紹介するのが、HashiCorp の Nomad だ。Nomad はよりシンプルで、多機能ではないが Mesosに近いことができる。Nomad の素晴らしいところは、インストールが劇的に簡単で、シンプルなので理解がしやすいところだ。上記のソリューションと同じく、「IaC テンプレート」を使うと良い。私が個人で書いた Nomad と Docker がインストールされた環境を簡単に Azure で使えるようにしたテンプレートが次の通りだ。テンプレートのインストール部分は劇的に簡単だ。尚、HashiCorp は Vagrant で有名な会社だが、他にも良質なソフトウェアを多数作成している。Consul とクラスタ構築の基盤が Nomad でも使われているが、先ほど紹介した Swarm でもこのConsul がクラスタを構築する基盤の一つとして採用されている。

Nomad - HashiCorp

これは私が書いた ARM のテンプレートで、学習目的で Nomad と Docker が入ったインスタンスを500台までプロビジョンできるコード。GitHub ページの Deploy to Azure ボタンを押すと Azure に仮想サーバーが Deploy されるにようしている。

github.com

まとめ

 簡単ですが、現在の docker 環境構築のパターンをまとめてみました。少しでもお役に立つと嬉しいなと思います。繰り返しますが、日進月歩の分野でもあるので、コメント や他のいい方法など Welcome です! 私も勉強したいです!