読者です 読者をやめる 読者になる 読者になる

そんな今日この頃でして、、、

コード書いたり映画みたり。努力は苦手だから「楽しいこと」を探していきたい。

Docker Composeでコンテナ運用を簡単化してみる

Docker

Dockerそれなりにいじれるようになり入門レベルは脱したかなと思ってはいるが、色々なものを読むとまだまだ学びがありますな。

先日配信されたWEB+DB PRESS vol.86には正にDocker運用が特集されており、「1コンテナ1プロセスの徹底=パーツの代替可能性確保」あたりなんかはかなり自分の中では意識変革があった。

WEB+DB PRESS Vol.86

WEB+DB PRESS Vol.86

  • 作者: 結城洋志,沖元謙治,足永拓郎,林健太郎,大竹智也,内田誠悟,伊藤直也,中山裕司,hiroki.o,泉水翔吾,佐藤太一,高橋俊幸,西尾泰和,舘野祐一,中島聡,橋本翔,はまちや2,竹原,麻植泰輔,WEB+DB PRESS編集部
  • 出版社/メーカー: 技術評論社
  • 発売日: 2015/04/23
  • メディア: 大型本
  • この商品を含むブログを見る

(今月号の他の記事も含め個人的にヒット率高い。定期購読してない人も手にとってみる価値はあると思う。)

これまではコンテナをアプリケーションの可搬性を良くするもの程度にとらえていたので、supervisordなんかを使って無理やり複数プロセスを1コンテナに押し込み、さながらミニマルなVMとして1アプリ1コンテナで運用することを考えていた。

だが、Dockerの理念に従うならばそれは邪道であり、プロセスごとにコンテナ化してlinkを用いて連携させるのが王道なようだ。

Dockerコンテナ間のlink,database.ymlの書き方 | SOTA


さて、そうなってくるといささか面倒くさくなってくるのがコンテナの管理運用。

1つのアプリケーションを動かすために本体だのストレージだのと複数のイメージを適切な引数を付けて起動しなければならず、ちょっとしんどくなってくる。

起動用にシェルスクリプトを書くとかでも良いっちゃ良いのだが、流石にチームで運用管理するとなるとしんどいし、中の1コンテナだけイメージを更新するとか一括で止めるとか、そういう管理もしづらい。

そこで活躍するのがfig改めDocker Composeだ。

docs.docker.com

ざっくり言ってしまえばアプリケーションに必要な複数のコンテナだとか起動時の引数だとかをymlファイルに記述することで、一括で操作できるようにしてくれるツールである。

前にfigという名称だったころ試そうとして導入に失敗し、その時はそこまで必要性も感じなくてそのままにしていたんだけど、今回の1コンテナ1プロセスを徹底することを考えると凄く便利ですな。


導入

Docker Compose

とりあえず入ってるDockerが1.3以降なことを確認

$ docker --version
Docker version 1.4.1, build 5bc2ff8/1.4.1

ドキュメントに倣い導入する。

# curl -L https://github.com/docker/compose/releases/download/1.2.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose

色々やってて気づいたけど(少なくともCentOS6だと)sudo時に/usr/local/bin以下を参照してくれないんですな。

これまでdockerはsudoつけていじってたけど、それだとdocker-composeを素で叩くと動かせず、かといってsudoつけただけだとdocker-composeコマンドが見つからず・・・

vimsudoでいじるなりパス引き継ぐなりエイリアスきるなり方法はあるけれど、それをするぐらいならいっそアカウントをdockerグループに追加してしまった方が楽。(dockerコマンドもsudoなしでいじれるようになるし。)

そんなわけでついでにdockerグループに自分のアカウントを追加しておく。

$ sudo groupadd docker
$ sudo usermod -aG docker アカウント名
$ docker ps -a #sudoなしで使えてるのを確認

Let's Chatで実例

ちょうど先日社内で導入したLet's ChatなんかがアプリのコンテナとMongoDBのコンテナを連携させるような構造なので、これをComposeで動かしてみる。

github.com

実は元々fig.ymlが同梱されてて、単に持ってきてdocker-compose upでもいけるけど・・・

$ docker-compose up
fig.yml is deprecated and will not be supported in future. Please rename your config file to docker-compose.yml

fig.ymlはもう古いぜってな警告でるし、イメージは既に作ってあったりするのでそっちを使うように新たに書きなおしてみた。

docker-compose.yml記述

作業ディレクトリを作り、docker-compose.ymlというファイルを作り下記の記述をする。

web:
  image: lets-chat:latest
  links:
   - db:db
  ports:
   - 5000:5000
db:
  image: mongo:latest

内容は

  1. イメージ「mongo」をdbという名称のコンテナとして起動 docker run -d --name db mongo
  2. イメージ「lets-chat」を5000番ポートをホストと繋ぎ、先に起動したdbコンテナとリンクさせて起動docker run -p 5000:5000 --link db:db lets-chat

という2つの操作。

ベタに起動スクリプトを書くのに比べても格段に読みやすく管理しやすいと思う。

docker-composeからの起動

docker-compose.ymlのあるディレクトリで下記コマンドで起動できる。

$ docker-compose up -d #デタッチモードでの起動
Recreating letschat_db_1...
Recreating letschat_web_1...

これで記述した両方のコンテナが立ち上がる。

$ docker ps -a
CONTAINER ID        IMAGE                           COMMAND                CREATED              STATUS                          PORTS                                            NAMES
08752afba892        lets-chat:latest                "npm start"            About a minute ago   Up About a minute               0.0.0.0:5000->5000/tcp                           letschat_web_1
d03eec08ad95        mongo:latest                    "/entrypoint.sh mong   About a minute ago   Up About a minute               27017/tcp                                        letschat_db_1

あるいは

$ docker-compose ps
     Name               Command          State           Ports
-----------------------------------------------------------------------
letschat_db_1    /entrypoint.sh mongod   Up      27017/tcp
letschat_web_1   npm start               Up      0.0.0.0:5000->5000/tcp

同様にしてdocker-compose killとかdocker-compose rmとかで一括でのコントロールができるので、個別で管理するよりも格段に楽になる。


件の特集記事には他にもログまわりとか監視まわりの話題も載っているので、本格的に使う際には非常に参考になりそう。

WEB+DB PRESS Vol.86

WEB+DB PRESS Vol.86

  • 作者: 結城洋志,沖元謙治,足永拓郎,林健太郎,大竹智也,内田誠悟,伊藤直也,中山裕司,hiroki.o,泉水翔吾,佐藤太一,高橋俊幸,西尾泰和,舘野祐一,中島聡,橋本翔,はまちや2,竹原,麻植泰輔,WEB+DB PRESS編集部
  • 出版社/メーカー: 技術評論社
  • 発売日: 2015/04/23
  • メディア: 大型本
  • この商品を含むブログを見る