初心者のためのdocker-compose.yml解説

こんにちは!今回は、Dockerを使う上で欠かせないツールである Docker Compose と、その設定ファイル docker-compose.yml について解説します。初心者の方にも分かりやすいよう、基本から丁寧に説明していきますので、ぜひ最後までお付き合いください。

Docker Composeとは?

Docker Composeは、複数のDockerコンテナを定義し実行するためのツールです。

単一の設定ファイル(通常はdocker-compose.yml)を使用して、アプリケーションの全てのサービスを設定できます。

Docker Compose概念図 docker-compose.yml version: “3.4” services: app: build: … volumes: … ports: … Docker Containers Web App Container Database Container defines

docker-compose.ymlの基本構造

docker-compose.ymlファイルは、YAML形式で書かれています。基本的な構造は以下のとおりです:

version: "3"  # Docker Composeのバージョン、使用するDocker Composeの機能セットを決定します。
services:     # アプリケーションのサービス(コンテナ)定義
  service1:   # サービス1の名前
    # サービス1の設定
  service2:   # サービス2の名前
    # サービス2の設定
volumes:      # 使用するボリュームの定義(オプション)
networks:     # 使用するネットワークの定義(オプション)
docker-compose.yml構造 version: “3” Docker Composeファイルのバージョン services: アプリケーションのサービス(コンテナ)定義 service1: # サービス1の設定 service2: # サービス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.yml version: ‘3’ services: myapp: image: myapp:latest volumes: – mydata:/app/data volumes: mydata: driver: local driver_opts: type: none 参照

匿名ボリューム

サービス定義内で volumes を指定しているが、トップレベルで定義していない場合、Docker Composeは匿名ボリュームを作成します

Docker Compose Volumes定義の比較 トップレベルで定義あり services: myapp: volumes: – mydata:/app/data volumes: mydata: driver: local トップレベルで定義なし services: myapp: volumes: – /app/data (暗黙的に作成される) – 匿名ボリューム – デフォルト設定使用 – 管理が難しい

※バインドマウントでホスト上の特定のパスをマウントする場合トップレベルのvolumesの定義は不要です

トップレベルの volumes 定義が不要な理由

バインドマウントは、あなたのコンピュータ上の既存のフォルダを使うだけなので、Docker Compose側で特別な設定や準備は必要ありません。そのため、トップレベルの volumes セクションでの定義は不要です。

バインドマウントとは

バインドマウントは、あなたのコンピュータ(ホスト)上のフォルダやファイルを、Dockerコンテナの中で使えるようにする方法です。簡単に言えば、「コンピュータとコンテナの間でフォルダを共有する」ということです。

バインドマウントの仕組み ホスト(あなたのコンピュータ) Dockerコンテナ 共有フォルダ ./my-app マウントされたフォルダ /app 同期

なぜバインドマウントを使うの?

  1. 開発中のコードをすぐにテストできる: コードを変更したら、コンテナを再起動せずにすぐに反映されます。
  2. 設定ファイルを簡単に変更できる: コンテナの外から設定を変更できるので、便利です。

バインドマウントをどうやって使うの?

Docker Composeファイル(docker-compose.yml)で、以下のように指定します:

services:
  myapp:
    image: node:14
    volumes:
      - ./my-app:/app

portsセクションとは?

ports セクションは、Docker コンテナ内で動作しているアプリケーションを、ホストマシン(あなたのコンピュータや、クラウド上のサーバー)から接続できるようにするための設定です。

ports:
  - "ホストのポート:コンテナのポート"
Docker Composeのポートマッピング ホスト Dockerコンテナ ポート 80 ポート 443 ポート 80 ポート 443 HTTP (80) HTTPS (443)

例)

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 イメージをビルドする際に使用される一連のファイルやディレクトリのセットです。

ビルドコンテキスト my_project/ docker-compose.yml Dockerfile src/ app.py utils.py config/ settings.ini data/ database.db ビルドコンテキスト Docker デーモン 転送
Dockerデーモンの役割と相互作用 Dockerデーモン コンテナ管理 イメージ管理 ネットワーキング Docker CLI Docker Compose コンテナ イメージ ボリューム ネットワーク

Docker CLI (Command Line Interface)

Docker CLIは、ユーザーがコマンドラインからDockerを操作するためのツールです。

例:

  • docker run: コンテナを作成して起動
  • docker build: Dockerfileからイメージをビルド
  • docker ps: 実行中のコンテナを表示
Docker CLI、Compose、デーモンの相互作用 ユーザー Docker CLI Docker Compose Dockerデーモン コンテナ管理 イメージ管理 コンテナ イメージ docker run docker-compose up

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