fbpx

[和訳] アプリケーションパッケージでDocker Composeを使いやすく #docker

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

本稿は MAKING COMPOSE EASIER TO USE WITH APPLICATION PACKAGES (2018/6/21) の和訳です。

Docker Composeはアプリケーションを記述するために、開発者に広く浸透しています。実際、GitHubには30万以上のDocker Composeファイルがあります。docker-compose.yml ファイルに一連のサービスを記述しておけば、1つのコマンドを実行するだけでDocker上に複雑なマルチサービスのアプリケーション(または単純な単一サービスのアプリ)を簡単に起動できます。Docker Composeの使い勝手のよさは、プロジェクトを早急に立ち上げる方法を渇望している開発チームにとって最適です。

Docker Composeは徐々に進化を遂げる中で、複数の本番環境に同じアプリケーションをデプロイする際に役立つ機能を、多数追加してきました。例えば、多くのレプリカやメモリリソースの制限、またはカスタムSyslogサーバなどです。しかしこれらの特性は、各ユーザの環境に固有の場合もあります。この状況に対処するために多数の異なる戦略がありますが、もっとも一般的なものはコピー&ペーストに頼ることです。この方法は例えば、異なる環境内で実行している同じアプリケーション用に、複数のDocker Composeファイルをメンテナンスする場合にきわめて一般的な方法です。コピー&ペーストにおける2つの問題点:

  1. Dockerイメージを常に共有しているとしても、それらのイメージを使用するマルチサービスのアプリケーションを共有するための優れた方法がありません。
  2. Docker Composeファイルについて、開発チームと運用チームが協力しづらくなります。アプリケーションをコードで記述する重要な利点は、開発者と運用者が1つのコードを共有し、本番環境に到達する前に設定に関する問題をキャッチする機会があるにも関わらず、です。

Dockerアプリ入門

この問題に対処する方法の1つは、Docker Composeの付加的なツールを構築することです。それにより、さらに共有、協力がしやすくなります。これは現在、実験的および作業進行中のものであることをご承知おきください。そのため皆さまからのフィードバックや、早い時期に試してくださった方々からのご意見もお待ちしております。得られる結果は:

  1. Docker Composeに基づいたアプリケーションをDocker HubとDTR上で共有可能となる。
  2. アプリケーションの記述と各環境設定間の、より確実な責任範囲の分離をサポート。

この実装は、追加のメタデータファイルと小さなコマンドラインツールで構成しています。例をお見せしましょう。

次のDocker Composeファイルをご覧してください。これは、設定ポートにアクセスしたときに指定の文を表示するHTTPサーバを起動するDocker Composeファイルです。


version: '3.6'
services:
hello:
image: hashicorp/http-echo
command: ["-text", "hello world"]
ports:
- 5678:5678

docker-appをインストールしたら、このComposeファイルを元にアプリケーションパッケージを作成しましょう:


$ docker-app init --single-file hello
$ ls
docker-compose.yml
hello.dockerapp

アプリケーションパッケージは、単なるテキストファイル(またはディレクトリ)で、今回はhello.dockerappという名前になっています。このパッケージは次の3つのYAMLドキュメントを有します。

  • いくつかのメタデータ
  • Docker Composeファイル
  • 該当アプリケーションのいくつかの設定

このパッケージは次のようになっているはずです:


# This section contains your application metadata.
version: 0.1.0
name: hello
description: ""
maintainers:
- name: yourusername
email: ""
targets:
swarm: true
kubernetes: true
 
−−
 
# This section contains the Compose file that describes your application services.
version: '3.6'
services:
hello:
image: hashicorp/http-echo
command: ["-text", "hello world"]
ports:
- 5678:5678
 
−−
 
# This section contains the default values for your application settings.
{}

設定セクションを編集し({}を置き換えます)、アプリケーションの初期値を追加しましょう:


port: 5678
text: hello development
version: latest

そして、次の変数を追加し、Composeファイルセクションを修正します:


version: '3.6'
services:
hello:
image: hashicorp/http-echo:${version}
command: ["-text", "${text}"]
ports:
- ${port}:5678

最後に該当のComposeファイルを提供の初期値でレンダリングすることで、すべてが機能していることをテストします。


$ docker-app render
version: "3.6"
services:
hello:
command:
- -text
- hello development
image: hashicorp/http-echo:latest
ports:
- mode: ingress
target: 5678
published: 5678
protocol: tcp

変数が設定した値で置き換えられていることに注目しましょう。これでこのDocker Composeファイルを他のファイルと同様に扱うことができます。アプリケーションを公開するためには、例えばディスクに保存したり、直接docker stack または docker-compose にパイプします。


