2016.08.08

Dockerでnginxを使ったマルチホスト〜コンテンツ別にコンテナ振り分け〜

難易度
2
カテゴリー
やってみよう!

160808_nginx_mv

みなさん、こんにちは。Startup.Tokyo Inc.の吉岡朗です。
前回の記事が意外に反響の多さでビックリしています。

Ⅰ.はじめに

今回は、今はやりのDockerについて基本的なところをおさえつつ、その発展形の1つを説明していきます。
まずは、Dockerの基本的な使い方は、このアカデミーで特集される形になっているおなじみの連載ものがあります。

Docker Tips 目次~Cloud ServerでDockerを使おう~

今回は、これらのDockerの発展形である、いろいろなDockerコンテナの中から、オーソドックであるWebサーバー&WordPressの構築を説明していきます。


Ⅱ.用意するもの、環境面の説明

今回は、GMOアカデミーより環境を提供いただきました。
サーバーのスペック、環境面は、以下の通りです。(執筆段階)

項目 内容
サーバースペック GMOクラウド Altus Basicシリーズ CentOS7
テンプレート CentOS 7.1.1503 64bit_20160223
サーバー MiniServerタイプ
IPアドレス ***.***.***.***

テスト環境ですが、DNSに以下の名前に仮付与しました。
test1.x1.hogehoge.com, test2.x1.hogehoge.com, test3.x1.hogehoge.com
(hogehoge.comは適宜読み替えてください。)

OSリリースバージョン CentOS Linux release 7.1.1503 (Core)
OSカーネルバージョン Linux version 3.10.0-327.4.4.el7.x86_64
メモリ 500MB
CPUクロック 1GHz
Dockerバージョン 1.10.3-44.el7.centos

実行時には# yum updateにてアップデート済みです。

Dockerをインストールします。

# yum install -y docker

Dockerのサービスを起動します。

# systemctl start docker

Dockerをデーモンとして有効化します。

# systemctl enable docker

Ⅲ.フロントのDockerコンテナのインストール、立ち上げ

(1)Nginxコンテナを入れる
①フロントのDockerコンテナは、Dockerイメージからnginxを取得します。

# docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock jwilder/nginx-proxy

【コマンドの説明】

項目 内容
docker Dockerのコマンドです。
run コンテナとして起動します。
-d デーモンとして起動します。
-p 80:80 ポート番号の対応関係を示します
-p ホストのポート番号:コンテナ内部のポート番号 の関係です。
この場合は外部、内部コンテナはともにポート番号80を使うことを示します。
-v /var/run/docker.sock /tmp/docker.sock:ホストの任意のパスをコンテナの任意のパスにマウントします。

-v ホストのパス:コンテナ内部のパス の関係です。

jwilder/nginx-proxy コンテナのイメージ名になります。

②実行結果を確認します。

# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
010b77b3329b jwilder/nginx-proxy "/app/docker-entrypoi" 4 seconds ago Up 3 seconds 0.0.0.0:80->80/tcp, 443/tcp nginx

Ⅳ.バックエンドのDockerコンテナのインストール、立ち上げ

(1)シングルサイトとしてWordPressを入れてみる
①バックエンドのDockerコンテナとして、WordPressをイメージ取得から行います。
WordPressにはMySQLを使用しますが、今回は外部のMySQLを使用する例です。
あらかじめDNS設定にて、IPアドレス***.***.***.*** を test1.x1.hogehoge.com, test2.x1.hogehoge.com, test3.x1.hogehoge.comとマルチサイト用に割り当てておきます。
そして、バックエンドで立ち上げるときのコンテナは、環境変数 VIRTUAL_HOST=ドメイン名 にドメインすることで、dockerは割り振り先が分かります。

# docker run -i -t -e VIRTUAL_HOST=test1.x1.hogehoge.com \
-e WORDPRESS_DB_HOST=db1.hogehoge.com \
-e WORDPRESS_DB_USER=hogetest1 \
-e WORDPRESS_DB_PASSWORD=hogehoge \
-e WORDPRESS_DB_NAME=hogetest2 \
-e WORDPRESS_TABLE_PREFIX=wp_ \
--name wordpress1 -d -p :80 wordpress

