これまでWordPressの仮想環境としてVagrant上で動作するVCCWを使用してきましたが、動作が重い状況を改善することが出来ずストレスが溜まる為、Local by Flywheelに乗り換えました。
Local by Flywheelでの環境構築は非常に簡単で動作も軽くて満足していましたが、前から気になっていながらも未だ試していなかった”Docker上でWordPressを構築する方法”について、今回試してみました。
結論を言うと、若干コマンド操作の必要はあれど、動作はLocal by Flywheelよりも軽かったです。
CPU仮想化の有効化
BIOS設定画面から有効にします。環境によって操作や表記が異なる為、ここでの説明は割愛します。
Dockerの導入
OSはWindows 10 Homeです。Windows用のDocker for Windowsは、Pro版やEnterprise版などHyper-Vが使える環境でなければ利用出来ない為、Virtual Box上で動作するDocker Tool Boxを利用します。
Docker Tool Box(Virtual BoxおよびGit for windowsを同梱)
インストール終了後、Docker Quickstart Terminalを起動し、クジラの絵が出てきたら準備完了です。
WordPressの構築
とりあえず動くWordPressが一時的に用意出来ればよいということであれば非常に簡単です。やることは、MySQLおよびWordPressのイメージの取得と、コンテナの生成です。
$ docker pull mysql:5.7.25
$ docker run –name mysql –network wordpress-network -e MYSQL_ROOT_PASSWORD=password -d mysql:5.7.25
$ docker run –name wordpress –network wordpress-network -e WORDPRESS_DB_PASSWORD=password -p 8080:80 -d wordpress
pullでイメージを取得する際に、バージョンを指定しなければ最新版が選択されるようですが、これによってMySQLがバージョン8系がダウンロードされると、WordPressへの初回アクセス時にデータベース接続エラーが発生します。これを回避する為にMySQLのバージョンを指定しています。
MySQLとWordPressのコンテナ間通信を実現する為、同じネットワークに所属させています。参考文献によっては”–link”で紐づけている例がありましたが、これは現在レガシーなやり方ということで、”–network”を使ったやり方に変更しています。
なお、docker composerを使うと、このような長ったらしい連続のコマンド打ち込みから解放されます。それについては参考文献が沢山ありますので、ここでの説明は省きます。
Windowsとのフォルダ共有、データ永続化
仮想環境で構築するにしても、ホストOS(ここではWindows)からファイルにアクセス出来たら楽ですよね。お気に入りのエディタでテーマファイルを編集したり、Gitクライアントでバージョン管理したり…等です。これを実現するにはVirtual Boxの共有機能を利用します。
標準では”C:\Users”以下が共有出来るようになっているようですが、別の場所を利用したいこともあります。ここでは”D:\work\docker”と共有する例で説明します。
Virtul Boxの設定を終えてからDockerを実行し、下記コマンドでコンテナを生成します。
このコマンドを実行するとWindowsのローカルディレクトリにファイルが追加され、Windows上からアクセス出来るようになります。
通常、dockerのコンテナは、停止すると起動後の変化は破棄される(データが残らない)ので、データを残しておくには”ボリューム”を使うといった方法があります。上記ではフォルダ共有を行っているディレクトリをボリュームとして指定することにより、データを永続化させています。
なお、WordPressはMySQLにデータを保存しますので、こちらも残しておきたいですね。そこで同じくボリュームを指定してコンテナを生成します。また、ここでは先にボリューム作ってから指定する方法で実行しています。
$ docker run –name mysql -v wpdb:/var/lib/mysql –network wordpress-network -e MYSQL_ROOT_PASSWORD=password -d mysql:5.7.25
その他補足
docker runで生成したコンテナは削除しない限り無くならないので毎回runしているとコンテナが増えていってしまうので、初回以降はdocker startで起動するようにします。
個人的に今後やりたいこと
- docker上のWordPressをリモートデバッグする
おまけ:コマンド色々メモ
仮想マシンの再起動
docker-machine reboot
仮想マシンのシャットダウン
docker-machine stop
イメージ取得
docker pull [イメージ名] ※バージョン指定しないと最新版をDL
イメージ一覧
docker images
イメージ削除
docker rmi [IMAGE ID]
docker image prune -a ※使用していないものを一括削除
docker rmi $(docker images -q) ※すべてのコンテナを削除する
コンテナ一覧(停止・起動中など全ての状態のコンテナ)
docker ps -a
コンテナ起動
docker start [CONTAINER ID]or[NAME]
コンテナ停止
docker kill [CONTAINER ID]or[NAME]
docker stop [CONTAINER ID]or[NAME]
docker stop $(docker ps -q) ※すべてのコンテナを停止する
コンテナ削除
docker rm [CONTAINER ID]
docker container prune ※使用していないものを一括削除
docker rm $(docker ps -q -a) ※全コンテナ削除
ネットワーク一覧
docker network ls
ネットワーク作成
docker network create [ネットワーク名]
ネットワーク削除
docker network rm [NETWORK ID]or[NAME]
ボリューム一覧
docker volume ls
ボリューム詳細
docker inspect [VOLUME NAME]
ボリューム作成
docker volume create [ボリューム名]
ボリューム削除
docker volume rm [VOLUME NAME]
docker volume prune ※使用していないものを一括削除
docker volume rm $(docker volume ls -qf dangling=true) ※全ボリューム削除
Docker machine一覧
docker-machine ls
コンテナに入る
docker exec -it [CONTAINER NAME] bash
コンテナを抜ける
exitやCtrl+z
※上記だとコンテナが終了するので”Ctrl+p”か”Ctrl+q”を使えとのことだったが、それだと抜けられず…?