Dockerそれなりにいじれるようになり入門レベルは脱したかなと思ってはいるが、色々なものを読むとまだまだ学びがありますな。
先日配信されたWEB+DB PRESS vol.86には正にDocker運用が特集されており、「1コンテナ1プロセスの徹底=パーツの代替可能性確保」あたりなんかはかなり自分の中では意識変革があった。
- 作者: 結城洋志,沖元謙治,足永拓郎,林健太郎,大竹智也,内田誠悟,伊藤直也,中山裕司,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だ。
ざっくり言ってしまえばアプリケーションに必要な複数のコンテナだとか起動時の引数だとかをymlファイルに記述することで、一括で操作できるようにしてくれるツールである。
前にfigという名称だったころ試そうとして導入に失敗し、その時はそこまで必要性も感じなくてそのままにしていたんだけど、今回の1コンテナ1プロセスを徹底することを考えると凄く便利ですな。
導入
とりあえず入ってる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で動かしてみる。
実は元々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
内容は
- イメージ「mongo」をdbという名称のコンテナとして起動
docker run -d --name db mongo
- イメージ「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
とかで一括でのコントロールができるので、個別で管理するよりも格段に楽になる。
件の特集記事には他にもログまわりとか監視まわりの話題も載っているので、本格的に使う際には非常に参考になりそう。
- 作者: 結城洋志,沖元謙治,足永拓郎,林健太郎,大竹智也,内田誠悟,伊藤直也,中山裕司,hiroki.o,泉水翔吾,佐藤太一,高橋俊幸,西尾泰和,舘野祐一,中島聡,橋本翔,はまちや2,竹原,麻植泰輔,WEB+DB PRESS編集部
- 出版社/メーカー: 技術評論社
- 発売日: 2015/04/23
- メディア: 大型本
- この商品を含むブログを見る