現代の千利休を求めて

ゲームプログラマーのブログ

MENU

【Docker】Docker-ComposeでWordPressを簡単構築

どうも千利休です。
Docker-composeと行って複数のコンテナを管理できる機能があったりします。
今回はそちらを使ってWordPressサイトを簡単構築してみましょう。

docker-composeとは?

dockerでのコンテナは1コンテナに1役割というのがおすすめされています。
そうすると必然的にDBはこのコンテナ、WEBはこのコンテナと分かれてくるわけですね。
それらをいちいちコマンドで構築するのは面倒くさい。
そこでレシピをあらかじめ作っといて自動化しちゃおう!というのがdocker-composeなのです。

wordpressを簡単構築

基本的には*.ymlというデータがあるだけで問題ないです。
このymlというのにどのようにコンテナを起動して行くのかというレシピを書いていきます。
必要な設定ファイルを外部に切り出すというのも可能なのでそちらも後ほど説明しますが、まずは手軽にwordpressサイトを構築してみましょう。

適当なフォルダを作って (筆者はdocker-wordpressというフォルダ) docker-compose.yml
というファイル名で下記の内容をコピペしてみてください。

version: "2"
services:
    wordpress:
        image: wordpress:latest
        ports:
            - "9000:80"
        depends_on:
            - db
        environment:
            WORDPRESS_DB_HOST: "db:3306"
            WORDPRESS_DB_NAME: "wordpress"
            WORDPRESS_DB_USER: "wp_user"
            WORDPRESS_DB_PASSWORD: "hogehoge"
        volumes:
            - ./volumes/wordpress:/var/www/html/
    db:
        image: mysql:latest
        environment:
            MYSQL_RANDOM_ROOT_PASSWORD: "yes"
            MYSQL_DATABASE: "wordpress"
            MYSQL_USER: "wp_user"
            MYSQL_PASSWORD: "hogehoge"
        volumes:
            - ./db-data:/var/lib/mysql
 
# 永続データとしてマウント
volumes:
    db-data:
        driver: local
    volumes:
        driver: local

これで下準備は完了です。
新しく作ったフォルダに移動します。 このような状態のはずです。

$ ls
docker-compose.ym

この状態で

 docker-compose up -d

コマンドを実行します。
-dオプションはバックグラウンド起動のオプションです。

初回作成だと長いですが、2回目からだと早くなりますのでしばらくお待ちください。
コマンド終了後、

http://localhost:9000/

こちらにアクセスするとなんとWordPressに初期サイトが作成されています!
素晴らしいですね。

コマンドでも見てみましょう。
しっかりと二つのコンテナが起動していますね。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
e060c320237c        wordpress:latest    "docker-entrypoint..."   17 minutes ago      Up 17 minutes       0.0.0.0:9000->80/tcp   dockerrikyuwordpress_wordpress_1
e812181c3762        mysql:latest        "docker-entrypoint..."   17 minutes ago      Up 17 minutes       3306/tcp               dockerrikyuwordpress_db_1

ボリュームとは?

今回はDBとwordpressのファイルを永続データとてボリュームを作成しました。

version: "2"
services:
    wordpress:
       ・・・
        volumes:
            - ./volumes/wordpress:/var/www/html/
    db:
  ・・・
        volumes:
            - ./db-data:/var/lib/mysql
 
# 永続データとしてマウント
volumes:
    db-data:
        driver: local
    volumes:
        driver: local

この「volumes」のところがそれになります。
今回はwordpressの設定ファイルとDBです。
実際にymlファイルがあるフォルダをみてみるとわかるかと思います。

$ ls
db-data         docker-compose.yml  volumes

db-dataとvolumesになっているかと思います。
実際にvolumesの下にはwordpressの設定ファイルがあってこちらを弄るとコンテナのwordpressもこちらを参照するのでサイトに反映されます。

コンテナは削除されるとデータは消失しますが、ボリュームとして外に出しておくとコンテナが削除されてもデータが消えませんので安心です。
またターミナルで作業をせずに好きなクライアントで作業ができるのも楽ですね。

ymlでのボリューム指定は下記です。
volumes:の下がが実際のボリュームの指定で、複数個指定することもできます。

volumes:
            # - "クライアントのフォルダ":"コンテナ内のフォルダ"
            - ./volumes/wordpress:/var/www/html/

またコマンドでも現在使用されているボリュームを調べられます。

$ docker volume ls
DRIVER              VOLUME NAME
local               dockerrikyuwordpress_db-data
local               dockerrikyuwordpress_volumes

設定ファイルを外だしする

ymlにこのような記述がありました。

・・・
        environment:
            WORDPRESS_DB_HOST: "db:3306"
            WORDPRESS_DB_NAME: "wordpress"
            WORDPRESS_DB_USER: "wp_user"
            WORDPRESS_DB_PASSWORD: "hogehoge"

パスワードなどここに書いとくのはあまり得策だとは言えません。
個々人の設定に任せるのがいいですね、そのためにここは可変的に変えられるように設定を外だししときましょう。
ymlファイルと一緒の箇所に
「.env」ファイルを作成します。 その中に先ほどの設定を外出ししましょう。

WORDPRESS_DB_NAME=wordpress
WORDPRESS_DB_USER=wp_user
WORDPRESS_DB_PASSWORD=hogehoge
 
MYSQL_RANDOM_ROOT_PASSWORD=yes
MYSQL_DATABASE=wordpress
MYSQL_USER=wp_user
MYSQL_PASSWORD=hogehoge

これで保存、外だししたのでymlファイルも書き換えます。

version: "2"
services:
    wordpress:
        image: wordpress:latest
        ports:
            - "9000:80"
        depends_on:
            - db
        environment:
            WORDPRESS_DB_HOST: "db:3306"
        env_file: .env
        volumes:
            - ./volumes/wordpress:/var/www/html/
    db:
        image: mysql:latest
        env_file: .env
        volumes:
            - ./db-data:/var/lib/mysql
 
volumes:
    db-data:
        driver: local
    volumes:
        driver: local
env_file: .env

これが外だしした設定を読み込んでいる部分になります。
これで個々人のパスワードなどは勝手に決められますね!

今回使ったコマンド

起動

docker-compose up -d

中断

docker-compose down

中断からの復帰

docker-compose start

コンテナ・ボリュームなど完全削除(ローカルからは消えない)

docker-compose -v

ボリューム一覧

docker volume ls

全てのボリュームを削除(危険だよ!)

$ docker volume rm $(docker volume ls -qf dangling=true)

まとめ

いかがだったでしょうか。
dockerのいいところはスクラップ&ビルドがしやすい点だと思います。
またコンテナの一括作成もdocker-composeのおかげでだいぶ楽になったのではないでしょうか。
まだまだ初心者なので間違っていたら教えていただけると幸いです。

参考サイト
https://tech.recruit-mp.co.jp/infrastructure/post-11266/
http://qiita.com/Ikumi/items/b319a12d7e2c9f7b904d