今回はDocker composeについて解説します。docker composeコマンドを実行すれば簡単にコンテナや必要なリソースをセットアップできます。環境構築の負担を大幅に軽減できるので、ぜひ利用しましょう。
本記事の内容を実際に試してみたい場合はDockerのインストール後に実施しましょう。
【Macユーザー向け】homebrewでのDockerインストール方法
復習的な内容も兼ねているDockerネットワークとDockerボリュームについては別記事で解説しているので、併せてご覧ください。
Dockerボリュームとは?コンテナのデータを永続的に保存できる仕組みを解説!
【初心者必見】Dockerのネットワークとは?デフォルトの3種類とユースケースを解説
Docker Composeとは?
Docker Composeは、複数のDockerコンテナを簡単に管理できるツールです。
これまでに解説してきた方法の場合、Dockerを使ってアプリケーションを動かすには、各コンテナを個別に起動し、設定を手動で行う必要がありました。
しかし、1つ1つのコンテナを起動し、設定するのは案外面倒なものです。そこでDocker Composeを使うと、単一のコマンドで複数のコンテナをまとめて起動・管理できます。
具体的にはYAML形式の設定ファイル(compose.yaml)にコンテナの構成を記述し、docker composeコマンドを実行することで、記述したコンテナやネットワークの構築が実現します。
Docker ComposeでNginxをセットアップする手順
本記事はMacにDocker Composeをインストールするための手順を記載しています。
Docker composeのインストール
当記事執筆時の最新バージョンはv2.32.4でした。https://github.com/docker/compose/releasesを確認して、最新バージョンかお好きなバージョンをインストールしてください。
| 
					 1 2 3 4 5 6 7 8  | 
						VERSION="v2.32.4" #好きなバージョンを指定 sudo mkdir -p /usr/local/lib/docker/cli-plugins sudo curl -SL https://github.com/docker/compose/releases/download/${VERSION}/docker-compose-darwin-aarch64 -o /usr/local/lib/docker/cli-plugins/docker-compose sudo chmod a+x /usr/local/lib/docker/cli-plugins/docker-compose docker compose version Docker Compose version v2.32.4  | 
					
docker compose versionコマンドを実行し、指定したバージョンが表示されればインストール完了です。
Docker Composeファイルの作成例
以下のcompose.yamlを作成しましょう。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17  | 
						networks:   my_network: # Dockerネットワーク     driver: bridge volumes:   my_volume: # Dockerボリューム services:   nginx:     image: nginx:latest     ports:       - "8080:80"     networks:       - my_network     volumes:       - my_volume:/usr/share/nginx/html # /usr/share/nginx/html にマウント       - ./index.html:/usr/share/nginx/html/index.html # ホストのindex.htmlを配置  | 
					
なお今回、nginxでwebサーバのコンテナを構築しますが、その際に自身で用意したhtmlファイルを公開してみましょう。
| 
					 1 2 3 4 5 6 7 8 9 10  | 
						<!DOCTYPE html> <html lang="ja"> <head>     <meta charset="UTF-8">     <title>Docker Compose Test</title> </head> <body>     <h1>This page is created by docker compose</h1> </body> </html>  | 
					
docker compose実行
上記のcompose.yamlとindex.htmlを同じディレクトリに配置してdocker composeを実行してみましょう。
| 
					 1  | 
						$ docker compose up<br>[+] Running 3/3<br> ✔ Network docker_my_network  Created                                               0.1s <br>...<br>nginx-1  | 2025/02/06 15:09:27 [notice] 1#1: start worker process 30<br>nginx-1  | 172.21.0.1 - - [06/Feb/2025:15:09:56 +0000] "GET /index.html HTTP/1.1" 200 190 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" "-"  | 
					
