2016.01.18

やってみよう!DockerでWordPress構築~httpd/mysql設定と外部アクセスまで

難易度
2
カテゴリー
やってみよう!
タグ
Docker
WordPress
環境構築

160118_docker_mv

WordPressでサイトの運用をしている場合、頻繁にアップデートのお知らせが届くことがあるかと思います。このとき、アップデート自体は安易なため行った方が良いとは感じつつも、実際に運用中のサイトに対してアップデートを行う場合、検証もリスクも大きいではないでしょうか。

また新規にWordPressのサイトを構築する場合、プラグインを試すのにわざわざ同等のその動作環境を作るのには工数が掛かります。また作成ができたとしても汎用性が低いものになってしまうかと思います。そのような際に、Dockerを使用すると、OSやバージョン違いの環境作成などの検証環境が容易に作成できるようになります。

今回は、GMOクラウド ALTUS Basicシリーズを使用して、Docker環境を構築、WordPressのインストールを行いたいと思います。
160118_docker_fig1

1.イメージの作成とコンテナの起動

1-1.Dockerの起動状況を確認

バージョンの確認を行います。

$ docker -v

バージョンが表示されていない場合は、インストールがされていない可能性があります。
Dockerが起動していることを確認します。

$ service docker status

1-2.コンテナイメージの検索

コンテナイメージの検索を行います。

$ sudo docker search centos

オフィシャル以外のコンテナを選択することで、サーバーのセットアップ時間を短縮することも可能です。今回は、centosのコンテナイメージを使用して初期からのセットアップを行っていきます。

1-3.コンテナイメージのダウンロード

コンテナイメージをダウンロードします。

$ sudo docker pull centos:centos6

:centos6のようにタグを設定することで、ターゲットのOSをダウンロード可能です。OSの一覧はオフィシャルから参照することができます。centos一覧

今回は、centos6を選択します。

$ sudo docker images

コンテナイメージがダウンロードされていることを確認します。

1-4.コンテナ起動とアクセス

コンテナを起動します。

$ sudo docker run -it centos:centos6 /bin/bash

ダウンロードしたコンテナイメージから、新規のコンテナを作成します。

[root@b3f579d01992 /]#

先ほどダウンロードしたcentos6のコンテナ内のコンソールが表示されます。
この状況での操作は全て、作成したコンテナに対しての操作になります。

一度コンテナから抜け出します。
Ctrl + P → Ctrl + Q

抜け出す際は、コマンドは用意されていないため、キー操作により行います。

コンテナの状況を確認します。

$ sudo docker ps -a

docker ps -a はコンテナの状況を確認するコマンドとなります。
先ほど、作成したコンテナが一覧に表示されます。
-aをオプション指定すると、終了中のコンテナも表示がされます。

再度コンテナにアクセスします。

$ sudo docker attach {Container ID}

状況確認時に表示されたContainer IDを指定します。

コンテナを終了します。

[root@b3f579d01992 /]# exit

コンテナの状況を確認します。

$ sudo docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b3f579d01992 centos:6 "/bin/bash" 39 hours ago Exited (0) 38 hours ago romantic_kirch

先ほどと異なり、Exitedが表示されていることが確認できます。
この状況は、コンテナが終了している状態になります。

Ctrl + P → Ctrl + Qはバックグラウンドでコンテナを起動しておけますが、exitを実行した場合は、コンテナの終了となります。

1-5.不要コンテナの削除

先ほど作成したコンテナを削除します。

$ sudo docker rm {Container ID}

コンテナの状況を確認します。

$ sudo docker ps -a

先ほど作成したコンテナが削除されたことが確認できます。

1-6.コンテナのポートを仮想サーバーのポートにバインドして起動

sudo docker run -it -p 80:80 --name apache centos:centos6 /bin/bash

-p オプション を仮想サーバーの ポート:コンテナのポート と記述することで、ポートフォワーディングの設定を行い、外部アクセスをコンテナのポートに変換してアクセスさせることができます。

また、–name オプション を指定することで、コンテナにオリジナルの名前を付与することができます。これにより、コンテナにコマンド指示を与えるときに、覚えづらい Container ID の代わりに使用することができます。


