Tech Sketch Bucket of Technical Chips by TIS Inc.

Docker SwarmとComposeでWordPress環境を構築する

Pocket

2016年4月13日にDocker 1.11がリリースされました。 今回発表されたDocker Engineは初めてOCI(Open Container Initiative)準拠のツールである、runccontainerdを基にして開発されました。

今回の記事では、新しくリリースされたDocker Engine, Compose, Swarm, Machineを使って、swarm クラスタ上にWordPressを構築してみたいと思います。

導入環境

仮想マシン3台を使用して、2台構成のDocker Swarmクラスタを作成します。

  • OS: Ubuntu 15.10(64bit)
    • kernel version: 4.2.0-35
  • Docker Engine: 1.11.0
  • Docker Compose: 1.7
  • Docker Swarm: 1.2
  • Docer Machine: 0.7

目指す構成

  • docker-manageサーバ
    • IP: 10.255.10.10
    • 一般ユーザ名: developer
    • 動作コンテナ
      • consul
    • compose, machineをインストール済み
  • swarm-master サーバ

    • IP: 10.255.10.11
    • 一般ユーザ名: developer
    • 動作コンテナ
      • swarm-agent-master
      • swarm-agent
      • wordpress
  • swarm-node サーバ

    • IP: 10.255.10.12
    • 一般ユーザ名: developer
    • 動作コンテナ
      • swarm-agent
      • mariadb

1. 事前準備

1.1 hostsファイルの編集

docker-manageサーバのhostsファイルに、swarm-masterサーバ、swarm-node サーバについて追加します。

1.2 公開鍵の配布

今回、すでに起動している既存の仮想マシンに対して、SSH経由でDocker Machineを適用します。 Docker Machineはroot実行権限がないとDocker環境を構築できないので、dockerを実行するユーザ(今回はdeveloper)の公開鍵を各マシンのrootユーザに配布します。

今回はDocker Machineを実行しているdocker-managerサーバにもDocker Machineを使用してDocker環境を作成します。 docker-manageサーバ内で、developerユーザの鍵生成を行った後すべてのマシンに対して以下の作業を実行します。

  1. docker-managerサーバの/root以下に.sshディレクトリを作成
  2. authorized_keysdeveloperの公開鍵を登録

swarm-masterサーバとswarm-nodeサーバのrootユーザに、docker-manageサーバからdeveloperユーザの公開鍵を配布します。

2.Docker環境の作成

では、ここから実際にDocker Swarmクラスタ環境をDocker Machineを用いて構築していきます。

2.1 Docker machineのインストール

  • docker-managerサーバで実行

Githubリポジトリからmachineのバイナリをインストールします。 インストール後、実行権限を付与します。

2.2 KVS用Docker環境の構築

2.2.1 docker-machine で Docker環境の構築

ドライバ、Docker環境を構築するIPアドレス、秘密鍵の場所、ホスト名を渡してDocker環境を構築します。

docker-machine lsdocker-machine envコマンドを実行して、Docker Machineにdocker-manageサーバが管理されているか確認します。

2.2.2 dockerグループへの参加

環境構築後、一般ユーザであるdeveloperをdockerグループに参加させます。 これによって、developerでもDockerコマンドが実行できるようになります。

2.2.3 consulコンテナの起動

swarmクラスタ内の各Dockerホストのメタデータ格納用のKVSを用意します。

今回はConsulのDockerimageを使用します。

  • Consul以外だと、EtcdやZooKeeperも選択可能です。

consulのコンテナが起動しているかどうか、docker psで確認してください。

2.3 Docker Swarmクラスタ環境の構築

Docker Swarmクラスタは、Docker Machine で環境構築時にオプションを付けることで、簡単に構築することができます。

  • --swarmオプションでswarm-agentコンテナが起動します
  • --swarm-masterオプションでswarm-agent-masterコンテナが起動します
  • 上記のオプションに加えて、KVSの情報を与える必要があります

2.3.1 swarm master環境の構築

  • docker-manageサーバで実行

swarm-masterサーバにDocker環境とswarm-agent、swarm-agent-masterコンテナを立てます。

