この記事の目的
この記事では、
Docker-Composeで利用するyamlの書き方を理解すること
と
Docker-Composeを利用して、一つのアプリとして動作する複数のコンテナを一気に起動させること
を目的としています。
本題
★対象とするもの
本記事では、APIゲートウェイとして利用されるOSS【kong】を題材にします。kongは、Dockerイメージとして公開されていますが、動作するためには、一緒にDBを起動する必要があります。そのDBは、【postgres】と【Cassandra】がサポートされています。本記事ではpostgresを選択しました。また、kong自体は、GUIを持ちません(エンタープライズ向けのエディションではGUIあるっぽいですが・・・)
そのため、GUIを出すためのOSS【konga】を合わせて利用するようにしていきます。
文字だけではわかりにくいので、図にしました。完成イメージはこんな感じです。
★Docker Composeを利用しない場合
それぞれのコンテナをDocker Composeを利用しない場合、どのようにインストールするのかをまとめます。
まず、kongです。kongの公式サイトに書かれています。大まかな流れとしてはpostgres-kongという順番で起動することになっています。一点注意があるとすれば、kongの起動前にpostgresにkong用データベースを作成するための[kong migration]処理があるということです。
docs.konghq.com
次に、kongaです。kongaは、DockerHubのサイトに書かれています。kongが立ち上がっている状態で実行します。
https://hub.docker.com/r/pantsel/konga/
各サイトに記載された流れでコマンドを打っていけばスムーズにインストールを完了させることができます。
ただ、これ、1回だけの起動でよければ苦ではありませんが、複数回起動するのであれば、面倒ですね( ゚Д゚)
ということで、次からはDocker Composeによる起動方法を試していきます。
★Docker Composeとは
[docker-compose.yaml]に、コンテナの起動設定を記述することで、Docker runコマンドで設定してきたことをまとめて実行することができるようになります。
コンテナ起動時に、ホスト側のポートと、コンテナ側のポートをマッピングしたい。
ホスト-コンテナ間の共有フォルダを設定しておきたい。
などの設定もyamlに設定することで、定義することができます。
では、実際にどんなことが定義できるのか・・・ということは以下のURLにまとまっていますw
docs.docker.com
バージョンも1~3と複数あって、それぞれでサポートしている要素が違っていたりするなど、初心者的につらいです(-_-メ)バージョンは3が主流なのか・・・
・・・まだわからないことだらけですが、ゆっくりリファレンスを読み進めていきたいと思います。ちなみに本記事では、バージョン2.1を利用して定義しています!
★今回作ったDocker-conpose.yaml
以下の内容が書かれたyamlを定義し、Docker Composeを二回実行すると、kongに必要なコンテナが立ち上がります。
version: '2.1' services: ## # kongコンテナの設定 ## kong: container_name: kong image: kong depends_on: #順番を指定して実行ができる。※Compose はコンテナの準備が「整う」まで待ちません kong-database: condition: service_healthy kong-migration: condition: service_started environment: - KONG_DATABASE=postgres - KONG_PG_HOST=kong-database - KONG_PG_DATABASE=kong - KONG_ADMIN_LISTEN=0.0.0.0:8001 ports: #ポートフォワーディングに関する設定(ホストポート:Docker コンテナポート) - "8000:8000" - "8443:8443" - "8001:8001" - "8444:8444" #ntrypoint: wait-for-it.sh command: apk --update command: apk add postgresql-client command: apk add curl command: kong start --vv ## # kongの初期化用コンテナの設定 ## kong-migration: container_name: kong-mirate image: kong depends_on: kong-database: condition: service_healthy environment: - KONG_DATABASE=postgres - KONG_PG_HOST=kong-database command: kong migrations up ## # kong用データベースコンテナの設定 ## kong-database: container_name: kong-database image: postgres ports: - "5432:5432" environment: - POSTGRES_USER=kong - POSTGRES_DB=kong healthcheck: test: ["CMD", "pg_isready", "-U", "postgres"] interval: 10s timeout: 5s retries: 5 ## # kongのGUI用コンテナの設定 ## konga: container_name: konga image: pantsel/konga depends_on: kong-database: condition: service_healthy environment: - TOKEN_SECRET=kongGUIapplication #// or "development" | defaults to 'development' - DB_ADAPTER=postgres #// 'mongo','postgres','sqlserver' or 'mysql' - DB_HOST=kong-database - DB_PORT=5432 #Defaults to the default db port - DB_USER=kong #Omit if not relevant - DB_DATABASE=kong #Defaults to 'konga_database' - NODE_ENV=development # or 'development' | defaults to 'development' ports: - "1337:1337"
一点、課題があります。DBの構成が完了するまで処理を待つということがDocker-composeの基本機能でできないため、このままでは、docker-compose upコマンドを二回実行しないとすべて立ち上がりません(=_=)。一応対応策はあるのですが、まだ成功していません・・・
参考)http://docs.docker.jp/compose/startup-order.html
まとめ
今回はDocker compose用yamlの記述方法と、
実際に複数コンテナを起動させ、処理を実行すること(題材は「kong」)
についてまとめてみました。
課題として、DBコンテナに特定のデータベースができるまで待機する処理をDocker Composeでどう実現するかというものが残りました。
kubernetesにもっていくときにも課題となりそうなので、早々に対応してみたいと思います(/・ω・)/
KONG参考資料
kong自体については、以下の資料を参考にしました。
www.slideshare.net