2.Wordpress用コンテナイメージの作成

160118_docker_fig2

WordPress用のコンテナとMySQL用のコンテナを作成し、双方のコンテナの接続設定をしていきます。

2-1.Apach2.2のインストール

コンテナを起動したら、外部からWEBアクセスができるようにするため、Apacheのインストールを行います。

[root@b5f579d01100 /]# rpm -qa | grep httpd

Apacheがインストールされているかの確認を行います。centos6のコンテナイメージは、ミドルウェアがインストールされていませんので、なにも出力がされません。

yumからApacheをインストールします。

[root@b5f579d01100 /]# yum -y install httpd

Apacheがインストールされていることを確認できます。

[root@b5f579d01100 /]# rpm -qa | grep httpd

設定ファイルのバックアップを取ります。

[root@b5f579d01100 /]# cp -p /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org

このままだと、Apacheがワーニングを出力するため、ServerNameを変更します。

[root@b5f579d01100 /]# sed -i -e 's/\#ServerName www.example.com:80/ServerName docker.example.com/g' /etc/httpd/conf/httpd.conf

設定ファイルのテストを行います。

[root@b5f579d01100 /]# /etc/init.d/httpd configtest
Syntax OK

問題がなければ、"Syntax OK"と表示されます

Apacheを起動させます。

[root@b5f579d01100 /]# /etc/init.d/httpd start

Apacheが起動されていることを確認します。

[root@b5f579d01100 /]# ps awux | grep -v grep | grep http

テスト用のインデックスファイルを作成します。

[root@b5f579d01100 /]# echo "docker test" >> /var/www/html/index.html

WEBサーバーにアクセスを行います。

[root@b5f579d01100 /]# curl http://127.0.0.1/
docker test

先ほど作成したインデックスファイルの内容が表示されます。

自動起動の設定を行います。

[root@b5f579d01100 /]# chkconfig httpd on

2-2.PHPのインストールと設定

yumコマンドからPHPのインストールを行います。

[root@b5f579d01100 /]# yum -y install php php-mbstring php-mysql

PHPがインストールされていることを確認できます。

[root@b5f579d01100 /]# rpm -qa | grep php

2-3.コンテナ外からのアクセス確認

テスト用のインデックスファイルを作成します。

[root@b5f579d01100 /]# echo "<?php echo 'docker test php'; ?>" >> /var/www/html/index.php

WEBサーバーにアクセスを行います。

[root@b5f579d01100 /]# curl http://127.0.0.1/index.php
docker test php

先ほど作成したインデックスファイルの内容が表示されます。

ブラウザのURLエリアに入力して、アクセスができることを確認します。
http://[グローバルIP]:[ポート番号]/index.php

先ほど指定した、ポートフォワーディングのポート番号で、コンテナのWEBサーバーへアクセスができることが分かります。

2-4.wgetとtarのインストール

WordPressのファイルをダウンロードするため、wgetとtarをダウンロードします。

[root@b5f579d01100 /]# yum install wget
[root@b5f579d01100 /]# yum install tar

2-5.Wordpressのダウンロード

最新版のWordPressをダウンロードします。

[root@b5f579d01100 /]# cd /tmp/
[root@b5f579d01100 /]# wget https://ja.wordpress.org/wordpress-4.4-ja.tar.gz

2-6.解凍と設置

ダウンロードしたファイルの解凍を行います。

[root@b5f579d01100 /]# tar zxvf wordpress-4.4-ja.tar.gz

不要ファイルを削除し、WordPressの構成ファイルをルートドキュメントへ移動させます。

[root@b5f579d01100 /]# cd wordpress
[root@b5f579d01100 /]# rm /var/www/html/*
[root@b5f579d01100 /]# mv * /var/www/html/.

2-7. コンテナイメージのコミット

コンテナを終了します。

[root@b5f579d01100 /]# exit

コンテナが終了していることを確認します。

$ sudo docker ps -a

先ほどのコンテナをコミットして、新しいイメージを保存します。

$ sudo docker commit {Container ID} centos:wordpress

先ほど作成したコンテナを削除します。

