56
41

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

雰囲気でコンテナを立ち上げないために。あらためて学ぶDocker Composeの基礎

Last updated at Posted at 2020-09-25

はじめに:qiitan:

この記事は、Docker-compose.ymlを書いたり、docker-composeコマンドを使ってアプリケーションを開発したり運用したことがあるが、

——全然わからない、俺は雰囲気で複数コンテナを立ち上げているーー

という方(主に自分)に向けて、あらためてDocker Composeがどういうものかを、簡単に説明した記事です。

この記事のゴール🏁

  • なぜ複数コンテナの管理ツールが必要になるのかを把握する
  • 複数コンテナ実行管理ツールであるDocker Composeの基礎を理解する

複数コンテナ管理の基礎を学ぶ🐳

1. なぜ複数コンテナの管理ツールが必要になるのか

1.1. 複数コンテナを運用するパターン

現在の一般的な構成である三層アーキテクチャのWebアプリケーションをDockerを使って開発・運用することを例として挙げます。

Screenshot 2020-09-13 18.30.25.png

プロセスとしては、Webアプリケーションデータベースの3つのプロセスが考えられます。これを1コンテナで実現するのは、(できるにはできるみたいですが)あまり良い構成とは言えません。
スケール・管理がしにくく、プロセスが一つでも落ちるとコンテナが落ちてしまうなど、リスクが高いためです。

Screenshot 2020-09-13 19.17.30.png

なので、現在は1コンテナ=1プロセスとして、それぞれの役割ごとにコンテナを立てるのが一般的になっています。必要に応じてコンテナを追加したり差し替えができるため、スケールや変更が容易になります。
Screenshot 2020-09-13 19.23.56.png

1.2. 管理ツールを使わずに複数コンテナを動かすと...?

ここで、コンテナの起動・管理方法について考えます。1コンテナ=1プロセスなのですから、例えば今回の環境を立ち上げる際には、計3回docker build & docker runをすることになります。これは、環境の構成コンテナが増えるごとにコマンドを打つ回数が増えていくことを意味します。また、ポートマッピングの設定など、それぞれのコンテナを起動する際にオプションでいちいち指定しなければなりません。シェルスクリプト化するにしても、コンテナの立ち上げ順序等もあるため、環境の管理は面倒でしょう。

例えばのイメージ
$ docker run --name mysql #この後にvolumesなどのいろいろなオプションがつく
$ docker run --name nginx
$ docker run --name rails
$ #...コンテナの数だけ回数は増える

こうなると、環境を構築するのが面倒になりますし、手動でそれぞれのコンテナを運用することになります。単純に管理・維持が大変になり、"環境構築の手軽さ"というDockerの特徴を潰すことになります。

2. Docker Compose とは🐙

image.png
ここで、Docker Composeの登場です。
Docker Compose とは、複数コンテナで構成されるプロジェクトの起動・停止などの手順を、yamlファイルに定義した設定内容に基づいて自動的にしてくれるツールです。

docker-compose.yml(適当に作った例)
version: '3'
services:
  db:
    image: postgres:alpine
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    networks:
      - sampleapp

  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - ./web/app/
    ports:
      - '8080:8080'
    depends_on:
      - db
    networks:
      - sampleapp

networks:
  sampleapp:
    external: true

各プロセスのDockerfileを用意した上で、上記のようにdocker-compose.ymlにプロジェクトの設定内容を記述しておき、

$ docker-compose up

とすると、簡単に環境を立ち上げることができます。

2.1. docker-compose.yml で定義する内容

さて、docker-compose.ymlでは、どのようなことが設定できるのでしょうか?
Compose ファイル・リファレンスによると、

Compose ファイルは YAML ファイルであり、 サービス(services) 、 ネットワーク(networks) 、 ボリューム(volumes) を定義します。

とあります。
うーん、なんとなく今まで雰囲気でdocker-compose.ymlに書いてきたから、よくわかっていない...(心の声)
ということで、それぞれについてあらためて確認していきたいと思います。

2.1.1. services

Screenshot 2020-09-17 19.39.36.png

servicesには、プロジェクトを構成する各コンテナの情報を定義します。ここには、各コンテナのdocker run時に指定していたオプションを記述することができます。ポートマッピングの設定や、後述するvolumesやnetworksの設定などもここに記述することで、docker-compose upでのコンテナ一括起動時に反映してくれるようになります。

2.1.2. volumes

Screenshot 2020-09-24 17.44.49.png

続いて、volumesに記述する内容です。
起動したコンテナで扱うデータは、コンテナが削除されると一緒に消えてしまいます。また、コンテナを複数起動した際、そのままではお互いのファイルシステムを直接参照できません。

ですが、コンテナには**ボリューム(volume)**と呼ばれる、ディレクトリやファイルをマウントできる領域があり(実体はホスト上に自動生成されるディレクトリ /var/lib/docker/volumes)、異なるコンテナでも、dockerコマンドのオプションで同じvolumeを指定することで、データの共有が可能になります。

Docker Compose では、その設定も各コンテナ起動時にいちいちオプションをつける代わりに、docker-compose.ymlvolumesに定義することで、docker-compose upでのコンテナ一括起動時に反映してくれるようになります。

2.1.3. networks

Screenshot 2020-09-24 17.45.29.png

最後にnetworksに定義する内容についてです。
今回の例では、アプリケーションを構成するWeb・アプリケーション・DBの各コンテナを通信させる必要がありました。
ここで、Dockerには、3つの標準ネットワークモデルがあり、設定によってホスト側のネットワークに直接接続したり、コンテナ間を通信させることができます(わかりやすい参考記事)。

特に何も設定せずにコンテナを複数起動させている場合、各コンテナはIPアドレスを指定して通信することは可能ですが、コンテナ名を指定して通信することはできません。コンテナ名で通信させるにはユーザー独自のDockerネットワークを設定する必要があります。

その設定も、本来ならdocker networkコマンドでいちいち指定する必要がありますが、Docker Composeではdocker-compose.ymlnetworksに定義することで、docker-compose upでのコンテナ一括起動時に反映してくれるようになります。

まとめ:stock:

  • 管理ツールを使わずに、複数コンテナ構成プロジェクトを運用しようとすると、各コンテナ実行時にいちいちコマンドを走らせる&オプションで設定する必要があるため、環境構築や環境の維持・再現が大変

  • Docker Composeを使うと、docker-compose.ymlに各コンテナの情報をまとめて定義しておくことができ、1コマンドで環境が構築できる

  • Docker Composeによる管理は、特にnetworkvolumeが複雑な場合に真価を発揮する

引用・参考記事

56
41
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
56
41

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?