‫ここでは､ コマンドラインツールと設定ファイルの組み合わせであるDocker
‫Composeに限定して説明します｡ このセクションの要件は､ イメージとコンテナに関する最後の数セクションで学んだ基本的な事柄の多くを知っている必要があることです｡
‫このコースを進めていくうちに､ だんだん私のテンションが上がってくるのがわかると思います｡
‫そうだろ？
‫1つのコンポーネントを学ぶと､ 「バインドマウントとボリュームは本当にクールだ」と思うようになります｡ これで時間が短縮できますね｡
‫使い方が想像できますね｡ バキバキバキバキバキ
‫そして､ 今学んだことよりもさらに優れたものを次に持ってくる｡
‫この場合､ これ以上ないほど真実です｡
‫Docker Composeです｡ で､ 何なんだ？ そして､ なぜ気になるのか？ そのため､ 真の意味でスタンドアロンなソフトウェア・サービスはほとんどありません｡
‫コンテナについて考えてみると､ コンテナは単一プロセスのソリューションであり､ コンテナ1つだけで問題を解決したり､
‫お客様にサービスを提供したりすることはほとんどないのです｡
‫私たちのコンテナは､ SQLやキーバリューなど､ 他のコンテナを必要とすることがよくあります｡ また､ プロキシやWebフロントエンド､ バックエンドワーカーなど､
‫コンテナで実行する必要のあるアプリケーションもありますね｡
‫もし､ Dockerの実行オプションをすべて記憶する必要がなく､ ソリューションのすべてのピースを一緒に接続する方法があったらどうでしょう｡
‫そして､ それらを関係性のある個別の仮想ネットワークに入れ､ パブリックポートだけを公開し､ 一つのコマンドでそれらをすべてスピンアップしたりティアダウンしたりできるとしたら｡
‫まあ､ それがDocker Composeなんですけどね｡
‫その前に､ Docker Composeには2つのパートがあることを確認しておきましょう｡
‫最初の部分はYAMLファイルで､ 超簡単に理解することができます｡
‫これはYAMLで書かれていて､ もしあなたがYAMLを扱ったことがなければ､ それはとても簡単な設定言語です｡
‫INIファイルとほとんど同じように簡単にできます｡
‫実は､ 上下関係がわかるから楽なんだと思うんです｡
‫そこに飛び込んでいく｡ このファイルには､ 実行に必要なすべてのコンテナ､
‫必要なネットワーク､ 必要なボリューム､ 環境変数､ イメージ､ その他あらゆる種類の設定オプションが指定されます｡
‫Docker Composeの2番目の部分は､ docker -composeというCLIツールで､
‫Dockerコマンドを単純化するために作成したYAMLファイルを使って､ ローカルの開発およびテストだけに通常使用するものです｡
‫そのDocker Composeファイルについて説明します｡
‫実は､ コンポジットファイルに入れることができるものにはバージョンがあるんです｡ ですから､ Docker Composeが何年か前に作られたときは､ 実は「Fig」という名前で､
‫バージョン1を想定しただけのものだったんです｡ 実際にはファイル内にバージョンも記載されていませんでした｡
‫それが成熟し､
‫ネットワークやボリュームなど､ ファイルが持てるものに新しい機能を追加していく中で､ 実際にファイルの1行目にあるバージョンステートメントを作成したのである｡
‫このファイルは､
‫実際にはDocker Compose CLIで使用することができます｡
‫これも､ 主にローカルでの開発管理､ そしてローカルマシンでの環境整備を容易にするためです｡
‫さて､ 2017年の年明けから､ バージョン1が登場します｡ 13 とそれ以上のものは､ これらのファイルを､ swarm を使って本番の docker
‫コマンドラインで直接使用できるようになりました｡ もちろん､ コマンドラインでは--helpで素晴らしいヘルプが用意されています｡
‫Docker Composeのファイルはデフォルトの名前ですが､ 適切なYAMLであり､
‫-fでどのファイルを使用するかを指定すれば､ どのようなファイル名でも使用できます｡
‫エディタを開いてこのテンプレートを見てみると､ どのように見えるかのアウトラインを示したいだけなのです｡
‫冒頭のバージョンバリューがあります｡
‫2017年第1四半期の最新バージョンは､ 3. 1.
‫でも､ いつも最低でもバージョン2にはしています｡ そこにその行を追加しないと､ 常にバージョン1と見なされます｡
‫しかし､ それでは多くの機能を失ってしまうので､ あまりお勧めできません｡
‫ですから､ 私は通常､ バージョン2から始めます｡ そして､ バージョン3や3のうち特定の機能が必要な場合｡ 1､ 結局そこにバージョン番号を入力してしまう｡
‫他に､
‫サービス､ ボリューム､ ネットワークの3つの主要なセクションがあることがわかりますね｡
‫つまり､ これはヒエラルキーなんですね｡
‫サービスでは､ すべてが2スペースでも4スペースでも構いませんが､ 一貫性を持たせる必要があります｡
‫インターネットでYAMLを調べれば､ このファイルの具体的な書式を案内しているサイトがいくつか見つかるはずです｡
‫もしあなたが最新のエディタを使用しているのであれば､ 実際にYAML言語を話し､ これらのファイルとそのフォーマットを扱う方法を知っていることでしょう｡
‫通常､ ここには最低限､ サービスというものがあり､ それは実際には単なるコンテナです｡
‫サービス」と呼ぶのは､ ここで作成したコンテナは､ 冗長性を確保するために複数のコンテナを持つことができるからです｡
‫だから､
‫別の言葉を考える必要があったのだ｡
‫サービスって､ 基本的にそういうものだからいいと思うんです｡ そうだろ？
‫あなたが使っているそれぞれのコンテナ､ あるいは同じコンテナは､ 通常､ 何かに対してサービスを提供しているのです｡
‫サービス名の下に､ また､ 好きなように呼び出すことができます｡
‫画像の名前である必要はありませんし､ 関連するものである必要も全くありません｡
‫サービス名はBarneyでも良いのですが､ Dockerネットワーク内で使用されるDNS名になります（後でわかります）｡
‫dockerのrunコマンドに--nameをつけたときと似ています｡
‫ここでは､ オプションで画像を指定できることを示しました｡ 実行する代替コマンドを指定することができるのです｡
‫もし､
‫イメージで指定された実際のコマンドを実行するときに上書きしたい場合は､ ここでそれを行うことができます｡
‫基本的に､ docker runコマンドから行うことはすべて､ ここに保存しておけばいいのです｡ なぜなら､ これこそが､ 常に実行しているものに対して､
‫docker runコマンドのさまざまな項目を覚えておくという作業をすべて取り除いてくれるものだからです｡
‫自前の開発環境や自前のツールをお持ちの方は､ それらのコマンドを何度も打ち込みたくないのではないでしょうか｡
‫また､ シェルスクリプトは､ それなりのことしかできません｡
‫そうだろ？
‫つまり､ このファイルは､ 実際には､ dockerの実行コマンドを自動化するシェルスクリプトの代わりになるのです｡
‫これなら､ もっといい方法がある｡
‫読みやすくなったし､ ドキュメントも充実した｡
‫ここにスペースが入ることが許されていることがわかります｡
‫コメントには好きな場所にスペースを入れることができます｡
‫複数のサービスがあった場合､ それらをユニークな名前にすればいいだけです｡
‫そして､ その他に指定する部分として､ ボリュームとネットワークがあります｡ そしてまた､ これらもオプションです｡
‫基本的には､ コマンドラインから実行するときと同じルールです｡
‫もし､ docker volume create や docker network create コマンドを使う必要があったとしても､
‫いつも使うわけではありません｡
‫ただ､ それはあなたの状況次第です｡
‫ここにも置くことができます｡
‫現実の､ 簡単な例を見てみましょう｡
‫あなたは最後のセクションで､ 私たちは本当に迅速にバインドマウントの例を行うためにJekyllを使用する講義があった覚えている｡
‫このように､ docker runコマンドを実行するためのcomposeファイルはこのようになっています｡
‫ジキルと名付けました｡
‫巻をあげました｡ pwdを使う代わりに､ Composeはドットを理解します｡ つまり､
‫これは私がいる現在の作業ディレクトリを意味します｡
‫コンポジットファイルを実行しているこのディレクトリを使えばいいんだ｡ 次にportsまたは-pオプションを指定します｡
‫YAMLについて少し気づいたことがあります｡ 1つのオプションしかない場合､ たとえば､
‫各サービスに1つの画像しかない場合､ 通常はこのようにキーと値のフォーマットになります｡
‫ボリュームやポートのように､ 複数持つことができる項目のリストになる場合は､ 通常､ composeファイルに複数があることに気がつくと思います｡
‫ボリュームではなく､ ヴォリュームです｡ そして､ portの代わりにportsです｡
‫そして､ 「-」のついたリスト形式になります｡
‫もうひとつの例を挙げましょう｡
‫これはWordPressのセットアップのサンプルで､
‫データベースコンテナを実行しているデータベースサービスがここにあります｡
‫そして､ 一番上にあるWordPressのWebサーバーのコンテナ｡
‫ちょっと違うのは､ 環境変数を使っていることです｡ これは､
‫コマンドラインの-eと同じでしょう｡ しかし､ リスト形式で「-」があるのではなく､
‫これもまたキーと値の文である｡
‫この形式では､ -を使わず､ キーと値だけを列挙しています｡
‫もし､ もう1つ追加する必要があるなら､ ここでそうすればいいだけです｡ これらはすべて､ コンテナの実行時にcomposeコマンドラインを使用して渡されます｡
‫では最後に､ もう1つの例をご紹介します｡ こちらは少し複雑です｡ 実は最近､ Ghost Webサーバーの後ろに3つのデータベースサーバーのクラスタをセットアップする作業をしていたものなんです｡
‫Ghostは､ 実はWordPressに似たブログシステムなんです｡ これらのコンテナごとに複数の環境変数を持っていることがわかると思います｡
‫だから､ ゴーストの容器を上に置いているんです｡ SQLプロキシは､ MySQLサーバーの前に設置し､
‫ロードバランサーやフェイルオーバーソリューションとして機能するものです｡
‫そして､ 2つのMySQLサーバーをそれぞれ持っています｡ この下に「depends on」というオプションがありますが､
‫「depends on」はかなり一般的なものです｡
‫基本的には､ Composeがこれらのサービスの関係を理解するのに役立ちます｡ ゴーストの起動が必要なら､ 他の起動も必要だということが分かっているのです｡
‫このように､ 私のゴーストは､ 実はこれにかかっているのです｡ この仕組みの詳細については､
‫後の講義でご紹介します｡
‫でも､ DockerのWebサイトには素晴らしいドキュメントがありますから､
‫信じてください｡ GoogleでDocker Compose fileと検索すれば､
‫おそらく最初の数件はこれがヒットするはずです｡
‫ドコモの下になるんですね｡ ドッカーです｡ comのウェブサイトでは､ いつものように､
‫小さなキーやバリューオプションの一つひとつについてドキュメントが掲載される予定です｡
‫先ほどのdepends onが表示されます｡ ここでは､ 環境変数のさまざまな入れ方を示しているenvironmentを見ることができます｡
‫このドキュメントの素晴らしいところは､
‫たくさんの例を示していることです｡
‫個人的には､ docker runコマンドのオプションページやcomposeコマンドのオプションページと同じように､ 毎日このサイトを見ているんです｡
‫最近は率直に言って機能が多すぎて覚えきれないので､ 常にこれらを参照するようにしています｡
‫だから､ ブックマークで身近に置いています｡
‫さて､ composeファイル形式がどのようなものか大体わかったところで､ コマンドラインに飛び､
‫Docker Compose CLIツールについて学びましょう｡