Dockerをインストールして、WordPress環境を構築したときの備忘録用のメモになります。
Virtual Boxのホスト環境のOSはWindows10になります。
環境はVirtual BoxにUbuntu 18.04のserver版を仮想マシンとして利用します。
Virtual Boxの仮想マシンのシステム設定は、とりあえずの設定としてRAM:2G、CPU:2コアに、ネットワーク設定はNATとホストオンリーアダプターにします。
目標として、DockerでWeb3層構造を構築します。そのため、WordPress環境に加えて、Nginxも導入し、ホストPCからNginxからリバースプロキシでローカルに構築したWordPress環境にアクセスすることにします。
目次
DockerとDocker Composeのインストール
DockerドキュメントのUbuntuでのインストール方法を参考に、Dockerをインストールします。また、Dockerでのコンテナ作成を楽にするためにDocker Composeもインストールします。インストールコマンドを入力するのが面倒なのでインストール手順を簡単なシェルスクリプトに記述します。
docker-install.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#/bin/bash set -x sudo apt-get remove docker docker-engine docker.io containerd runc -y sudo apt-get update -y sudo apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io sudo docker run hello-world sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose |
DockerでのNginx+WordPress環境の構築準備
Docker Composeを利用するために、複数のコンテナの定義を記述するyamlファイルを作成します。基本的にはDocker HubにあるNginxやWordpressにあるyamlファイルを参考に記述します。
ここでのポート設定はdockerのホストの80,3306,45678番ポートを使用しています。
80番はNginx、3306番はMySQL、45678番がWordPressになります。
docker-compose.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
version: '3' services: db: image: mysql:5.7 restart: always volumes: - ./mysql/mysql-datavolume:/var/lib/mysql ports: - 3306:3306 env_file: db_env webapp: image: wordpress:latest restart: always volumes: - ./wordpress:/var/www/html ports: - 45678:80 env_file: webapp_env nginx: image: nginx restart: always volumes: - ./nginx/templates:/etc/nginx/templates - ./nginx/conf.d:/etc/nginx/conf.d ports: - 80:80 env_file: nginx_env |
環境変数について
コンテナ作成時に利用する環境変数は、env_fileで記述してファイルから読み込むことにします。環境変数を設定したファイルは、テスト環境なので一つのファイルにして同じファイルを読み込んでもいいですが、ここでは分けて記述することにします。
db_env
1 2 3 4 |
MYSQL_ROOT_PASSWORD=somewordpress MYSQL_DATABASE=wordpress MYSQL_USER=wordpress MYSQL_PASSWORD=wordpress |
webapp_env
1 2 3 4 |
WORDPRESS_DB_HOST=db WORDPRESS_DB_USER=wordpress WORDPRESS_DB_PASSWORD=wordpress WORDPRESS_DB_NAME=wordpress |
nginx_env
1 |
NGINX_PROXY_URL=http://webapp |
環境変数内のホストやURLで使用しているdbやwebappは、Docker Composeがコンテナを作成するときに、名前解決できるようになります。Docker Composeは自動的にネットワークを作成して、dbやwebappなどのservices下のキーの名前でコンテナのIPアドレスを返すように設定します。
また、この通信はコンテナ間の通信であることも注意が必要かもしれません。例えば、webappではホスト側のポートは45678ですが、コンテナ側のポートは80番になっています。なので、プロキシを行うURLは、http://webapp:45678ではなく、http://webapp:80になります。http通信はデフォルトでは80番なのでhttp://webappで十分になります。
ホスト側のポートを利用したい場合は、http://<ホストのIPアドレス>:45678のように設定を行うことができます。
ボリュームについて
永続化させたいデータは、volumesに記述し対応付けをしてマウントします。
dockerのホストのディレクトリ:コンテナのディレクトリ のように記述します。
./mysql/mysql-datavolume:/var/lib/mysql や
./wordpress:/var/www/html がその例になります
また、あらかじめ記述した設定ファイルを読み取りたい場合もマウントを行います。
./nginx/templates:/etc/nginx/templates や
./nginx/conf.d:/etc/nginx/conf.d がその例になります。
Nginxの設定ファイル
Nginxについて、Dockerで起動させる場合は/etc/nginx/templatesの中に設定ファイルのテンプレートファイルがあると、環境変数を利用して書き換えを行って/etc/nginx/conf.dの中にその設定ファイルを入れてくれます。書き換えた設定ファイルを入れる際にディレクトリに実行ユーザの書き込み権限がないとだめらしいので、/etc/nginx/conf.dもマウントしています。
Nginxのテンプレートファイルは以下のようにしています。
./nginx/templates/rproxy.conf.template
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
server { listen 80; server_name localhost; location / { proxy_pass ${NGINX_PROXY_URL}; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } |
DockerのNginxのデフォルトの設定ファイルを取り出したい場合は以下のコマンドでイメージの中の設定ファイルをコピーできます。
1 2 3 |
docker run --name tmp-nginx-container -d nginx docker cp tmp-nginx-container:/etc/nginx/nginx.conf ./nginx/ docker rm -f tmp-nginx-container |
DockerでNginx+WordPress環境の構築
docker-composeコマンドを実行する前のディレクトリ構造は以下のようになります。また、docker-install.shは最初にdockerをインストールしたシェルスクリプトなので、コンテナの作成には関係ありません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ tree -ifF . ./db_env ./docker-compose.yaml ./docker-install.sh* ./mysql/ ./mysql/mysql-datavolume/ ./nginx/ ./nginx/conf.d/ ./nginx/templates/ ./nginx/templates/rproxy.conf.template ./nginx_env ./webapp_env ./wordpress/ 6 directories, 6 files |
このカレントディレクトリで、docker-composeコマンドを実行して環境を構築します。
1 |
docker-compose up -d |
docker-composeコマンドを行ったら、imageがダウンロードされます。このダウンロードについて、ダウンロードの失敗が多い場合は、Dockerのホストマシンで/etc/docker/daemon.jsonを作成して、max-concurrent-downloads(デフォルトでは3)を1にして、
/etc/docker/daemon.json
1 2 3 |
{ "max-concurrent-downloads": 1 } |
dockerを起動し直すことでダウンロードの失敗を減らせるかもしれません。
1 |
$ sudo systemctl restart docker |
構築して立ち上がったら、Virtual Boxのホストから、Ubuntu仮想マシンのホストオンリーアダプターのIPアドレス(http://<ホストオンリーアダプターのIPアドレス>)にアクセスすると
WordPressのインストール画面が表示されます。さらに進むと
サイトのタイトルとユーザ名を入力できる画面に進みます。ここでデータベースの設定画面が表示されるとデータベースやWordPressの環境変数の設定がうまくいっていない可能性があるので注意が必要です。
これで、ローカルに構築したWordPress環境にアクセスできたので、DockerでのNginx+WordPress環境の構築は終わりになります。
また、コンテナを削除したい場合は
1 |
docker-compose down |
が利用できます。
参考リンク
Install Docker Engine on Ubuntu | Docker Documentation
wordpress - Docker Hub
nginx - Docker Hub