SEワンタンの独学備忘録

IT関連の独学した内容や資格試験に対する取り組みの備忘録

【Docker】入門⑨ Docker Composeによる複数コンテナ管理(docker-compose.yml)

今回はDocker Composeの基本コマンドについてさらっと。

複数コンテナの管理

一般的なシステム運用を行う際には、これまで使用してきた1コンテナだけでは運用は難しく複数のコンテナ(サーバ)が必要になります。
そのために今回は複数のコンテナ運用方法を学びます。

web3層アーキテクチャモデル

webアプリケーションを構築にするにあたって、代表的なシステムアーキテクチャモデルにweb3層アーキテクチャモデルがあります。

f:id:wantanBlog:20200408225720p:plain

webサーバでリクエストの受付と最終的な返却、APサーバで業務処理ロジック、DBサーバでは永続データを扱い取得や更新を行うといった流れです。

次回以降はこのようなモデルをDockerコンテナにより構築することを目指します。

今回は全てのサーバ機能をコンテナで実装するようにしますが、永続データはDockerコンテナで扱うと消失のリスクが伴うため、バックアップを行ったり別のサーバに保管してマウントしたりして扱うのが一般的なようです。

なんでもかんでもコンテナで扱うというよりはメリットデメリットを考慮してアーキテクチャを設計する必要があるでしょう。


Docker Compose

複数のコンテナを一元管理する際にはDocker Composeというコンポーネントを使用します。
Docker Composeではdocker-compose.ymlファイルにコンテナの構成情報を記述することで管理を行います。


docker-compose.yml の記述方法

少しイメージがしにくいですが、まずはコマンド(命令)をざーっとさらっていきます。

image:イメージ指定

コンテナを生成するためのイメージを指定するためにはimageを用います。

services:
 webserver:
  image: centos

イメージのバージョンを指定する場合にはタグを指定すればOKです。指定しない場合には最新版が使用されます。

build:イメージのビルド

イメージの構成をDockerfileに記述してbuildする場合にはbuildを用います。

services:
 webserver:
  build: .

docker-compose.ymlと同一階層のディレクトリにDockerfileという名前のdockerfileが存在する場合にはカレントディレクトリを表す「.」のみの記述で大丈夫なようです。

ファイル名が異なる場合は同一ディレクトリに存在しない場合には以下のようにして指定します。

services:
 webserver:
  build:
   context: /dfile
   dockerfile: webserver-file
command:コンテナ内のコマンド実行

コンテナ内でのコマンドを実行する場合にはcommandを使用します。

 command: /bin/bash

またDockerfileと同様にentrypointによるコマンド指定も可能でこちらは元のENTRYPOINTを上書きする形となります。

 command: /bin/bash
links:コンテナ間の連携

コンテナ間の連携を行う場合にはlinksを用います。
リンク先にはサービス名(コンテナ名)を指定します。

 links:
  - apserver
depends_on:コンテナ間の依存関係定義

複数コンテナを生成する場合に、その依存関係はdepends_onにより定義します。

services:
 webserver:
  build: .
  depends_on:
        - apserver
services:
 apserver:
   image: centos

上記の例だとapserverコンテナが生成された後にwebserverが生成されることになります。

ports:公開ポートの指定

コンテナの公開ポート番号を指定する場合にはportsを用います。
記述形式としては「ホストマシンのポート番号:コンテナのポート番号」で指定します。

単一のポート番号のみを指定した場合にはコンテナのポート番号として割り振られ、ホスト側のポート番号はランダムで割り振られます。
ポート番号の指定形式は時刻の形式(yy:mm)と被る可能性があるため慣例としてダブルクォーテーション(")で囲んで記述するようです。

ports:
   - "8080:80"
   - "443"
exports:連携コンテナへのポート公開

ポート自体を全範囲に公開するのではなく、連携コンテナのみにポートを公開する場合にはexportsを用います。
形式はぽportsと同様のようです。

exports:
   - "8000"
   - "2261"
environment:環境変数の設定

コンテナ内で環境変数を設定する場合にはenvironmentを使用します。

 environment:
   - USER_NAME=wantan
   - TEST=env_test
env_file:環境変数設定ファイルの読み込み

コンテナ内の環境変数の設定方法としては、他に環境変数設定用のファイルを作成して読み込む方法もあります。
設定する環境変数の数が多くなってきた場合などには有効でしょう。
以下の例では同一階層にenvfileを配置しています。

env_file:
  - ./envfile


・envfileの記述例

USER_NAME=wantan
TEST=env_test
volume:コンテナでのマウント

コンテナでホストのボリュームをマウントする場合にはvolumeを用います。

volume:
  - /var/log