$ sudo docker rm {Container ID}


3.Mysql用コンテナイメージの作成

3-1.Mysql serverのインストール

コンテナのポートを仮想サーバーのポートにバインドして起動します。

$ sudo docker run -i -t -p 8000:3306 --name mysql centos:centos6 /bin/bash

MySQLサーバーをインストールします。

[root@b2f579d01100 /]# yum -y install mysql-server

MySQLサーバーを起動します。

[root@b2f579d01100 /]# /etc/rc.d/init.d/mysqld start

MySQLサーバーの自動起動を設定します。

[root@b2f579d01100 /]# chkconfig mysqld on

3-2.rootユーザのパスワードと権限調整設定

MySQLにログインします。

[root@b2f579d01100 /]# mysql -u root

rootのパスワードを設定します。

mysql> SET PASSWORD FOR root@localhost=PASSWORD('himitsu');

rootの権限を変更します。

mysql> grant all privileges on *.* to root@'%'IDENTIFIED BY 'himitsu';
mysql> FLUSH PRIVILEGES;

3-3.WordPress用のDBを作成

"wordpress"のDBを作成します。

mysql> create database wordpress character set utf8;

DBが作成されていることを確認

mysql> show databases;

mysqlから抜けます。

mysql> exit;

3-4. コンテナイメージのコミット

一度コンテナから抜け出します。

Ctrl + P → Ctrl + Q

先ほどのコンテナをコミットして、新しいイメージを保存します。

$ sudo docker commit {Container ID} centos:mysql

これで、mysql用のコンテナが作成できました。


4.WordPressインストール

4-1.link指定でコンテナの作成

コンテナのポートを仮想サーバーのポートにバインドして起動します。

$ sudo docker run -it -p 80:80 --link mysql:db --name wordpress centos:wordpress /bin/bash

-link オプション を リンクしたいコンテナ名:コンテナ内 での名称と記述することで、先ほど作成したMySQL用のコンテナとWordPress用のコンテナを接続することができます。

4-2.mysqlコンテナとの接続確認

MySQLのコンテナと接続されていることを確認します。

[root@b9sv79d01100 /]# env

MySQLのIPアドレスを確認します。

4-3.Wordpressのインストール

Apacheを起動させます

[root@b9sv79d01100 /]# /etc/init.d/httpd start

wp-config.phpの書き込みができるようにフォルダの属性を変更します。

[root@b9sv79d01100 /]# chmod 777 /var/www/html/

ブラウザからWordPressのURLにアクセスをします。
http://[グローバルIP]:[ポート番号]/

160118_docker_wp

MySQLのIPアドレスとDBの設定情報を記載しインストールを行います。WordPressの基本情報を設定し、インストール完了になります。

4-4. 不要イメージの削除

コンテナから抜けます。
Ctrl + P → Ctrl + Q

現在のイメージを確認します。

$ sudo docker images

不要イメージを削除します。

$ docker rmi b157b77b1a65

コンテナが使用中のイメージは削除できませんので、コンテナから順番に削除していく必要があります。
不要イメージは残しておいても問題はありませんが、イメージが増えすぎると管理が難しくなるため、小まめな削除を推奨します。


5.パッケージされたイメージを使用しての構築

前述では、centosの設定を含めて構築を行いましたが、Dockerではオフィシャルのイメージを組み合わせることで、効率的な構築を行うことが可能です。以下では、WordPressもオフィシャルのイメージを使用した構築を行っていきます。

5-1. WordPressのイメージのダウンロード

WordPress用のコンテナイメージを検索します。

$ sudo docker search wordpress

今回は、WordPressのオフィシャルイメージを使用して、構築を行います。
WordPress用のイメージをダウンロードします。

$ sudo docker pull wordpress

5-2. MySQLのイメージのダウンロード

MySQLのオフィシャルイメージをダウンロードします。

$ sudo docker pull mysql:5.7

WordPressのコンテナにはDBが含まれておりませんので、事前にコンテナを設定しておく必要があります。

5-3. MySQLのコンテナの作成

MySQLのコンテナを作成します。

