docker-composeとは
docker-composeは、Docker(Docker Engine)とは別のソフトウェアで、Dockerアプリケーションをもっと使いやすくするためのツール。
通常は、Dockerでサービスを立ち上げるために、Dockerfileでイメージを作成した後、コマンドでネットワークやボリュームの設定を行う。しかし、複数のコンテナを立ち上げる必要がある時には正直面倒。。
そこで、複数のコンテナの立ち上げを簡単にしたのがdocker-composeで、YAMLファイルの設定に基づいて、サービスの作成・起動を行なってくれる。
ちなみに・・・
DockerfileはDockerイメージを作るためのファイルです。
docker-compose.yamlの解説
コメントにざっと説明書いてます。
version: "3" # Compose ファイルフォーマットのバージョン指定
services:
mongo:
image: mongo:5.0 # 使用するイメージを指定。Dockerfileで作成したイメージを指定する場合は書き方が異なるので注意。
restart: always # コンテナが停止したときにリスタートするか
ports:
- "27017:27017"
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: password
volumes:
- mongodata:/var/lib/mongo
app:
image: node:16 # 使用するイメージ指定。イメージ検索:https://hub.docker.com/search?type=image
env_file: .env # envファイルのパス
environment:
- NODE_ENV=production
ports:
- "8080:80" # コンテナ内のTCPポート80を、Dockerホストのポート8080にマッピング
volumes:
- ./src:/app
working_dir: /app # コンテナ内での実行ディレクトリ
command: "yarn dev"
depends_on: # 依存するコンテナ。コンテナの起動順を制御できる。mongo→appの順に起動される。
- mongo
volumes:
mongodata # 名前付きボリューム
その他補足
ports
ポートやポート同士のマッピングを設定できる。
“8080:80″の場合、コンテナ内のTCPポート80を、Dockerホストのポート8080にマッピングすることを意味する。
その他、UDP接続したい場合や、IPアドレスを指定したい場合は、ここに指定例が載っている
networks
そのコンテナを接続するネットワークを指定する。
デフォルトでは、dockerインストール時に自動作成されるbridgeネットワークに接続される。
volumes
ボリュームとは、そのコンテナがマウントできるストレージ。データの保存などができる。
オプションでホスト上のパス指定や、アクセス権限などを設定できる(設定詳細)。
複数のサービスに同じボリュームを再利用する場合は、最上位のvolumesキーにおいて名前つきボリュームを定義する必要がある。また、複数のサービスで共有しない場合でも、名前付きボリュームを使用する際は、トップレベルのvolumesで定義する必要がある。
dockerにおけるマウントとは
あるストレージに接続して書き込み可能にした状態のこと。
作成と破棄が繰り返されるコンテナでも、外部にデータを保存し再利用ができる。
ちなみに、実際にNode.jsとMongoDB, Mongo Expressを使ったdocker-composeファイルは下記記事で公開してます。