ローカル開発環境

 本サイト運用にあたり、稼働の確認やデータのバックアップ等で用いるローカル開発環境としているもののまとめ。

基本的な考え

  • 単なる備忘録サイトなので自分しか見ないが、ローカルにバックアップは持っておきたい。
  • バックアップに異常がないかを確認するため、直ぐにそれをローカルに反映したい。
  • プラグインを自己開発するときは、ひとまずローカルで確認したい。
  • ローカル環境を簡単に再構築できるようにしたい。
  • PCの環境はあまり汚したくない。領域サイズも少ない方がいい。
  • 仕事で使用する Hyper-V、WSL2、Docker Desktop とは可能な限り分離したい。

こうする

  • WSL2+Docker Desktopを使用。
  • WSL2ホストには、Alpineを用いて仮想ドライブサイズを極力減らす。
  • WEBサーバには、Nginx を用いて軽量化する。
  • DBサーバには、MariaDBを用いて軽量化する。
  • バックアップはWordPressのプラグイン「All-in-One WP Migration」を用いる。

構築方法

 以下の手順で構築する。

Alpine WSL パッケージのインストール

 Windows Store で提供されている Alpine WSL パッケージをWindowsにインストールする。

https://dev.tasys.jp/docker-desktop/alpine-host/

Alpine ディストロをクローンする

 Alpineディストロをtarファイルにバックアップし、それを別名のディストロとしてインポートする。
ここで出来たAlpineのクローンをローカル開発環境専用ディストロとして使用する。

https://dev.tasys.jp/wsl2/wsl2-backup-restore/

ローカル開発環境専用ディストロ内でDocker仮想環境を構築する

 ローカル開発環境専用ディストロにログインし、以下の4ファイルを同一ディレクトリに作成する。
作成後に、docker compose up -d すれば出来上がり。

docker-compose.yml

version: '3.9'

services:

  web:
    image: nginx:stable-alpine
    container_name: dev-tasys-jp-web
    depends_on:
      - wp
    ports:
      - "8000:80"
    env_file: project.env
    restart: always
    volumes:
      - ./html:/var/www/html
      - ./nginx.conf:/etc/nginx/nginx.conf

  wp:
    image: wordpress:6-php7.4-fpm-alpine
    container_name: dev-tasys-jp-wp
    depends_on:
      - db
    env_file: project.env
    restart: always
    volumes:
      - ./html:/var/www/html
      - ./php.ini:/usr/local/etc/php/php.ini

  db:
    image: yobasystems/alpine-mariadb
    container_name: dev-tasys-jp-db
    env_file: project.env
    expose:
      - "3306:3306"
    restart: always
    volumes:
      - ./mysql:/var/lib/mysql

nginx.conf

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    client_max_body_size 1g;

    server { 
        listen 80; 
        server_name localhost; 
        root /var/www/html; 

        index index.php; 

        location / {
            try_files $uri $uri/ /index.php?$args;
        }

        rewrite /wp-admin$ $scheme://$host$uri/ permanent;

        location ~ [^/]\.php(/|$) { 
            fastcgi_split_path_info ^(.+?\.php)(/.*)$;
            if (!-f $document_root$fastcgi_script_name) {
            return 404;
            }

            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO       $fastcgi_path_info;
            fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;

            fastcgi_pass   wp:9000;
            fastcgi_index  index.php; 
        } 
    }
}

php.ini

post_max_size = 1G
upload_max_filesize = 1G
memory_limit = 1024M
[xdebug]
xdebug.client_host=host.docker.internal
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.discover_client_host = 0
xdebug.remote_handler = "dbgp"
xdebug.client_port=9003

project.env

MYSQL_DATABASE: wordpressdb
MYSQL_USER: wordpressuser
MYSQL_PASSWORD: wordpresspassword
MYSQL_ROOT_PASSWORD: root

WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpressuser
WORDPRESS_DB_PASSWORD: wordpresspassword
WORDPRESS_DB_NAME: wordpressdb