Docker 入門 (8) - Docker Compose
以下の記事を参考に書いてます。
・Use Docker Compose | Docker Documentation
前回
1. はじめに
「Docker Compose」は、マルチコンテナアプリの定義と共有を支援するツールです。「Compose」では、YAMLファイルで「サービス」を定義し、1つのコマンドですべてを起動したり、停止したりすることができます。
2. Docker Composeのインストール
「Docker Compose」は、Windows/Mac用の「Docker Desktop/Toolbox」をインストールした人は、すでにインストール済みです。Linuxの人は、インストールする必要があります。
以下のコマンドで、インストール済みであることを確認します。
$ docker-compose version
3. Composeファイルの作成
(1) アプリプロジェクトのルートに、「docker-compose.yml」を作成。
(2) スキーマのバージョンを定義。
version: "3.7"
(3) サービス(コンテナ)のリストを定義。
version: "3.7"
services:
サービスを1つずつComposeファイルに移行していきます。
4. アプリのサービスの定義
以下は、アプリのコンテナを定義するために使っていたコマンドです。
$ docker run -dp 3000:3000 \
-w /app -v "$(pwd):/app" \
--network todo-app \
-e MYSQL_HOST=mysql \
-e MYSQL_USER=root \
-e MYSQL_PASSWORD=secret \
-e MYSQL_DB=todos \
node:12-alpine \
sh -c "yarn install && yarn run dev"
(1) サービス名(今回はapp)とベースイメージ(image)を定義。
このサービス名で、ネットワークエイリアスを自動取得できるようにします。
version: "3.7"
services:
app:
image: node:12-alpine
(2) コマンド(command)、ポート番号(ports)、ワーキングディレクトリ(working_dir)、ボリューム(volumes)、環境変数(environment)を定義。
version: "3.7"
services:
app:
image: node:12-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 3000:3000
working_dir: /app
volumes:
- ./:/app
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
5. MySQLサービスの定義
以下は、MySQLのコンテナを定義するために使っていたコマンドです。
$ docker run -d \
--network todo-app --network-alias mysql \
-v todo-mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=todos \
mysql:5.7
(1) サービス名(今回はmysql)とベースイメージ(image)を定義。
version: "3.7"
services:
app:
# The app service definition
mysql:
image: mysql:5.7
(2) ボリューム(volumes)を定義。
「docker run」で実行すると、「名前付きボリューム」が自動作成されましたが、「Compose」で実行しても自動作成されません。
version: "3.7"
services:
app:
# The app service definition
mysql:
image: mysql:5.7
volumes:
- todo-mysql-data:/var/lib/mysql
volumes:
todo-mysql-data:
(3) 環境変数(environment)を定義。
version: "3.7"
services:
app:
# The app service definition
mysql:
image: mysql:5.7
volumes:
- todo-mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todos
volumes:
todo-mysql-data:
この時点での完全な「docker-compose.yml」は、次のとおりです。
version: "3.7"
services:
app:
image: node:12-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 3000:3000
working_dir: /app
volumes:
- ./:/app
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
mysql:
image: mysql:5.7
volumes:
- todo-mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todos
volumes:
todo-mysql-data:
6. アプリケーションスタックの起動
「docker-compose.yml」できたので、アプリケーションスタックを起動します。
(1) 他のアプリとDBが実行されていないことを確認。
$ docker ps
$ docker rm -f <id>
(2) 「docker-compose up」コマンドでアプリケーションスタックを起動。
すべてをバックグラウンドで実行するために「-d」を追加します。
$ docker-compose up -d
「ボリューム」だけでなく「ネットワーク」も作成されます。デフォルトでは、「Docker Compose」はアプリケーションスタック専用のネットワークを自動作成します。
(3) 「docker-compose logs -f」コマンドでログを確認。
これは、タイミングに関連した問題を監視したい場合に非常に便利です。「f」はログを「追跡」します。特定のサービスのログを表示したい場合は、logsコマンドの最後にサービス名を追加します(例 : docker-compose logs -f app)。
mysql_1 | 2019-10-03T03:07:16.083639Z 0 [Note] mysqld: ready for connections.
mysql_1 | Version: '5.7.27' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server (GPL)
app_1 | Connected to mysql db at host mysql
app_1 | Listening on port 3000
(4) アプリを開き、実行されていることを確認。
7. Dockerダッシュボードでのアプリケーションスタックの確認
「Dockerダッシュボード」を見ると、「app」というグループがあることがわかります。これは「Docker Compose」の「プロジェクト名」であり、コンテナをグループ化するために使われます。デフォルトでは、プロジェクト名は単に「docker-compose.yml」が置かれていたディレクトリの名前になっています。
8. Composeファイルのリファレンス
Composeファイルのリファレンスは、以下で参照できます。
次回
この記事が気に入ったらサポートをしてみませんか?