これでnginxコンテナが起動します。
作成したコンテナの確認
まずはターミナルで新しいタブを開き、dockerコマンドでコンテナやネットワークの様子を確認しましょう。
| 
					 1 2 3 4 5 6  | 
						$ docker ps CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS         PORTS                                     NAMES 5f86ba16576d   nginx:latest   "/docker-entrypoint.…"   5 minutes ago   Up 5 minutes   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   docker-nginx-1 $ docker network ls --format json | grep compose {"CreatedAt":"2025-02-07 00:09:26.874963622 +0900 JST","Driver":"bridge","ID":"f62bb2ff16fe","IPv6":"false","Internal":"false","Labels":"com.docker.compose.config-hash=f711e08f95faa0d1d64f49a3c2e3b0ef10e318a1a71f703efb701f36f4eda788,com.docker.compose.network=my_network,com.docker.compose.project=docker,com.docker.compose.version=2.32.4","Name":"docker_my_network","Scope":"local"}  | 
					
作成したコンテナやdocker networkの情報が表示されています。それぞれ名前はdockerとついていますね。
次にhtmlを確認してみましょう。
| 
					 1 2 3 4 5 6 7 8 9 10 11  | 
						$ curl localhost:8080 <!DOCTYPE html> <html lang="ja"> <head>     <meta charset="UTF-8">     <title>Docker Compose Test</title> </head> <body>     <h1>This page is created by docker compose</h1> </body> </html>  | 
					
 作成したindex.htmlの内容が返ってきていますね。ブラウザでlocalhost:8080/index.htmlとアクセスすると大きい文字で「This page is created by docker compose」と記載されています。
削除と確認
今回docker compose upコマンドで作成したコンテナやネットワークをまとめて削除しましょう。削除するにはdocker compose downコマンドです。
| 
					 1 2 3 4 5 6 7 8 9  | 
						$ docker compose down ...  ✔ Container docker-nginx-1   Removed                                                                                     0.0s   ✔ Network docker_my_network  Removed        $ docker ps CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES $ docker network ls | grep my_network  | 
					
コンテナやdocker networkが削除されました。
上記を全てコマンド実行する場合
今回docker composeを使用して各リソースの作成、削除を行いました。これらを一つ一つコマンドで実行する場合はどうなるか見てみましょう。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14  | 
						$ docker network create my_network $ docker volume create my_volume $ docker run -d \   --name nginx \   --network my_network \   -p 8080:80 \   -v my_volume:/usr/share/nginx/html \   -v "$(pwd)/index.html:/usr/share/nginx/html/index.html" \   nginx:latest # 削除 $ docker stop nginx && docker rm nginx $ docker volume rm my_volume $ docker network rm my_network  | 
					
いかがでしょうか。作成、削除それぞれ数回コマンド実行が必要ですし、docker runはオプションもたくさん必要です。作業ミスを減らすことや、繰り返し実行することを考え、docker composeを積極的に活用していきましょう。
Docker Composeで使えるディレクティブ
compose.yamlには他にも様々なディレクティブを使用できます。今回利用したものも含めて確認してみましょう。
| ディレクティブ | 内容 | 書き方の例 | 
|---|---|---|
| services | コンテナサービスの定義 | services: | 
| volumes | 共有ボリュームの定義 | volumes: | 
| networks | ネットワークの定義 | networks: | 
| image | 使用するDockerイメージ | image: nginx:latest | 
| 以下はservices内 | ||
| build | Dockerfile のあるディレクトリを指定 | build: ./app | 
| container_name | コンテナ名の指定 | container_name: my_nginx | 
| command | 実行するコマンドを指定 | command: ["nginx", "-g", "daemon off;"] | 
| entrypoint | ENTRYPOINT を上書き | entrypoint: /start.sh | 
| ports | ホストとコンテナのポートマッピング | ports:- "8080:80" | 
| expose | コンテナ内部で公開するポート | expose:- "3306" | 
| environment | 環境変数を設定 | environment: - MYSQL_ROOT_PASSWORD=root | 
| env_file | .env ファイルを読み込む | env_file: .env | 
| networks | コンテナをネットワークに接続 | networks:- my_network | 
| volumes | ボリュームをマウント | volumes:- my_data:/var/lib/mysql |