WordPressでサイトの運用をしている場合、頻繁にアップデートのお知らせが届くことがあるかと思います。このとき、アップデート自体は安易なため行った方が良いとは感じつつも、実際に運用中のサイトに対してアップデートを行う場合、検証もリスクも大きいではないでしょうか。
また新規にWordPressのサイトを構築する場合、プラグインを試すのにわざわざ同等のその動作環境を作るのには工数が掛かります。また作成ができたとしても汎用性が低いものになってしまうかと思います。そのような際に、Dockerを使用すると、OSやバージョン違いの環境作成などの検証環境が容易に作成できるようになります。
今回は、GMOクラウド ALTUS Basicシリーズを使用して、Docker環境を構築、WordPressのインストールを行いたいと思います。
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用コンテナイメージの作成
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]:[ポート番号]/
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]:[ポート番号]/
言語設定画面が表示されるので、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へのきっかけとなって頂ければ幸いです。