注:engine-opt="cluster-advertis=eno16777984:2376"のところで使用している eno16777984の部分はNIC名です。ここのNIC名は自環境のものを調べて置き換えてください。

2.3.2 swarm node環境の構築

  • docker-manageサーバで実行

--swarm-masterオプションが消えていることに注意。

2.4 動作確認

swarmクラスタが構築されているかどうかdocker-machine lsで確認します。

  • STATEが全てRunnningになっていること
  • SWARMswarm-masterの行がswarm-master (master)になっていること
  • SWARMswarm-nodeの行がswarm-masterになっていること

2.5 Swarmクラスタを使用を開始する

  • docker-manageサーバで実行

Swarmクラスタを利用するために必要な環境変数を適用してSwarmクラスタを使用できるようにします。 Swarmクラスタを使用するために必要な環境変数はdocker-machine env --swarmで確認できます。

2.5.1 Swarmクラスタ用環境変数の適用

  • docker-manageサーバで実行

docker-machine envを実行して表示されたコマンドを実行して、Swarmクラスタを使用するための環境変数を適用します。

2.5.2 動作確認

  • docker-manageサーバで実行

docker-machine lsを実行してACTIVEswarm-master行が* (swarm)になっていることを確認します。

docker infoを実行して、Swarmクラスタ内の全てのノードの情報が取れていることを確認します。

以上でSwarmクラスタ環境の構築が終わりました。 続いて、Swarmクラスタ上にDocker Composeを使用してWordPress環境を構築します。

3. Composeでサービスの立ち上げ

ここから先は、Swarmクラスタに対して操作を行うので、swarmクラスタ用の環境変数が常に設定されていることが前提となります。

3.1 Docker composeのインストール

  • docker-managerサーバで実行

machineと同様にGithubからインストールして、実行権限を付与します。

3.2 サービスの定義

  • docker-managerサーバで実行

Docker Composeでは、docker-compose.ymlという名前のYMLファイルでサービスを定義します。

今回はwebサーバ:1、dbサーバ:1のWordPress環境を構築します。さらにweb,dbの両コンテナは別々のマシン上に起動させ、dockerのoverlay networkで接続します。

3.2.1 前準備

  • Docker Composeで作成するサービス用のディレクトリを作成します。

3.2.2 docker-compose.ymlの作成

  • WordPress ディレクトリの中に移動して、docker-compose.ymlファイルを作成します。
  • docker-compose.ymlの中身
    • 今回のdocker-compose.ymlはversion 2の記法で書かれています。詳しくは公式ページを確認してください。
    • WordPress, MariaDB共に公式のイメージを使用しています

3.3 サービスの起動

docker-compose.ymlがあるディレクトリ内でdocker-compose upを実行することでサービスが立ち上がります。今回は-dオプションをつけてdaemon化しています

docker-compose upを実行すると、自動的にoverlay networkが作成されます。overlay networkの名前は指定がなければカレントディレクトリ名の後ろに_defaultが付いたネットワーク名になります。

3.4 動作確認

コンテナが分散実行されていることを確認します。NAMESを見ると、wordpressがswarm-masterで、mariadbがswarm-nodeで実行されていることがわかります。

networkにwordpress_defaultが追加されていることを確認します。

ブラウザからhttp://:8080にアクセスしてWordpressの初期画面が表示されていれば成功です。 - 今回の例だと、http:10.255.10.11//:8080です

まとめ

起動済みの仮想マシンに対して、Docker Machineを用いてDocker環境及びSwarmクラスタ環境を構築しました。その後、Swarmクラスタ上にDocker Composeを用いて WordPress環境を作成しました。この時、Swarmクラスタ上にWordPressのwebサーバ、DBサーバコンテナが分散配置され、Dockerのoverlayネットワークが自動で作成されていることを確認しました。

今回、簡単にSwarmクラスタの構築と、Docker Composeによるコンテナの分散実行を実現することができたので、皆さんもぜひ試してみてください。

エンジニア採用中!私たちと一緒に働いてみませんか?