DockerでWordpressの環境を作ることになったのですが、イメージを使わずに立てるまでに結構手こずったので備忘録として残そうと思います。
あくまでも自分の記録なので、もっと簡単にできるよとか間違ってるよとかあるかもしれません。
#環境
- Mac Mojave 10.14.6
- docker desktop 2.3.0.3
#最終的な目的
##実現したい条件
- nginx+php+mysqlの環境
- http://localhost:8080 にアクセスしてwordpressの管理画面にアクセスできる
- データベースを永続化(コンテナを削除してもデータベースの中身が消えない)
##各コンテナのバージョン
- nginx 1.12.2
- php 7.2
- mysql 5.6
- wordpress 5.4.2
##ファイル構成
├── docker-compose.yml
├── nginx
│ └── default.conf
├── php
│ └── Dockerfile
└── www
└── html
└── [wordpressのファイル]
#手順
1.nginx+php環境を構築
2.mysqlを追加
3.wordpressを追加、設定
##1.nginx+php環境を構築
各コンテナを作成するためのファイルを作成します。
最初に構築するファイルは次の通りです。
├── docker-compose.yml
├── nginx
│ └── default.conf
├── php
│ └── Dockerfile
└── www
└── html
└── index.php
###docker-compose.yml
version: '3'
services:
nginx:
image: nginx:1.12.2
ports:
- 8080:80
volumes:
- ./www/html:/var/www/html
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
php:
build: ./php
volumes:
- ./www/html:/var/www/html
###nginx/default.conf
http://localhost:8080 にアクセスしたときに、index.phpも表示されるように記述を追加します。
server {
listen 80;
server_name localhost;
root /var/www/html;
# ここにindex.phpを追加
index index.html index.htm index.php;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# phpが動くようにコメントアウトを外す
location ~ \.php$ {
root /var/www/html;
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_intercept_errors on;
}
}
###php/Dockerfile
docker-compose.yml
に直接imageで指定しても良いのですが、後ほどmysql追加の際に記述を追加するため、Dockerfileを作成しています。
FROM php:7.2-fpm
###www/html/index.php
<?php
phpinfo();
###コンテナ起動
cdコマンドで作業ディレクトリに移動し、以下のコマンドを使用します
// docker-compose.ymlで記述したコンテナをインストール
$ docker-compose up -d
// コンテナが作成・起動しているか確認(-aをつけることで起動していないコンテナも表示可能)
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0aed3ada6a01 docker_wp_php "docker-php-entrypoi…" 19 seconds ago Up 17 seconds 9000/tcp task4_wp
b698e1032798 nginx:1.12.2 "nginx -g 'daemon of…" 19 seconds ago Up 17 seconds 0.0.0.0:8080->80/tcp docker_wp_nginx_1
http://localhost:8080 にアクセスしてphpinfoが表示されていれば成功です。
##2.mysqlを追加
ファイル構成に追加・変更はありませんが、mysql追加にあたってphp/Dockerfile
とdocker-compose.yml
に記述の追加があります。
###php/Dockerfile
FROM php:7.2-fpm
// 以下2行を追加
RUN apt-get update
RUN docker-php-ext-install pdo_mysql mysqli
###docker-compose.yml
version: '3'
services:
nginx:
image: nginx:1.12.2
ports:
- 8080:80
volumes:
- ./www/html:/var/www/html
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
php:
build: ./php
container_name: "task4_wp"
volumes:
- ./www/html:/var/www/html
// 以下mysqlの記述を追加
db:
image: mysql:5.6
ports:
- 3306:3306
environment:
MYSQL_DATABASE: wordpress
MYSQL_ROOT_PASSWORD: root
MYSQL_USER: user
MYSQL_PASSWORD: password
volumes:
- wp_db:/var/lib/mysql
volumes:
wp_db:
MYSQL_USER
とMYSQL_PASSWORD
は後ほどmysqlにログインするときに使うユーザーを設定しています。
MYSQL_DATABASE
はwordpressを入れたときに使うデータベースです。
また、データベースの中身はwww/html
のようにマウントするのではなく、volumeとしてファイル外に置いています。
###コンテナを再起動
// さっき作成したコンテナを停止、削除
$ docker-compose down
// docker-compose.ymlで記述したコンテナを起動
$ docker-compose up -d
// コンテナが作成・起動しているか確認
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9e9d13e9441f nginx:1.12.2 "nginx -g 'daemon of…" 3 minutes ago Up 3 minutes 0.0.0.0:8080->80/tcp docker_wp_nginx_1
19451d8dfd82 docker_wp_php "docker-php-entrypoi…" 3 minutes ago Up 3 minutes 9000/tcp docker_wp_php_1
7f37f92bed6a mysql:5.6 "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 0.0.0.0:3306->3306/tcp docker_wp_db_1
http://localhost:8080 にアクセスすると、さっきと同じようにphpinfoが表示されていると思います。
表面上は変わりませんが、STATUSがUPになっていたら起動成功です。
##3.wordpressを追加、設定
最後にwordpressを入れます。
wordpressは以下のページからダウンロードできます。
https://ja.wordpress.org/download/
/www/html/index.php
は削除してから、解凍してwordpress/
の中身をコピーして、www/html/
にコピーします。
###ファイル構成
├── docker-compose.yml
├── nginx
│ └── default.conf
├── php
│ └── Dockerfile
└── www
└── html
└── [wordpressのファイル]
http://localhost:8080 にアクセスすると、以下のような画面になります。
データベースの登録。
インストール。
サイトの情報と管理者のユーザー情報を入力。
ログインユーザーを登録したので、ログイン。
#ひっかかったところ
####volumesの理解
今回書いたコードにもコンテナ内外の両方に記述があります。
内部のvolumesはコンテナとローカルでファイルを共有するのためだと理解していたのですが、外部の方は記述の仕方も少し違っていますし、そもそもフォルダの位置指定されてなくない?マウントのためじゃないのか……?と疑問に思いつつも、使わないならいいかと放置していました。反省。
こちらの記事が分かりやすかったです。
Docker、ボリューム(Volume)について真面目に調べた
#よく使ったコマンド
$ docker-compose up -d
// 今いるフォルダ直下にあるdocker-compose.ymlをバックグラウンドで実行
$ docker-compose stop
// docker-compose.ymlに書いてあるコンテナを停止する
$ docker-compose start
// コンテナを起動する
$ docker-compose down
// コンテナの停止→削除
$ docker-compose down --rmi all -v
// docker-compose.ymlに記述のあるコンテナ、イメージ、作ったボリュームまで全部消える
$ docker exec -it [コンテナID] /bin/bash
// コンテナにログイン(コンテナIDは`docker ps`で確認できる)
$ docker ps
// 起動中のコンテナを一覧で表示
$ docker ps -a
// 起動してないコンテナも含めて全部表示
$ docker images
// イメージを一覧で表示
$ docker rm [コンテナID]
// コンテナを削除する。稼働中のコンテナを削除しようとするとエラーが出る
$ docker rm [コンテナID] -f
// コンテナを削除する。動いていても強制的に削除する
$ docker rmi [イメージID]
// イメージを削除する。コンテナがあるとエラーが出る
$ docker rmi [イメージID] -f
// イメージを削除する。コンテナがあっても強制的に削除する