【コマンドの説明】

項目 内容
1行目 docker Dockerのコマンドです
run コンテナとして起動します。
-i -t おまじないみたいなものです。
-e VIRTUAL_HOST = test1.x1.hogehoge.com 環境変数 VIRTUAL_HOSTを設定します。
2行目 -e WORDPRESS_DB_HOST = db1.hogehoge.com 環境変数WORDPRESS_DB_HOSTを設定します。WordPressのMySQL接続用です。
3行目 -e WORDPRESS_DB_USER = hogetest1 環境変数WORDPRESS_DB_USERを設定します。WordPressのMySQL接続用です。
4行目 -e WORDPRESS_DB_PASSWORD = hogehoge 環境変数WORDPRESS_DB_PASSWORDを設定します。WordPressのMySQL接続用です。
5行目 -e WORDPRESS_DB_NAME = hogetest2 環境変数WORDPRESS_DB_NAMEを設定します。WordPressのMySQL接続用です。
6行目 -e WORDPRESS_TABLE_PREFIX = wp_ 環境変数WORDPRESS_DB_TABLE_PREFIXを設定します。WordPressのMySQL接続用です。
7行目 --name wordpress1 このコンテナの名前を設定します。
-d このコンテナをバックグラウンドで起動します。
-p :80: ポート番号の対応関係を示します。-p ホストのポート番号:コンテナ内部のポート番号 の関係です。
この場合はホスト側のポート番号は固定でないポート番号、内部コンテナはポート番号80を使うことを示します。
wordpress コンテナのイメージ名になります。

 

②実行結果を確認します。

# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
010b77b3329b jwilder/nginx-proxy "/app/docker-entrypoi" 4 seconds ago Up 3 seconds 0.0.0.0:80->80/tcp, 443/tcp nginx
3ce827959736 wordpress "/entrypoint.sh apach" 22 minutes ago Up 22 minutes 0.0.0.0:32769->80/tcp wordpress1

③稼働したかどうかをブラウザより確認することができます。

160808_docker_scr02
(2)マルチサイトとしてWordPressを入れてみる
マルチサイト用に立ち上げる場合には、以下の箇所に注意してください。

①ドメイン名
②WordPressのデータベース接続情報
③コンテナの名前

例1

# docker run -i -t -e VIRTUAL_HOST=test2.x1.hogehoge.com \
-e WORDPRESS_DB_HOST=db1.hogehoge.com \
-e WORDPRESS_DB_USER=hogetest3 \
-e WORDPRESS_DB_PASSWORD=hogehoge \
-e WORDPRESS_DB_NAME=hogetest4 \
-e WORDPRESS_TABLE_PREFIX=wp_ \
--name wordpress2 -d -p :80 wordpress

例2

# docker run -i -t -e VIRTUAL_HOST=test3.x1.hogehoge.com \
-e WORDPRESS_DB_HOST=db2.hogehoge.com \
-e WORDPRESS_DB_USER=hogetest5 \
-e WORDPRESS_DB_PASSWORD=hogehoge \
-e WORDPRESS_DB_NAME=hogetest6 \
-e WORDPRESS_TABLE_PREFIX=wp_ \
--name wordpress3 -d -p :80 wordpress

実行結果の確認

# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
010b77b3329b jwilder/nginx-proxy "/app/docker-entrypoi" 4 minutes ago Up 4 minutes 0.0.0.0:80->80/tcp, 443/tcp nginx
3ce827959736 wordpress "/entrypoint.sh apach" 27 minutes ago Up 27 minutes 0.0.0.0:32769->80/tcp wordpress1
33b8eb1c2ac5 wordpress "/entrypoint.sh apach" 23 minutes ago Up 23 minutes 0.0.0.0:32771->80/tcp wordpress2
ccd49e050af7 wordpress "/entrypoint.sh apach" 4 seconds ago Up 3 seconds 0.0.0.0:32772->80/tcp wordpress3

Ⅴ.付録

(1)執筆時点でのDockerのイメージサイズは以下の通りです。

# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/wordpress latest ba0d4f420656 38 hours ago 429.5 MB
docker.io/jwilder/nginx-proxy latest b9debdc64b60 2 days ago 247.7 MB

(2)WordPressの多重起動について
DockerのWordPressコンテナを10個立ち上げた状態でも、CPU負荷、メモリ負荷などがありませんでした。(極端に立ち上げてみました。環境により異なります。)
今回のテスト環境はminiServerと呼ばれる、メモリが500MB、CPUクロック1GHzタイプで、立ち上げが可能でした。
通常WordPressのメモリ使用量が1コンテンツで50MBなら10個起動の段階で500MBを超えてOut of Memoryを起こして起動ができないはずですが、Dockerコンテナであるため起きないようです。

# top
top - 19:05:08 up 1 day, 4:30, 2 users, load average: 1.85, 2.54, 1.66
Tasks: 303 total, 4 running, 299 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 491200 total, 6944 free, 229560 used, 254696 buff/cache
KiB Swap: 2097148 total, 1886388 free, 210760 used. 137440 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
22875 root 20 0 313184 3540 3420 S 0.3 0.7 0:00.16 apache2
24522 root 20 0 159900 2128 1256 R 0.3 0.4 0:00.12 top
1 root 20 0 188856 1844 572 S 0.0 0.4 0:03.77 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.29 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.02 ksoftirqd/0
7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a402b235c616 wordpress "/entrypoint.sh apach" 4 minutes ago Up 3 minutes 0.0.0.0:32784->80/tcp wordpress10
0060a8c52faf wordpress "/entrypoint.sh apach" 5 minutes ago Up 4 minutes 0.0.0.0:32783->80/tcp wordpress9
11d76ba47456 wordpress "/entrypoint.sh apach" 6 minutes ago Up 5 minutes 0.0.0.0:32782->80/tcp wordpress8
860a7b7c65ee wordpress "/entrypoint.sh apach" 6 minutes ago Up 6 minutes 0.0.0.0:32781->80/tcp wordpress7
371665d550c8 wordpress "/entrypoint.sh apach" 6 minutes ago Up 6 minutes 0.0.0.0:32780->80/tcp wordpress6
8572783f5a4a wordpress "/entrypoint.sh apach" 7 minutes ago Up 7 minutes 0.0.0.0:32779->80/tcp wordpress5
2df9460c7e5b wordpress "/entrypoint.sh apach" 7 minutes ago Up 7 minutes 0.0.0.0:32778->80/tcp wordpress4
ccd49e050af7 wordpress "/entrypoint.sh apach" 20 minutes ago Up 20 minutes 0.0.0.0:32772->80/tcp wordpress3
010b77b3329b jwilder/nginx-proxy "/app/docker-entrypoi" 25 minutes ago Up 25 minutes 0.0.0.0:80->80/tcp, 443/tcp nginx
33b8eb1c2ac5 wordpress "/entrypoint.sh apach" 43 minutes ago Up 43 minutes 0.0.0.0:32771->80/tcp wordpress2
3ce827959736 wordpress "/entrypoint.sh apach" 47 minutes ago Up 47 minutes 0.0.0.0:32769->80/tcp wordpress1

この記事を書いた人

吉岡朗

Startup.Tokyo Inc代表、HackathonPost.com主宰、WordPress-News.info編集長
一般企業のサラリーマンでシステムエンジニアをしながら、ハッカソン、スタートアップ系に興味を持ちはじめ、個人メディアとして、2014年3月より、【ハッカソン・アイデアソン・起業/ビジネスコンテストのイベント情報まとめサイト「HackathonPost」」を開設。
WordPressを中心に、クラウドサービスを借りながら、50サイト以上のWordPressを運用中。
色々改造して金にならないことばかりして遊ぶエンジニア。
サイト:http://startup.tokyo/
Facebookページ:http://www.facebook.com/HackathonPost

GMOクラウドアカデミーYouTubeチャンネルはこちらから

アカデミー用バナー

メルマガ会員募集中!

アカデミーの最新情報や会員限定のお得な情報をお届けします。

メルマガ登録はこちら