見出し画像

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」が置かれていたディレクトリの名前になっています。

画像1

8. Composeファイルのリファレンス

Composeファイルのリファレンスは、以下で参照できます。

次回


この記事が気に入ったらサポートをしてみませんか?