初心者のためのdocker-compose.yml解説
こんにちは!今回は、Dockerを使う上で欠かせないツールである Docker Compose と、その設定ファイル docker-compose.yml
について解説します。初心者の方にも分かりやすいよう、基本から丁寧に説明していきますので、ぜひ最後までお付き合いください。
Contents
Docker Composeとは?
Docker Composeは、複数のDockerコンテナを定義し実行するためのツールです。
単一の設定ファイル(通常はdocker-compose.yml
)を使用して、アプリケーションの全てのサービスを設定できます。
docker-compose.ymlの基本構造
docker-compose.yml
ファイルは、YAML形式で書かれています。基本的な構造は以下のとおりです:
version: "3" # Docker Composeのバージョン、使用するDocker Composeの機能セットを決定します。
services: # アプリケーションのサービス(コンテナ)定義
service1: # サービス1の名前
# サービス1の設定
service2: # サービス2の名前
# サービス2の設定
volumes: # 使用するボリュームの定義(オプション)
networks: # 使用するネットワークの定義(オプション)
YAML形式
YAML(YAML Ain’t Markup Language)は、人間にとって読み書きしやすいデータシリアライゼーション形式です。設定ファイルやデータ交換によく使用されます。
インデント
YAMLはインデントを使用して構造を表現します。通常、2スペースまたは4スペースが使用されます。
parent:
child1: value1
child2: value2
grandchild: value3
リスト(配列)
リストは、ハイフン(-)とスペースで始まる行で表現します。
fruits:
- apple
- banana
- cherry
services
アプリケーションを構成する各サービス(コンテナ)を定義します。
services: service1:
# サービス1の設定
service2:
# サービス2の設定
- 一般的な設定項目:
image
: 使用するDockerイメージbuild
: カスタムDockerイメージをビルドする際の設定ports
: ポートマッピングvolumes
: ボリュームマウントenvironment
: 環境変数の設定depends_on
: サービス間の依存関係command
: コンテナ起動時に実行するコマンド
volumes
volumesは、Docker Composeでデータストレージを管理
- コンテナ間でのデータ共有
- ホストマシンとコンテナ間でのデータ共有
匿名ボリューム
サービス定義内で volumes
を指定しているが、トップレベルで定義していない場合、Docker Composeは匿名ボリュームを作成します
※バインドマウントでホスト上の特定のパスをマウントする場合トップレベルのvolumesの定義は不要です
トップレベルの volumes
定義が不要な理由
バインドマウントは、あなたのコンピュータ上の既存のフォルダを使うだけなので、Docker Compose側で特別な設定や準備は必要ありません。そのため、トップレベルの volumes
セクションでの定義は不要です。
バインドマウントとは
バインドマウントは、あなたのコンピュータ(ホスト)上のフォルダやファイルを、Dockerコンテナの中で使えるようにする方法です。簡単に言えば、「コンピュータとコンテナの間でフォルダを共有する」ということです。
なぜバインドマウントを使うの?
- 開発中のコードをすぐにテストできる: コードを変更したら、コンテナを再起動せずにすぐに反映されます。
- 設定ファイルを簡単に変更できる: コンテナの外から設定を変更できるので、便利です。
バインドマウントをどうやって使うの?
Docker Composeファイル(docker-compose.yml)で、以下のように指定します:
services:
myapp:
image: node:14
volumes:
- ./my-app:/app
portsセクションとは?
ports
セクションは、Docker コンテナ内で動作しているアプリケーションを、ホストマシン(あなたのコンピュータや、クラウド上のサーバー)から接続できるようにするための設定です。
ports:
- "ホストのポート:コンテナのポート"
例)
ports:
- "0.0.0.0:80:80" # ホストのすべてのネットワークインターフェースの80番ポートへのアクセスを、コンテナの80番ポートにリダイレクトする
- "443:443" # ホストの443番ポートへのアクセスを、コンテナの443番ポートにリダイレクトする
0.0.0.0
: ホストのすべてのネットワークインターフェースでリッスンすることを明示的に(省略可)意味します。
build
セクション
例)
▼docker-compose.ymlのbuildセクション
build:
context: . # ドット (.) は現在のディレクトリ→Docker Composeファイルが存在するディレクトリをビルドコンテキストとして指定
dockerfile: Dockerfile # 使用するDockerfileの名前とパスを指定
ビルドコンテキストとは
ビルドコンテキストは、Docker イメージをビルドする際に使用される一連のファイルやディレクトリのセットです。
Docker CLI (Command Line Interface)
Docker CLIは、ユーザーがコマンドラインからDockerを操作するためのツールです。
例:
docker run
: コンテナを作成して起動docker build
: Dockerfileからイメージをビルドdocker ps
: 実行中のコンテナを表示
docker-compose up
コマンドは、特に初心者にとってとても便利
docker-compose up
は、複数のDockerコンテナを一度に簡単に起動できます
例
(1)Webサーバー(例:Node.js) (2)データベース(例:MySQL) (3)キャッシュサーバー(例:Redis)が必要な場合
docker-compose upコマンドを使わないと下記のコマンドを毎回入力しないといけません
docker run -d --name webserver -p 3000:3000 my-node-app
docker run -d --name database -e MYSQL_ROOT_PASSWORD=secret mysql
docker run -d --name cache redis
↓
下記docker-compose.ymlを作成し「docker-compose up」コマンドを実行するだけ
version: '3'
services:
webserver:
image: my-node-app
ports:
- "3000:3000"
database:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: secret
cache:
image: redis