$ docker-app render | docker-compose -f - up

ここが面白いところです。これらの設定は実行時に、--setオプションを使うことで上書きできます。別のオプションも指定し、もう一度レンダリングしましょう:


$ docker-app render --set version=0.2.3 --set port=4567 --set text="hello production"
version: "3.6"
services:
hello:
command:
- -text
- hello production
image: hashicorp/http-echo:0.2.3
ports:
- mode: ingress
target: 5678
published: 4567
protocol: tcp

portとversionの変更が、Composeファイルに反映されていることに注目しましょう。

ご希望に合わせて、これらの設定を保管するために独立した設定ファイルを作成できます。次のコンテンツで prod.yml を作成しましょう:


version: 0.2.3
text: hello production
port: 4567

そしてDocker Composeファイルを、この設定ファイルでレンダリングしましょう:


$ docker-app render -f prod.yml

これにより、別の環境向けに設定ファイルを分割しやすくし、重複するDocker Composeファイルをいくつも持たなくて済むようになります。

"Hello world" レベルよりも先に進みたい方向けにリポジトリには、さらに上級レベルの例もあります。

前述のDocker Composeの環境変数サポートを使う場合と類似したものを実装することができます。その場合、優れたユーザインターフェイスを提供するためには自らツールを書く必要があります。前述の慣例を踏まえれば、その上により面白いものを作ることも可能です。例えば次のような、きわめて興味深いイントロスペクションツールを構築することができます。そして単なる変数の代入を超えて、より複雑なテンプレートに移行する計画があります。

アプリケーションパッケージの検査とデプロイ

docker-app は単にComposeファイルを異なる設定でレンダリングする方法を提供するのみではありません。相互に役立つユーティリティも提供します。例えば誰かがあなたに、ある .dockerapp を手渡したら、あなたは簡単にそれについての情報を得ることができます。どの設定が実行時に使えるのか、パッケージコードを読み込むことなく見つけることに関しては特に容易です。


$ docker-app inspect
hello 0.1.0
Maintained by: gareth
A hello world example of a Docker application package.
Setting Default
−−−−−−− −−−−−−−
port 8080
text hello world
version latest

アプリケーションの該当バージョンをデプロイする準備が整ったら、サブコマンドのdeployで実行できます。これはdocker stack deployコマンドとまったく同じ方法で機能しますので、多くの読者にとってなじみ深いはずです。例えば、もしあなたがDocker DesktopまたはDocker EEを使用しているならば、公開済みの設定のいくつかをオーバーライドしながらも、該当のアプリケーションをKubernetesにデプロイすることができます。


$ docker-app deploy --set port=4567 --orchestrator=kubernetes

docker-appは、さらに役に立つツールを組み込んでいます。詳細は内蔵のヘルプ情報あるいは、今後のブログ記事でご確認いただけます。

現在の状況は?

6月21日に、すべてのDockerユーザのための実験的な実用機能であるdocker-appをリリースしました。早期に試してくださったユーザからのフィードバックを元に迅速な修正を行う予定です。また、Dockerコミュニティでコードやご意見をシェアしてくださる方々とも協働してまいります。これは、現在のdocker-composeやdocker stack コマンドの代わりとするものではありません。

docker-appで可能性を探りたい多くのアイデアがあります。Docker Hubにおけるアプリケーションの共有はすでにサポートしていますが、それを拡大するアイデアも多数あります。オフラインでのインストールをサポートする自己完結型のアプリケーションインストーラもまた、興味深いテーマです。リリース済みのバージョンではまだ使用可能になっていませんが、ツール内のさらに複雑なテンプレートオプション向けのサポートも用意しています。付随のメタデータも自動生成の様々なユーザインターフェイス向けに多くの機会を提供しており、インストレーションおよび管理ツールからドキュメンテーションとテストの実行までをカバーしています。読者の皆さまが何をご覧になりたいか私たちにお知らせください。

興味がわきましたか?

興味をもたれた方は、GitHubリポジトリ https://github.com/docker/appをご覧ください。基本的なドキュメンテーションといくつかの例および 最新バージョン (for Windows、またはmacOS、あるいはLinux)のダウンロード手順、そしてアプリケーションソースコードをご確認いただけます。リポジトリでissueを開き、質問、アイデア、issues レポートまたは機能要望をお書きください。

もしあなたがDocker EEユーザで、Docker Composeに基づくアプリケーションに興味がある、あるいは開発者と運用者間のワークフロー問題に取り組んでいる場合は、販売エージェントを通してご連絡ください。docker-appは現在、Docker EEと共に仕事をしており、新たな面白い統合の機会を積極的に探っています。

もっと学びたい方は:

新規CTA