Inc.前の記事CoffeeScriptで花火を打ち上げる次の記事Herokuのように簡単に使えるDockerベースのPaaSDockerホストをプロジェクトや権限で分ける2014年09月04日irohirokiTweet(本エントリはDockerの基礎知識を前提としています。)Dockerにはイメージやコンテナレベルのアクセス制限機能がありません。Dockerデーモンに接続できる人は誰でも、全てのイメージやコンテナを操作できます。よって、社内にDockerを使う複数のプロジェクトがあり、各プロジェクトメンバーの権限をプロジェクト内に制限したい場合、Dockerホストを分ける必要があります。今回は、そんなシチュエーションでDocker-in-Docker(Dockerの入れ子)を活用する話です。アクセス制限機能がないかコンテナを起動するときDockerホストの/(ルート)をマウントすると、コンテナの中からホストの全てのファイルにアクセスできます。Dockerデーモンへのアクセスはホストのroot権限と同等であり、イメージやコンテナレベルのアクセス制限をしても意味がありません。Dockerのポリシーは、「Dockerデーモンにアクセスできる者を制限せよ」です。共用の開発用サーバKRAYでWebアプリケーションを開発する際には、開発中の機能を同僚エンジニアやその他の関係者に見せるためのサーバを用意します。これをインテグレーションサーバと呼んでいます。今まではVirtualBoxでインテグレーションサーバを作り、1台のオンプレミスマシンでホスティングしていました(下図)。KRAYの殆どのプロジェクトがその1台のオンプレミスマシンを使うので、メモリ不足やCPUパワー不足になることがしばしばありました。DockerのインテグレーションサーバDockerが登場し安定して使えるようになり、まず一つのパイロットプロジェクトでVirtualBoxをDockerで置き換えました(ダニーがやってくれました)。このDockerコンテナの中ではsshdやunicornが動作し、capistranoでRailsアプリをデプロイする構成でした(下図)。このコンテナは永続的で、アプリケーションの実行環境と一体でした。Docker-in-DockerDockerの特長の一つは、クリーンでポータブルなアプリケーションの実行環境を瞬時に作れることです。開発中からコンテナを使い、アプリケーションのバージョンが上がる度にクリーンな状態からコンテナを作れば、環境依存の問題を避けられます。私が8月から担当するプロジェクトでは全環境でDockerを使うことにしました。この方針を実現するには、開発環境、インテグレーション、本番の全ての環境でそれぞれ別の課題がありましたが、今回はインテグレーション環境の話です。上述の通り、インテグレーションサーバは既にDockerコンテナの中なので、アプリケーションをコンテナとして実行するにはDockerの中でDockerを実行する必要があります。そのためにDocker-in-Dockerのヘルパであるjpetazzo/dindを利用しました。runするとデフォルトではDockerデーモンが起動し、最終的にbashに処理が渡ります。プライベートなDockerデーモンにbashでアクセスできるのですが、これはインテグレーション環境の要件と合わないため、bashの代わりにsshdが起動するようにしました。この改造dindをインテグレーションサーバとして使うことで、中でアプリケーションコンテナを起動できます(下図)。3.13.0-24-generic)を使いました。2.6.32-431)ではdindの中でcgroupをマウントできず、Dockerデーモンを起動できませんでした。Dockerのバージョンは1.1.2です。改造dindはSSHサーバなので、接続を許可する人の公開鍵をまず用意します。公開鍵は.sshに置くようにauthorized_keysという名前でリポジトリの同名ファイルと置き換えてください。イメージ名はここではdind-sshdとします。.ポート改造dindは以下のポートをEXPOSEしています。buildしたばかりのイメージでは8080番は使って(LISTENして)いませんが、アプリケーション用に確保してあるという意味です。起動するときはこれらのポートをホスト側の決まったポートにマッピングした方が便利でしょう。12080:8080となります。その他のオプションオリジナルからのdindの制約として、–privilegedオプションが必要です。LOG=file(文字通り「file」)と書くと/var/log/docker.logがログファイルになり、それ以外だと標準出力に吐出されます。好きな名前も付けた方が便利でしょう。まとめると以下のようになります。dind-sshdこれでホスト側の12022ポートにsshすることで改造dindの中に入れます。あとは好きなようにアプリケーションを設置してください。まとめDockerデーモンへの接続は、ホストのroot権限を取ることと同等Docker-in-Dockerを使うことで、1台のホストで複数のDockerデーモンを使えるdindをSSHサーバにするのもアリ次回はDockerを使った本番環境の話を書く予定なので、よろしければそちらも読んでいただけると嬉しいです。posts.前の記事CoffeeScriptで花火を打ち上げる次の記事Herokuのように簡単に使えるDockerベースのPaaS「いいね!」で応援よろしくお願いします!このエントリーに対するコメントコメントはまだありません。date*日本語が含まれない投稿は無視されますのでご注意ください。fax.0422-26-9781お問い合わせはこちらからどうぞ。