Docker 1.13には、compose-file supportと呼ばれる待望の機能が導入されています。これにより、単一の長いコマンドの代わりに、単純な構成ファイルを使用してコンテナーを定義できます。以前の「MySQLonDocker」ブログの投稿をご覧になると、複数の長いコマンドラインを使用してコンテナーとサービスを実行していました。 compose-fileを使用することにより、コンテナーを簡単に指定してデプロイできます。これにより、複数のパラメータを持つ長いコマンドを覚えておく必要がないため、人為的エラーのリスクが軽減されます。
このブログ投稿では、MySQLのデプロイメントに関する簡単な例を使用して、compose-fileの使用方法を紹介します。 Docker Engine 1.13が3つの物理ホストにインストールされており、Swarmモードがすべてのホストに構成されていることを前提としています。
作成ファイルの概要
作成ファイルでは、Dockerコマンドに渡す必要のあるすべての引数を記憶しようとするのではなく、すべてをYAML形式で指定します。ここでサービス、ネットワーク、ボリュームを定義できます。定義はDockerによって取得され、コマンドラインパラメーターを「dockerrun | network|volume」コマンドに渡すのと非常によく似ています。
はじめに、単純なスタンドアロンのMySQLコンテナをデプロイします。作成ファイルの作成を開始する前に、まず実行コマンドを知っておく必要があります。 Dockerブログシリーズの最初のMySQLから抜粋して、次の「dockerrun」コマンドを作成しましょう。
$ docker run --detach \
--name=test-mysql \
--publish 6603:3306 \
--env="MYSQL_ROOT_PASSWORD=mypassword" \
-v /storage/docker/mysql-datadir:/var/lib/mysql \
mysql
docker-composeコマンドは、現在のディレクトリで「docker-compose.yml」というデフォルトのファイルを検索します。したがって、最初に必要なディレクトリを事前に作成しましょう:
$ mkdir -p ~/compose-files/mysql/single
$ mkdir -p /storage/docker/mysql-datadir
$ cd ~/compose-files/mysql/single
YAMLでは、次のように書く必要があります:
version: '2'
services:
mysql:
image: mysql
container_name: test-mysql
ports:
- 6603:3306
environment:
MYSQL_ROOT_PASSWORD: "mypassword"
volumes:
- /storage/docker/mysql-datadir:/var/lib/mysql
上記のコンテンツを「〜/ compose-files / mysql / single/docker-compose.yml」に保存します。現在のディレクトリ〜/ compose-files / mysql / singleにいることを確認してから、次のコマンドを実行して起動します。
$ docker-compose up -d
WARNING: The Docker Engine you're using is running in swarm mode.
Compose does not use swarm mode to deploy services to multiple nodes in a swarm. All containers will be scheduled on the current node.
To deploy your application across the swarm, use `docker stack deploy`.
Creating test-mysql
コンテナがデタッチモードで実行されているかどうかを確認します:
[[email protected] single]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
379d5c15ef44 mysql "docker-entrypoint..." 8 minutes ago Up 8 minutes 0.0.0.0:6603->3306/tcp test-mysql
おめでとう!これで、1つのコマンドで実行されるMySQLコンテナができました。
スタックのデプロイ
作成ファイルは物事を簡素化し、インフラストラクチャがどのように見えるべきかについてのより明確なビューを提供します。専用ネットワークの下でMySQLインスタンスを使用して、Drupalで実行されているWebサイトで構成されるコンテナースタックを作成し、それらをリンクしてみましょう。
上記と同様に、このスタックを構築するための正しい順序でコマンドラインバージョンを見てみましょう。
$ docker volume create mysql_data
$ docker network create drupal_mysql_net --driver=bridge
$ docker run -d --name=mysql-drupal --restart=always -v mysql_data:/var/lib/mysql --net=drupal_mysql_net -e MYSQL_ROOT_PASSWORD="mypassword" -e MYSQL_DATABASE="drupal" mysql
$ docker run -d --name=drupal -p 8080:80 --restart=always -v /var/www/html/modules -v /var/www/html/profiles -v /var/www/html/themes -v /var/www/html/sites --link mysql:mysql --net=drupal_mysql_net drupal
作成を開始するには、まず新しいスタック用のディレクトリを作成しましょう。
$ mkdir -p ~/compose-files/drupal-mysql
$ cd ~/compose-files/drupal-mysql
次に、以下のようにdocker-compose.ymlの書き込みコンテンツを作成します。
version: '2'
services:
mysql:
image: mysql
container_name: mysql-drupal
environment:
MYSQL_ROOT_PASSWORD: "mypassword"
MYSQL_DATABASE: "drupal"
volumes:
- mysql_data:/var/lib/mysql
restart: always
networks:
- drupal_mysql_net
drupal:
depends_on:
- mysql
image: drupal
container_name: drupal
ports:
- 8080:80
volumes:
- /var/www/html/modules
- /var/www/html/profiles
- /var/www/html/themes
- /var/www/html/sites
links:
- mysql:mysql
restart: always
networks:
- drupal_mysql_net
volumes:
mysql_data:
networks:
drupal_mysql_net:
driver: bridge
それらを起動します:
$ docker-compose up -d
..
Creating network "drupalmysql_drupal_mysql_net" with driver "bridge"
Creating volume "drupalmysql_mysql_data" with default driver
Pulling drupal (drupal:latest)...
..
Creating mysql-drupal
Creating drupal
Dockerは次のようにデプロイを実行します:
- ネットワークを作成する
- ボリュームを作成する
- 画像をプルする
- mysql-drupalを作成します(コンテナー「drupal」はそれに依存しているため)
- drupalコンテナを作成する
この時点で、私たちのアーキテクチャは次のように説明できます。
次に、両方のコンテナが相互にリンクされているため、インストールウィザードページでMySQLホストとして「mysql」を指定できます。それでおしまい。それらを破棄するには、同じディレクトリで次のコマンドを実行するだけです。
$ docker-compose down
対応するコンテナは終了し、それに応じて削除されます。 docker-composeコマンドは、Dockerを実行している個々の物理ホストにバインドされていることに注意してください。 Swarm全体で複数の物理ホストで実行するには、「dockerstack」コマンドを使用して異なる方法で処理する必要があります。これについては次のセクションで説明します。
Docker上のSevereninesMySQL:データベースをコンテナ化する方法Dockerコンテナ仮想化の上でMySQLサービスを実行することを検討する際に理解する必要があるすべてを発見するホワイトペーパーをダウンロードする群れ全体でスタックを構成する
まず、Dockerエンジンがv1.13で実行されており、Swarmモードが有効で準備完了状態になっていることを確認します。
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
8n8t3r4fvm8u01yhli9522xi9 * docker1.local Ready Active Reachable
o1dfbbnmhn1qayjry32bpl2by docker2.local Ready Active Reachable
tng5r9ax0ve855pih1110amv8 docker3.local Ready Active Leader
Docker Swarmモードでスタック機能を使用するには、DockerComposeバージョン3形式を使用する必要があります。 MySQLバックエンドとしての3ノードのGaleraセットアップを除いて、上記と同様のセットアップをデプロイします。このブログ投稿ですでに詳細に説明しました。
まず、新しいスタック用のディレクトリを作成します。
$ mkdir -p ~/compose-files/drupal-galera
$ cd ~/compose-files/drupal-galera
次に、次の行を「docker-compose.yml」に追加します。
version: '3'
services:
galera:
deploy:
replicas: 3
restart_policy:
condition: on-failure
delay: 30s
max_attempts: 3
window: 60s
update_config:
parallelism: 1
delay: 10s
max_failure_ratio: 0.3
image: severalnines/pxc56
environment:
MYSQL_ROOT_PASSWORD: "mypassword"
CLUSTER_NAME: "my_galera"
XTRABACKUP_PASSWORD: "mypassword"
DISCOVERY_SERVICE: '192.168.55.111:2379,192.168.55.112:2379,192.168.55.207:2379'
MYSQL_DATABASE: 'drupal'
networks:
- galera_net
drupal:
depends_on:
- galera
deploy:
replicas: 1
image: drupal
ports:
- 8080:80
volumes:
- drupal_modules:/var/www/html/modules
- drupal_profile:/var/www/html/profiles
- drupal_theme:/var/www/html/themes
- drupal_sites:/var/www/html/sites
networks:
- galera_net
volumes:
drupal_modules:
drupal_profile:
drupal_theme:
drupal_sites:
networks:
galera_net:
driver: overlay
使用したGaleraイメージ(severalnines / pxc56)には、各Docker物理ホストにインストールされた実行中のetcdクラスターが必要であることに注意してください。前提条件の手順については、このブログ投稿を参照してください。
作成ファイルの重要な部分の1つは、restart_policyセクションのmax_attemptsパラメーターです。失敗した場合の再起動回数に厳しい制限を指定する必要があります。これにより、デフォルトでは、Swarmスケジューラーがコンテナーの再起動の試行をあきらめることがないため、デプロイメントプロセスがより安全になります。これが発生した場合、スケジューラーがコンテナーを目的の状態に戻すことができないと、プロセスループは物理ホストのディスクスペースを使用できないコンテナーでいっぱいにします。これは、MySQLのようなステートフルサービスを処理する場合の一般的なアプローチです。一貫性のない状態で実行するのではなく、完全に停止することをお勧めします。
それらをすべて開始するには、docker-compose.ymlが存在する同じディレクトリで次のコマンドを実行するだけです。
$ docker stack deploy --compose-file=docker-compose.yml my_drupal
スタックが2つのサービス(drupalとgalera)で作成されていることを確認します:
$ docker stack ls
NAME SERVICES
my_drupal 2
作成したスタック内の現在のタスクを一覧表示することもできます。結果は、「dockerservicepsmy_drupal_galera」コマンドと「dockerservicepsmy_drupal_drupal」コマンドを組み合わせたバージョンです。
$ docker stack ps my_drupal
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
609jj9ji6rxt my_drupal_galera.1 severalnines/pxc56:latest docker3.local Running Running 7 minutes ago
z8mcqzf29lbq my_drupal_drupal.1 drupal:latest docker1.local Running Running 24 minutes ago
skblp9mfbbzi my_drupal_galera.2 severalnines/pxc56:latest docker1.local Running Running 10 minutes ago
cidn9kb0d62u my_drupal_galera.3 severalnines/pxc56:latest docker2.local Running Running 7 minutes ago
CURRENT STATEをRUNNINGとして取得したら、ポート8080でDockerホストのIPアドレスまたはホスト名のいずれかに接続することでDrupalのインストールを開始できます。この場合、docker3を使用しました(drupalコンテナーはdocker1にデプロイされています)。http ://192.168.55.113:8080/。インストールを続行し、MySQLホストとして「galera」を指定し、データベース名として「drupal」を指定します(MYSQL_DATABASE環境変数の下のcompose-fileで定義されています):
それでおしまい。スタックの展開は、Compose-fileを使用して簡略化されました。この時点で、私たちのアーキテクチャは次のようになっています。
最後に、スタックを削除するには、次のコマンドを実行するだけです。
$ docker stack rm my_drupal
Removing service my_drupal_galera
Removing service my_drupal_drupal
Removing network my_drupal_galera_net
長いコマンドラインで作業する場合と比較して、compose-fileを使用すると、時間を節約し、人的エラーのリスクを減らすことができます。これは、マルチコンテナーDockerアプリケーションを操作する前に習得するのに最適なツールであり、複数のデプロイメント環境(dev、test、staging、pre-prod、prodなど)を処理し、MySQLGaleraClusterのようにはるかに複雑なサービスを処理します。幸せなコンテナ化
!