Docker仮想ドライブサイズを小さくしたい

 WordPress開発環境で使用する Docker 仮想ドライブ (WSL2)のサイズをできるだけ小さくしたいため、以下の構成で構築する。
– Docker ホストOS として Alpine を使用する。
– Docker イメージは、Alpine 上で稼働するものを使用する。
– 外部ボリュームは使用せず、全て仮想ドライブ内にデータを保持する。
– Webサーバは、nginxを使用する。
– WordPressは、Ver.5.9 + PHP 7.4 で稼働するものを使用する。(本サイトの環境と同一にするため)
– DBは、MariaDB を使用する。(本サイトの環境と同一にするため)

使用する Docker イメージ

WordPress

wordpress:6-php7.4-fpm-alpine

wordpress - Official Image | Docker Hub
The WordPress rich content management system can utilize plugins, widgets, and themes.

 以下、サイト記載の docker-compose.yml サンプル。

version: '3.1'

services:

  wordpress:
    image: wordpress
    restart: always
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb
    volumes:
      - wordpress:/var/www/html

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - db:/var/lib/mysql

volumes:
  wordpress:
  db:

 また、fpm イメージを使用して nginx に接続する場合には、以下に記載されている内容を、 /etc/nginx/conf.d/default.conf にコピーしてやる必要があるようだ。
https://gist.github.com/md5/d9206eacb5a0ff5d6be0

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   fpm:9000;
    fastcgi_index  index.php; 
  } 
}

Nginx

nginx:stable-alpine

nginx - Official Image | Docker Hub
Official build of Nginx.

 以下、サイト記載の docker-compose.yml サンプル。

web:
  image: nginx
  volumes:
   - ./templates:/etc/nginx/templates
  ports:
   - "8080:80"
  environment:
   - NGINX_HOST=foobar.com
   - NGINX_PORT=80

MariaDB

yobasystems/alpine-mariadb

https://hub.docker.com/r/yobasystems/alpine-mariadb/

 以下、サイト記載の docker-compose.yml サンプル。

mysql:
  image: yobasystems/alpine-mariadb
  environment:
    MYSQL_ROOT_PASSWORD: hguyFtgfR4r9R4r76
    MYSQL_DATABASE: wordpressdb
    MYSQL_USER: wordpressuser
    MYSQL_PASSWORD: hguyFt6S95dgfR4ryb
  expose:
    - "3306"
  volumes:
    - /data/example/mysql:/var/lib/mysql
  restart: always

docker compose による 環境構築

 以下の2ファイルを同一フォルダに用意する。

– docker-compose.yml
– nginx.conf

その後、以下のコマンドを打てば、http://localhost で動作を確認することができる。

# docker compose up -d

docker-compose.yml

version: '3.9'

services:

  web:
    image: nginx:stable-alpine
    depends_on:
      - wp
    ports:
      - "80:80"
    restart: always
    volumes:
      - ./html:/var/www/html
      - ./nginx.conf:/etc/nginx/nginx.conf

  wp:
    image: wordpress:5.9-php7.4-fpm-alpine
    depends_on:
      - db
    restart: always
    environment:
      - WORDPRESS_DB_HOST=db
      - WORDPRESS_DB_USER=wordpressuser
      - WORDPRESS_DB_PASSWORD=wordpresspassword
      - WORDPRESS_DB_NAME=wordpressdb
    volumes:
      - ./html:/var/www/html

  db:
    image: yobasystems/alpine-mariadb
    expose:
      - "3306:3306"
    restart: always
    environment:
      - MYSQL_DATABASE=wordpressdb
      - MYSQL_USER=wordpressuser
      - MYSQL_PASSWORD=wordpresspassword
      - MYSQL_ROOT_PASSWORD=root
    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;
    keepalive_timeout  65;

    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; 
        } 
    }
}