今回は、Docker composeを用いたコンテナ操作を紹介します。
Docker Composeとは
Docker Composeとは、複数のDockerコンテナを同時に立ち上げるためのツールです。
以前Dockerfileから単一コンテナを起動する方法を紹介しましたが、実用面を考えると、複数コンテナを組み合わせた利用が多いのではないでしょうか。
Docker Composeでは、複数コンテナの起動をYAMLファイルに定義し、コマンド1つでまとめて起動することができます。
Docker Compose実践
では、Docker Composeを実践してみましょう。Docker Composeは、Dockerをインストールした際に一緒にインストールされているはずです。docker composeを実行してhelpが表示されることを確認してください。
docker compose
>>
Usage: docker compose [OPTIONS] COMMAND
Define and run multi-container applications with Docker
Options:
--all-resources Include all resources, even those not
used by services
....
今回は、Nginx+MySQLで簡易Webサーバーを構築してみます。
必要ファイルの準備
今回は、以下ファイル構成を準備します。
docker-compose.ymlには起動するコンテナを定義します。
demo-compose/
├── docker-compose.yml
├── nginx/
│ └── index.html
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./nginx:/usr/share/nginx/html:ro
depends_on:
- db
networks:
- demo-net
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: demo_db
MYSQL_USER: demo_user
MYSQL_PASSWORD: demopass
ports:
- "3306:3306"
networks:
- demo-net
networks:
demo-net:
driver: bridge
各コンテナの定義はserviceで定義します。今回はweb(nginx)とdb(mysql)を定義しています。両者は通信できることが前提になるので、demo-netというネットワークを定義し、両コンテナをブリッジしています。
今回は、Docker Hubで公開されているイメージを利用します。
<!DOCTYPE html>
<html>
<head>
<title>Docker Compose Demo</title>
</head>
<body>
<h1>Hello, Docker Compose with Nginx and MySQL!</h1>
</body>
</html>
起動
Docker Composeの起動は、docker-compose.ymlのディレクトリで以下コマンドを実行します。
docker compose up -d
作成されたイメージを確認してみます。
docker images
>>
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 8.0 bfeba808a667 11 days ago 1.07GB
nginx latest 84ec966e61a8 2 weeks ago 279MB
作成されたコンテナを確認してみます。
docker ps -a
>>
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
eba54eeefc46 nginx:latest "/docker-entrypoint.…" 16 hours ago Up 10 seconds 0.0.0.0:8080->80/tcp docker_compose-web-1
670d149771c8 mysql:8.0 "docker-entrypoint.s…" 16 hours ago Up 10 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp docker_compose-db-1
Dockerイメージ及びコンテナが作成され、起動していることが確認できました。
http://localhost:8080にアクセスすると、index.htmlの内容が表示されます。

このように、複数のコンテナ起動をコマンド1つで実行できるのがDocker Composeのメリットです。
Docker Composeを使わない場合
上記の処理は、Docker Composeを使わずとも再現可能です。その場合のコマンドをご紹介します。
まず、ネットワークを作成します。
docker network create demo-net
続いて、MySQLコンテナを起動します。
docker run -d --name demo-mysql --network demo-net -e MYSQL_ROOT_PASSWORD=rootpass -e MYSQL_DATABASE=demo_db -e MYSQL_USER=demo_user -e MYSQL_PASSWORD=demopass -p 3306:3306 mysql:8.0
最後にNginxコンテナを起動します。
docker run -d --name demo-nginx --network demo-net -p 8080:80 -v "$(pwd)/nginx:/usr/share/nginx/html:ro" nginx:latest
このように、3つのコマンドが必要になるほか、コマンド内に環境変数等の定義が必要となり、複雑なコマンドになりがちです。
環境変数等もdocker-compose.ymlに定義でき、コマンド自体を簡素化できる点もDocker Composeの利点といえるでしょう。
まとめ
Docker Composeのメリットと、簡単な使い方を紹介しました。
複数コンテナを扱う際は必須となる場合が多いので、是非活用してください。