この記事はQiita Docker Advent Calendar 2015の25日目に投稿させて頂いた記事です。

DockerをVirtualBoxのVM代わりに利用することはこれまでもあったが、本番環境で大規模なシステムを組むことを想定して本腰をいれて学び始めたのはつい最近。

数十のサーバからなるシステムをコンテナ化するのを目標に、僕が実際に手を動かして実施したこと、あるいは参考にさせて頂いた記事を忘れないようにまとめさせて頂きました。

基本的にはDocker1.9時にリリースされている機能を対象にしており、リンクのタイトルにPAYFORWARDと付いているものは僕が実施した内容がまとまっている記事だ。また、参考リンクを載せている場合は現段階で一番良いと思っているものが載せてあり、より良いものを発見したら随時変更するつもりである。

① 基礎知識編

1. ネットワークの基礎を学ぶ

手元でコンテナ動かして適当にVMの代わりに使う程度なら必要無いかもしれないけど、コンテナで大規模なネットワークを構築する場合はネットワークの基礎知識必要。TCP/IPとかOSI参照モデルとか基本的なことを勉強するのに参考になればと。そんなもん必要ないという人は飛ばしてください。

2. Dockerで使われる技術を学ぶ

LXCとかDockerとかコンテナ技術で使われているのはLinxuカーネルが標準で提供している機能が多い。特に、CgroupsやNamespaceといった技術はコンテナ技術を語る上で欠くことが出来ない。この辺はOpenStackのNeutronとか他の仮想化技術でも使われていたりする。基本となる技術はきちんと抑えて深掘りして行きたい。

加藤さんの今さら聞けない Linux コンテナの基礎は動画も公開されている。

3. Dockerの全体像を把握する

何をするにしてもそうだが、全体像を把握してから細かい知識をつけたり、実際にツールを触ってみるのが僕の性に合っている。全体像を理解する上ではzembutsuさんの資料が良かった。Dockerを使う目的が必ずしもスライド通りであるとは限らないが、こんな感じの技術なんだなという概要を掴む上でとても助かりました。

1つ目はSwarm入門になってるけど、他のDockerツールについてもわかりやすくまとまっている。

4. 書籍

ここまでは無料のサイトやスライドの紹介を中心に行ったが本の方が良いという人はこの辺が個人的にお勧め。

Dockerエキスパート養成読本[活用の基礎と実践ノウハウ満載!] (Software Design plus)はDockerの技術的背景、使い方、事例を限られたページでまとめている。個人的にこのシリーズは結構好き。

Docker実践入門――Linuxコンテナ技術の基礎から応用までは1章が仕組みの話で以降は実際に手を動かして学んで行く形式になっている。また、後半にはKubernetesを使ったコンテナのオーケストレーションにも触れている。

The Docker Book: Containerization is the new virtualization (English Edition)は英語の書籍だが、Docker社のアドバイザの方が書かれている物で常に最新のDockerバージョンに追従して行く。技術の陳腐化が激しく、他の書籍の情報は1年後は使えないと思うがこの本はそれがないので非常にお勧めできる。

