未来を変える日記

ITスキルとトレイルラン

Docker (5) Composeで使う

 使い方編の最後はComposeです。

f:id:corgi-eric:20210130152704p:plain:w300

  1. ターミナルからコマンドで使う
  2. Dockerfileでイメージを弄って利用
  3. Docker-Compose.yml で複数イメージを束ねる

はじめに

 以前の2記事では、起動するのが単一のコンテナでした。

 勿論、それぞれのイメージにDockerfileを記載し、コマンドで複数のコンテナを起動することもできます。ですが、複数のコンテナを使いたい場合は、事前にdocker-compose.yml を作成しておくと便利なのです。

docker-compose.yml の利用例

 下は自分が作成したVPSで動くWordpressコンテナセットのdocker-compose.ymlです。


内容の説明

 前述の docker-compose.yml で行っていることをざっと説明します。

  • Nginx, PHP, Wordpress, DBのコンテナを起動(Service)
  • 起動順序は DB -> Wordpress -> PHP -> Nginxの順(depends_on)
  • 443, 80のポートを外部公開(Ports)
  • コンテナ停止時も保存するファイルを指定(volumes)
  • 各コンテナに必要な環境変数を指定(environment)

使ってみる

docker-compose build

 前のdockerfileと同じでイメージを作成するためのビルドが必要です。docker-compose.yml のあるディレクトリに移動して、次のコマンドです。

docker-compose build

 上の公式を読むとオプション指定で例えば画面メッセージを出さない(-q, -quiet)とかビルド済みのキャッシュを使わない(--no-cache)とかのオプションも準備されてますが、自分は特に付けずに使ってました。

docker-compose up -d

 続いて、コンテナを起動するコマンド。

docker-compose up -d

 こちらも色々オプションあるのですが、自分が使ったのは、バックグランドで動かす(-d, --detach)だけでした。

 下はコンテナ起動時の画面。上で各コンテナの起動順序を(depends_on)で指定してますが、その順番(mysql -> blogsys -> phpsrv -> websrv)で起動しているのがわかります。

f:id:corgi-eric:20210131121744p:plain

動作確認

 動かしてみます。ブラウザを起動してlocalhost.masa-nakajima.com にアクセス。ただのlocalhostにしていない背景は次の記事で解説します。

f:id:corgi-eric:20210131122542p:plain

 さて、Wordpressの初期画面が現れました。テーマやプラグインを入れたり、記事を書いてみたりで動作確認を行います。

docker-compose down

 一通りの動作検証を終えたらコンテナを停止します。

docker-compose down

 コンテナのリムーブまで自動で行ってくれます。下のスクショの通りです。

f:id:corgi-eric:20210131123244p:plain

コンテナのデータについて

 ここまで、docker-compose.ymlを利用し、Wordpressコンテナセットのビルド(build)からの起動(up)、停止と削除(down)を行いました。
 
 起動中に動作確認にて、Wordpressの設定やテーマやプラグインを導入したりの操作をしていますが、コンテナセットを再起動した場合はどうでしょうか?

データ管理の方法

 Dockerには、そうしたデータを残す仕組みが準備されています。代表的なのが以下の2件。

  1. バインドマウント
  2. ボリューム

f:id:corgi-eric:20210131132739p:plain:w350

tmpfs mountは?

 なお、公式にはもう一つ tmpfs mountというのもあります。こちらはコンテナ内のデータをホスト上のメモリで保管します。つまり、データの保存が目的ではなく、データをコンテナやホストPCからも切り分けて管理するための仕組みです。

バインドマウント

 話を戻しバインドマウントです。ホストPC(Windows 10)のファイルもしくはフォルダをそのままDockerのコンテナ内に組み込んでくれます。

f:id:corgi-eric:20210131135443p:plain:w250

 例えば次の用に指定します。

volumes:
  - ./web/logs/:/var/log/nginx

 これは、上で紹介した docker-compose.yml の14行にある表現です。Windows 10のファイルシステムの ./web/logs/ と Nginxコンテナ内の /var/log/nginx を共有しています。

 こうしてバインドマウントしておくと、コンテナ起動後、VS CodeからNginxのログをリアルタイムで眺めることができるのです。

f:id:corgi-eric:20210131134803p:plain

 ログの確認で毎回コンテナに入る手間を考えると非常に便利なマウント方法です。

ボリューム

 前述のバインドマウントはログ確認などには便利なのですが、ホストPCのファイルシステムに依存することになります。
 要するにホストPC側にも同じファイルを置くのですから、誤って削除されたり、改変されてしまうリスクがあります。保存したいデータをDocker側に管理してもらって、そうした制約を受けないようにしたのがボリュームです。