$ sudo docker run --name wordpressdb -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wordpress -d mysql:5.7

-e オプションを指定することで、環境変数を設定することができます。これによりWordPress用のDBとパスワードを指定できます。

5-4. WordPressのコンテナの作成

WordPress用のコンテナを起動します。

$ sudo docker run -p 80:80 -e WORDPRESS_DB_PASSWORD=password -d --name wordpress --link wordpressdb:mysql wordpress

–link オプションでMySQLのコンテナ接続を、-e オプションでDBのパスワードを設定しておきます。

ブラウザからWordPressのURLにアクセスをします。
http://[グローバルIP]:[ポート番号]/

160118_docker_wp2

 

言語設定画面が表示されるので、WordPressの基本情報を入力し、インストール完了になります。


6.Dockerfileの有効利用方法

Dockerfileを使用すると、イメージの作成を自動化することができます。作業の効率化を図ることにも使えますが、実行手順が記載されているため、メンバーへの内容共有にも使用することができます。今回のWordPressコンテナイメージの作成もDockerfileを使用すると安易に行うことができます。以下は、WordPress用のコンテナ作成の手順例となります。

6-1. Dockerfileの作成

Dockerfile

FROM centos:centos6
MAINTAINER Uchida

# apache install
RUN yum -y install httpd \
&& sed -i -e 's/\#ServerName www.example.com:80/ServerName docker.example.com/g' /etc/httpd/conf/httpd.conf \
&& chkconfig httpd on

# php install
RUN yum -y install php php-mbstring php-mysql \
&& echo "<?php echo 'docker test php'; ?>" >> /var/www/html/index.php

CMD /etc/init.d/httpd start

イメージ作成に必要な情報を記載し"Dockerfile"として、保存をします。

FROM イメージ名の指定
MAINTAINER 作者名
RUN イメージ作成時に実行されるコマンド
CMD コンテナ起動時に実行されるコマンド

そのほかにも

ADD ファイル・ディレクトリの追加
ENV 環境変数の設定
WORKDIR 作業ディレクトリの指定
EXPOSE コンテンツ内部で開放されるポートの指定

など多数の命令が用意されています。

6-2. dockerfileの実行

$ sudo docker build -t centos:dockerfile .

buildコマンドを使用することで、Dockerfileを実行することができます。また-t オプション を コンテナ名:タグ名称 と記述することで、コンテナの名称を付けることができます。

このとき、Dockerfileと同じワークスペースで実行する必要があります。

REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
Centos dockerfile 0ba9ec621aff About an hour ago 335.7 MB

RUNに記述された命令を実行後、イメージが作成されます。

コンテナの作成

$ sudo docker run --name dockertest -it centos:dockerfile
Starting httpd: [ OK ]

作成されたイメージからコンテナを作成します。 それと同時に、CMDに記載された命令が実行されます。

Dockerは2013年3月に初版がリリースされ、比較的新しい技術でありながら、既に、その有効性は多数の企業から支持されています。今でも2014年に始まったDockerHub(GitHubのコンテナ版のようなサービス)と呼ばれる、コンテナのクラウドプラットフォームには、既に多数のコンテナが共有されています。

まだまだ成長率は高く、成熟して行くにはまだ時間が掛かるのかと思いますが、GitやDeployと併せて、”使える”技術である事は間違いがなく、今後、よりスタンダードとなっていくのかと思います。

記事は、一部の基本的な使用方法でありますが、Dockerへのきっかけとなって頂ければ幸いです。

この記事を書いた人

株式会社プラスディー 内田憲

2008年11 月、株式会社プラスディーに参画。同年12月、旧株式会社プラスディーにて取
締役就任。
同社でDB構築から、WEB、プログラミングシステムなど構築全般に従事し、
Yahoo!、日本コカ・コーラ、小学館などに貢献。
電話回線を7回線契約など、新しいものを触らずにはいられない性格。

プラスディー(新しいエンジニア仲間も募集しています。)
https://plus-d.co.jp/

ガジェットに興味ある方は
http://gadget-dan.com/

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

アカデミー用バナー

メルマガ会員募集中!

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

メルマガ登録はこちら