前回の記事では、Docker のネットワークを使って通信しながら、複数のコンテナを協働させた。
基本的には前回の記事のやり方でいいんだけど、サービスの数が増えたり、規模が大きくなってコンテナの数が増えたりすると、コンテナごとにコマンドを打って起動するのは面倒だ。コンテナによって指定するオプションも異なるので、それも覚えておく必要がある。
というわけで、そういう煩雑な部分を楽にしてくれるツールがある。それが Docker Compose だ。メインマシンである apostrophe をセットアップしたときに apt でインストールしておいた。
akatoh@apostrophe:docker$ docker-compose --version docker-compose version 1.25.0, build unknown
題材と構成
前回記事と同じ、書籍管理 web アプリと HTTP サーバ(Nginx)という構成にする。詳しくは前回記事を参照。
ビルド済みのイメージを利用する
前回ビルドした Docker イメージが残っているので、まずはそれを使ってコンテナを起動する設定を書いてみる。
Docker Compose は docker-compose.yml という名前のファイルを読み込んで、その設定どおりにコンテナを起動してくれる。今回書いた docker-compose.yml ファイルは次の通り。
version: '3' services: bruschetta-back: image: bruschetta:1 container_name: bruschetta-back restart: always nginx-front: image: nginx-c:1 container_name: nginx-front restart: always ports: - 8080:80
service: の下に連なっているのが、Docker Compose で起動するコンテナだ。各設定項目は見ればだいたいわかるだろうからここでは説明は省略。ただ、docker
コマンドで起動するときとは次の点が違う。
- Docker ネットワークは自動で作ってくれるので設定不要
- コンテナ間通信は、コンテナ名ではなく service 名で行われる
特に2つ目の挙動は docker
コマンドで起動したときと違うので注意が必要だ。最初、ここでハマった。
で、これを起動するには次のようにする。
takatoh@apostrophe:docker$ docker-compose up -d
起動中のコンテナの確認。
takatoh@apostrophe:docker$ docker-compose ps
そして停止。
takatoh@apostrophe:docker$ docker-compose stop
最後にコンテナの削除。
takatoh@apostrophe:docker$ docker-compose rm
Dockerイメージをビルドして利用する
さて、今度は Docker イメージをビルドするところからやってみる。そのためには、docker-compose.yml ファイルと同じディレクトリに、イメージ作成用のファイル一式を収めたディレクトリを置いておく。こんな感じ。
akatoh@apostrophe:docker$ ls -l 合計 12 drwxrwxr-x 3 takatoh takatoh 4096 5月 9 03:15 bruschetta -rw-rw-r-- 1 takatoh takatoh 239 6月 14 13:26 docker-compose.yml drwxrwxr-x 3 takatoh takatoh 4096 5月 14 06:19 nginx-c
そして、docker-compose.yml ファイルを次のように書き変える。
version: '3' services: bruschetta-back: build: ./bruschetta image: bruschetta:1 container_name: bruschetta-back restart: always nginx-front: build: ./nginx-c image: nginx-c:1 container_name: nginx-front restart: always ports: - 8080:80
書き変えた、というか書き足したのは、build:
の行だ。この行でイメージをビルドするための Dockerfile (とその他に必要なフィアル)を置いてあるディレクトリを指定している。
ビルドするには次のようにする。
takatoh@apostrophe:docker$ docker-compose build
イメージができたか、確認。
takatoh@apostrophe:docker$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE nginx-c 1 c8b3966bbc31 54 seconds ago 127MB bruschetta 1 7d6607e796c2 About a minute ago 468MB nginx 1.17.10 9beeba249f3e 4 weeks ago 127MB ubuntu 20.04 1d622ef86b13 7 weeks ago 73.9MB
nginx-c:1 と bruschetta:1 がビルドされたイメージ。下の2つは元になったイメージ(Docker Hub から取ってきたもの)だ。
じゃあ、これを起動してみよう。
takatoh@apostrophe:docker$ docker-compose up -d
OK。ブラウザからアクセスしてみて、期待通りに動いているのを確認できた。