docker for macでwordpress+mysqlな環境を構築する

手持ちの mac book で ownCloud や wordpress の ローカル開発環境を構築したい。

virtual box 環境でもいいんだけど、使い捨てにできるコンテナを使いたいので、勉強もかねて未だによく分かっていない docker を使ってみることにした。

これでお仕事もドッカンドッカン進むようになるはず。
ドッカーなだけに。

※この記事は進捗があり次第、随時アップデートされていく形式です。

前提条件

  • docker イメージは各公式のイメージを使う
  • データの永続化もできるようにする

docker for mac のインストール

・Docker for Macを使い始める
https://docs.docker.com/docker-for-mac/

docker for mac や、docker for windows をインストールすると、Virtual box は動かなくなるので注意が必要みたいです。

Virtual box と共存させたい場合や、要件を満たしていない古いPCの場合には、Docker Toolbox というのがあるので、そちらを入れればよいみたい。

公式イメージの取得

MySQL と WordPress の docker image を各公式のリポジトリから取得

▽Wordpressのリポジトリ
https://hub.docker.com/_/wordpress/

▽MySQLのリポジトリ
https://hub.docker.com/_/mysql/

・wordpressの dockerイメージ取得

$ docker pull wordpress

・mysqlの dockerイメージ取得

$ docker pull mysql:5.7.22

MySQLのイメージについては、最新版(latest)の8系を入れたところ、Wordpressからのリンク時に、下記の接続エラーが出てしまい、コンテナが停止してしまうので、5.7系の最新版を使用している。

Warning: mysqli::__construct(): The server requested authentication method unknown to the client [caching_sha2_password] in Standard input code on line 22
Warning: mysqli::__construct(): (HY000/2054): The server requested authentication method unknown to the client in Standard input code on line 22
MySQL Connection Error: (2054) The server requested authentication method unknown to the client

$ docker logs コンテナ名 でエラーの確認が可能。

古い認証方式に対応していないというエラーのようだが、MySQLコンテナ側の修正方法(vi がなくて設定ファイルの編集方法がわからなかった)が分からないので、ひとまずMySQL5.7系を使うことで回避した。

ダウンロードしたイメージは、docker images コマンドで確認できる。

$ docker images
REPOSITORY    TAG        IMAGE ID         CREATED          SIZE
mysql         5.7.22     6bb891430fb6     32 hours ago     372MB
wordpress     latest     1d3cc82944da     4 weeks ago      408MB

コンテナの作成

ダウンロードしたイメージを使用して、コンテナを作成する

–name: 立ち上げるコンテナの名前
-d: コンテナをバックグラウンドで立ち上げる
-e: コンテナの環境変数を設定
–link: 他のコンテナへのリンク
-p: コンテナのポートを指定(ホスト:コンテナ)
-v: ボリュームをマウントする

・MySQLコンテナの作成

$ docker run --name mysite_db -d \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=mysite \
-v `pwd`/mysite_db:/var/lib/mysql \
mysql:5.7.22

コマンドの意味はそれぞれ次の意味

–name mysite_db: mysite_db というコンテナ名で起動する
MYSQL_ROOT_PASSWORD=password: MySQLのrootパスワード
MYSQL_DATABASE=mysite: wordpress用のDBを作成
`pwd`/mysite_db:/var/lib/mysql: データの永続化(後述)
mysql:5.7.22: 起動元のdockerイメージ

・Wordpressコンテナの作成

$ docker run --name mysite -d \
--link mysite_db:mysql \
-p 80:80 \
-v `pwd`/wordpress:/var/www/html \
-e WORDPRESS_DB_PASSWORD=password \
-e WORDPRESS_DB_NAME=mysite \
wordpress

コマンドの意味はそれぞれ次の意味(差分のみ)

–link mysite_db:mysql: MySQLコンテナへのリンク
80:80: 左辺はローカルのポート : 右辺はコンテナ側のポート
`pwd`/wordpress:/var/www/html: データの永続化(後述)WORDPRESS_DB_PASSWORD=password: MySQLコンテナで設定したPW
WORDPRESS_DB_NAME=mysite: MySQLコンテナで作成したDB名

-v `pwd`/mysite_db:/var/lib/mysql と起動時にオプションを指定することで、コンテナ内の /var/lib/mysql に、ローカルPCのカレントディレクトリをマウントすることができ、データベースなどの必要な情報をローカル環境に保持しておくことができる。

$ ls -la
total 0
drwxr-xr-x 4 devi staff 128 7 28 17:59 .
drwxr-xr-x+ 29 devi staff 928 7 5 13:52 ..
drwxr-xr-x@ 20 devi staff 640 7 28 17:54 mysite_db
drwxr-xr-x@ 23 devi staff 736 7 28 18:08 wordpress

そしてコンテナの起動時に毎回このディレクトリをマウントすることで、継続的なデータの利用が可能だ。

起動したコンテナは docker ps コマンドで確認できる

$ docker ps -a
CONTAINER ID    IMAGE          COMMAND                  CREATED             STATUS              PORTS                NAMES
6144f5293bde    wordpress      "docker-entrypoint.s…"   About an hour ago   Up About an hour    0.0.0.0:80->80/tcp   mysite
ccf197a09a9e    mysql:5.7.22   "docker-entrypoint.s…"   About an hour ago   Up About an hour    3306/tcp             mysite_d

コンテナが起動したら、ローカルPCのブラウザで、localhost:80(指定したポート番号)などと打ち込んで、Wordpress の初期設定画面が表示されればOK

docker image wordpress

今後の野望

  • ローカルPC側の /wordpress をIDEで開けるようにして、テーマの編集をしたり、結果を即座に確認できるようにしたい
  • ローカルPC側の /wordpress をGit管理できるようにしたい
  • docker-compose を使用してコンテナの管理を簡素化したい
  • WordPressのバージョンを自由に変えて検証できるようにしたい(これは使うコンテナイメージを変える必要がある?)