きな粉もち.net

.NET関連仕事に携わっています。OSSのソースを読んで気がついたことを中心に呟いたりブログに投稿したりしています。最近はUiPathを使ったRPAも研究中。気軽にフォローやツッコミよろしくおねがいします! Gitはここを使っています https://github.com/kinakomotitti

Docker-Compose × kong/konga/postgre × 一気に作れるyamlを作ってみた

この記事の目的

この記事では、
Docker-Composeで利用するyamlの書き方を理解すること

Docker-Composeを利用して、一つのアプリとして動作する複数のコンテナを一気に起動させること
を目的としています。

本題

★対象とするもの

本記事では、APIゲートウェイとして利用されるOSS【kong】を題材にします。kongは、Dockerイメージとして公開されていますが、動作するためには、一緒にDBを起動する必要があります。そのDBは、【postgres】と【Cassandra】がサポートされています。本記事ではpostgresを選択しました。また、kong自体は、GUIを持ちません(エンタープライズ向けのエディションではGUIあるっぽいですが・・・)
そのため、GUIを出すためのOSS【konga】を合わせて利用するようにしていきます。
文字だけではわかりにくいので、図にしました。完成イメージはこんな感じです。
f:id:kinakomotitti:20180916002544p:plain

★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
www.slideshare.net
www.slideshare.net