Dockerエキスパート養成読本[活用の基礎と実践ノウハウ満載!] (Software Design plus)
  • Author: 杉山 貴章
  • Manufacturer: 技術評論社
  • Publish date: 2015-06-18
  • Docker実践入門――Linuxコンテナ技術の基礎から応用まで
  • Author: 中井悦司
  • Manufacturer: 技術評論社
  • Publish date: 2015-09-26
  • The Docker Book: Containerization is the new virtualization (English Edition)
  • Author: James Turnbull
  • Manufacturer: James Turnbull
  • Publish date: 2014-07-12
  • ここまでで色々紹介したが当然Dockerの公式ページのドキュメントが一番情報が充実しているし、信頼性も高いことを忘れては行けない。

    ② ハンズオン編

    ここからは実際にDockerを触って行く。とりあえずは運用のことを考えずにDocker環境の準備から基本的な機能を抑えていく。

    1. PCスペックについて

    ハンズオンの話をする前にPCスペックについて話しておく。Dockerをアプリケーション開発のVMの代わりに使う場合やちょっと使ってみる程度なら今のPCなら十分なスペックを持っているので気にする必要はない。

    しかし、サーバサイドのエンジニアで手元のPCで数十のコンテナからなる大規模なシステムを作ったり、マルチホスト環境でのコンテナクラスタ、オートスケーリング、ブルーグリーンデプロイメント等の検証をしたい場合、メモリ16GB、Dual Core CPUくらいは必要になってくる。

    このクラスのPCは高価だが検討する価値はある。いきなりベアメタルサーバやAWSやGCPなどのクラウドサービスを使って検証するのもがいいが、手元で本番環境に近い環境を構築できるのもDockerの良い所だからだ。

    2. Docker環境の準備(Docker ToolBox)

    昔はDockerの環境を整えるのも結構大変だったみたいだが、Docker Toolboxを使えばお手軽簡単にお好きなOSでDocker環境を構築できる。

    3. Dockerホストの構築(Docker Machine)

    Docker Engine(Docker Deamon)が動いているサーバをDockerホストと述べているが、Docker Machine(Boot2Dockerの後継)を使うことで簡単にサーバをDockerホストにすることが出来る。Docker MachineはDocker Toolboxをインストールすると一緒にインストールされる。

    4. Dockerイメージの作成とコンテナの構築(Dockerfile)

    Dockerfileを使ってコンテナの元となるイメージを作る。イメージからコンテナを起動する。VMにおけるovaにあたるものを作っている思えばわかりやすい。

    5. 複数のコンテナから1つのシステムを作る(Docker Compose)

    例えば、Nginxコンテナ、Webアプリケーションコンテナ、DBコンテナから成るシステムを作りたい時にコンテナを1つずつ起動して、互いの依存関係を解決するのは億劫ではないだろうか?ComposeはそれらをYAMLに定義することで、docker-composeコマンドで複数コンテナから成るシステムを一括管理できるようにする。

    6. マルチホストでクラスタを組む(Docker Swarm)

    マルチホスト環境でのDocker運用もできるようになってきた。Swarmを使えば、複数のDockerホストをクラスタ化できる。また、Docker1.9で追加されたoverlay networkを使えばlinkオプションを使わずに異なるホストに存在するコンテナが通信できるようになる。

    7. ログの管理をする(Logging Driver)

    Dockerコンテナで発生したログを確認するのにdocker logsが使われる。しかし、従来のログのようにSyslogやfluentdで管理した時が有る。これを実現するにはDocker1.6から追加されているLogging Driver使えばいい。Driverにはいくつか種類があるが、Syslog Driverを利用すればDockerホストのSyslogにコンテナのログを出力することが出来るし、fluentd Driverを使えばfluentdでログを集約できる。

    8. コンテナでハニーポットをつくる

    セキュリティ分野のハニーポットと呼ばれる技術を知ってるだろうか。予め脆弱性のあるサーバを用意し、世に出回る攻撃やマルウェアの情報を収集するのが主目的である。この技術とコンテナ技術は非常に相性が良い。実際にDocker、ELK、IPSなどを組み合わせたシステムの構築をしたことがあるので紹介しておく。

    ③ オペレーション編

    1. GUIでDockerを操作する(Docker Universal Control Plane)

    これまでDockerの管理はCUIによるものが基本だったし、今後もそれは変わらないと思うがGUIによるDockerの操作が可能になってきている。サード・パーティのRancherやPanamaxなんかはその代表格だ。一方で、Docker社純正のGUIツールDocker Universal Control Planeも近いうちにリリースされることになりそうだ。Docker Universal Control Planeの使用感は以下を参考にされたし。

    2. セキュリティ(Benchmark & Content Trust)

    Understanding Docker Security and Best PracticesにあるようにDocker社はセキュリティ対策にも力を入れており、2015年12月25日現在はDocker Bench for SecurityDocker Content Trust、2つのセキュリティの対策を公開している。

    コンテナのセキュリティに関するベストプラクティスやナレッジが自分の中でまだ明確になっていないので、ツールも含めてDocker社がどのような取り組みをしている日々調査する必要がある。

    Docker Bench for Securityとは

    Docker Bench for Securityはベンチマーク調査の推奨設定を基準にDockerコンテナの設定を自動的に診断するツールである。使用感は以下を参考されたし。

    Docker Content Trustとは

    Docker Content Trustはデジタル署名技術を利用したDocker イメージ発行者の真正性の検証とDockerイメージ自体の信頼性の検証を行う仕組み。

    3. コマンドチートシート

    Dockerコマンドのチートシート。まとまっているので目を通しておくと良い。リンク先には載っていないが、検証時は全てのコンテナを強制削除する

    docker rm -f `docker ps -a -q`
    

    なんかも良く使った。

    ④ その他

    1.ユースケースを知る

    国内外のDockerのユースケースをまとめた、国内だとProductionで使うよりは開発環境やデータの解析基盤開発で利用している例が多いようだ。目新しい物があれば随時追加していこうと思う。

    2. ネットワーク周りをさらに理解する

    Docker1.9からネットワーク周り推奨設定がかなり変わっているので確認しておいたほうがいい。

    終わりに

    アプリケーション開発やちょっとした検証でVMの代わりにDockerを使いたいというひとは、この記事で紹介しているDockerエキスパート養成読本[活用の基礎と実践ノウハウ満載!] (Software Design plus)くらいの知識があれば十分だろう。ツールと割り切り無駄な時間をかけないのも重要な戦略だ。一方で、サーバサイドのエンジニアとして何らかの理由でDockerを使ったシステム構築をする算段があるなら、きちんと周辺技術も理解するべきだろう。また、技術の進化が早いので勉強しているうちにバージョンが上がり中身がガラッと変わることもあった。公式ドキュメントの変更点を確認する重要性を痛感した。(例えば、Kubernetesを使えばDocker純正ツールでできないことができる!!みたいな記事が散見されるが、そんなことはなくて、Docker単体でもできるケースが多い。公式ドキュメントを確認した方がいい。)

    すこしでも皆様のお役に立つと嬉しいです。