f:id:corgi-eric:20210131135522p:plain:w250

 上の例では、例えば11行目で使ってます。

volumes:
  - wp-html:/var/www/html/

 Wordpressのコンテナ(Blogsys)にある外部公開用のデータをボリューム指定して、WebサーバーのNginx(Websrv)の公開用ディレクトリにマウントしています。
 前述のログと異なり、Wordpressの外部公開用データは、リアルタイムで眺める必要性は低く、このように、ボリュームで管理した方が便利です。

 なお、各コンテナにvolumeを設定した場合、docker-compose.ymlの末尾に、以下のようなvolumesも別途記載してやる必要があります。

volumes:
  wp-html:

 上の例ですと、70~75行に記載があります。

docker volume

 さて、ボリュームですが、前述した通り、docker側で管理されます。そして、コンテナを削除しても残る性質があるため、dockerを使い込むに従って、その容量が膨らんでゆきます。

 それで、よく使うのは次の3つでした。

docker volume ls
docker volume rm
docker volume prune

 ls は一覧表示。rmは個別削除。pruneは未使用ボリュームの一括削除です。

 試しに docker volume ls してみた所。

f:id:corgi-eric:20210131140710p:plain

 なお、ボリュームの管理はコマンドのみです。docker desktopでimageは扱えますが、volumeを扱うことはできません(何故だ?(。´・ω・))

f:id:corgi-eric:20210131141125p:plain
Docker desktopではVolumeは扱えない

よく使う命令

 最後に docker-compose.yml でよく使った命令をまとめます。

version

 最初に指定します。

version: '3.1'

 適用できるバージョンは、インストール済みの Docker Engine のバージョンと対応関係があり、Version別に機能が追加されていたり仕様が変更されてます。

 視聴したUdemy講座ではVersion 3 以上が推奨されていました。当方は、3.1としました。

services

 composeに組み込むコンテナを指定します。当方は以下の4サービス(コンテナ4個)を組み込みました。

services:
  web:
  php:
  blog:
  db:

 以降は各サービス下で使用される命令です。

image

 dockerfileを使わず、イメージを直接コンテナ化する場合に使います。以下のように使えます。

    image: wordpress:5.6-apache

 この場合、wordpressの5.6でapache付きイメージを利用できます。

build

 dockerfileを利用してイメージをビルドしてからコンテナ化する場合に使います。dockerfileのある相対パスを指定します。

    build: ./web

 上の例では、 ./web フォルダ下にあるdockerfileをビルドしてくれます。

container_name

 コンテナに名前を付けることができます。コマンド利用でいう所の(--name)オプションです。

    conatiner_name: websrv

 当方はNginxコンテナにwebsrvという名前を付けました。

restart

 コンテナが停止した時に再起動させるか?という指定です。

    restart: always

 自分は、always以外では結局使いませんでしたね。

ports

 何番ポートを外部に公開するか?という設定です。

    ports:
      - 443:443
      - 80:80

 Nginxで443番と80番ポートを公開しています。それぞれhttps、http通信用の定番ポートです。

volumes

 本記事の上で解説した「コンテナのデータ」についてを参照ください。

environment

 環境変数を決めます。例えば以下のようにします。

    environment:
      TZ: "Asia/Tokyo"
      DO_AUTH_TOKEN: ${AUTH_TOKEN}

 1行目でコンテナのタイムゾーンを日本に設定。2行目は、httpsの認証書の取得に必要なアクセストークンですが、この情報は公開したくないので、${AUTO_TOKEN}という変数で指定しています。
 ${AUTO_TOKEN}内の変数指定方法は後述する「.envファイル」を参照ください。

depends_on

 コンテナの起動順序を指定します。以下のように記載します。

 depends_on: 
     - php 

 2行目は、serviceで指定したサービス名(コンテナ名ではない)です。depneds_onに指定されたサービスが先に起動され、depends_onを指定したサービスが後に起動されます。上の例だと、phpサービス起動後に、depneds_onのあるwebが起動する順序です。

.envファイル

 前述のenviornmentで変数を指定する場合は別途 .envファイルを準備して、そこに必要な情報を集約して記載することができます。

 なお、当方は以下のようなファイルを準備しました。

 イコール(=)記号の前後に空白が無く少々読みにくいですが、そうしないと正しく読み取られなかったので削りました。

まとめ

 5記事目にして、ようやく、docker-compose.yml を使って複数のイメージを束ねて使う方法まで記載することができました。
 次回は、Docker学習後に当方が自主課題で制作した VPSで動く Wordpresコンテナセットの話を記載します。