【Docker】複数コンテナを同時に管理するdocker-composeの使い方

web開発は、複数のサーバー(コンテナ)を連携して、サービス開発を行います。

例えば、webサーバーやDBサーバー、キャッシュサーバー、loggingサーバーなど複数のサーバーを連携して、一つのアプリケーションを作成していきます。

docker-composeを使用すれば、それらの複数のサーバー(コンテナ)を同時に立ち上げて開発することが可能になります!

DBと連携したdocker-composeの作成

docker-compose.ymlというファイルに上記の記述をして、そのファイルが有るディレクトリで、docker-compose upコマンドを実行しましょう。

そうすると、

  • ubuntuイメージを元にしたコンテナ
  • redisイメージを元にしたコンテナ

の2つが立ち上がったことが以下のコマンドで確認できます。

このように、docker composeを使用すれば、複数のコンテナを同時立ち上げて、それぞれの依存関係を定義することができます。

docker-compose.ymlの解説

services

一番上の階層のservicesというのは立ち上げるコンテナを定義します。

今回の例でいうと、ひとつ下のインデントである、

  • app
  • redis

の2つのコンテナが対象になります。

image

imageはコンテナの元になるimageを指定します。

今回は、ubuntuイメージとredisイメージを元に2つのコンテナを作成しました。

また、Dockerfileを指定することでDockerfileから作成されたimageを元にコンテナを作成することも可能です。

build【imageにDockerfileを指定する場合】

imageとしてDockerfileを指定する場合は、buildを使用します。

上記の記述によって、【/dir/Dockerfile-name】という名前のDockerfileを元にコンテナを作成することができます。

command

コンテナが立ち上がった後に実行されるコマンドを指定します。

Dockerfileを元にコンテナを起動した場合、DockerfileのCMDは上書きされます。

tty: true

上記の、【-it】のことです。

depends_on

コンテナ間の依存関係を定義するときに使用します。

今回の例でいうと、appコンテナがredisコンテナに依存していることを表しています。

一点だけ注意しなければいけないことは、depende_onはコンテナの開始の順序を制御するのみで、依存しているコンテナが実行可能になるまで待つことはしません。

その他のよく使う記述

networks

Dockerはコンテナ同士で通信する際に同一のnetworksに接続している必要があります。

上記の記述をすることで、webコンテナとapiコンテナを同一ネットワークに接続させた状態でDockerコンテナを立ち上げることができます。

environment

上記のよう記述すると、mysqlコンテナのTZをAsia/Tokyoに設定した状態で、Mysqlコンテナを立ち上げることができます。

このように、environmentを使用すると、環境変数の指定ができます。

また、env_fileを使用すると、ファイルパスを指定して、ファイルに環境変数を指定することも可能です。

ports

portsを指定することで、ホストマシンのポートとコンテナのポートを指定して、Dockerコンテナを起動することが可能です。

上記のdocker-compose.ymlは以下のコマンドを実行したときと同じように、ホストマシンの8080ポートをnginxコンテナの80ポートを接続しています。

volumes

上記のdocker-compose.ymlを実行すると、

  • mysqlコンテナでmysqlvolumeをコンテナ内の/var/lib/mysqlとバインド
  • appコンテナで、./src配下のファイルを/usr/share/nginx/htmlとバインド

することができます。

また、volumes:の欄で、volumeを作成してコンテナが停止・削除されてもmysql内のデータを永続化されるようにしています。

実運用で覚えていくべき!

開発環境はwebサービスによって多種多様です。

そのため、各webサービスの仮想環境を作成するdocker-compose.ymlも多種多様なものになっています。

実運用で実際に使われているdocker-compose.ymlファイルをみることで、理解が深まるでしょう!

※幸いにもgithubを探れば、たくさんのプロジェクトのdocker-compose.ymlをみることができます!

ABOUTこの記事をかいた人

新卒でノマドワーカー(webデザイナー)として独立し、半年で月収100万円を達成する。その後、事務所を売却(バイアウト)したり、Youtuber(最高月間視聴回数109万回、チャンネル登録者1万人)をしたり、Openrecの公式配信者としてゲーム生実況をしたり、ベンチャー企業のCOOをしたり、パラレルキャリアを歩んできました。 2019年にミニマムライフコストを不労所得で稼げるようになったため、いまは、お金のことを考えずに、様々な企業でエンジニア修行をさせていただきながら、複数のメディアやアプリとweb制作事務所を運営しています。 趣味は株式投資(米国・日本株メイン)で、トレードを楽しむ日も多いです!