Laravel / Docker / Windows 10 Home (WSL2)

Windows 10 Home でも Docker で Laravel 動いたメモ。

環境

  • Windows 10 Home 2004 (Insider Preview build 19041.208)
  • Linux 用 Windows サブシステム (WSL2)
  • Docker desktop community 2.2.3.0 (Edge channel)
  • PHP 7.3
  • Laravel 5.8
  • Laravel ソースコードは source フォルダに展開済み
  • Composer は (Docker内でなく) Windows 側で実行

Docker設定ファイル群

Laravel ソースフォルダ(source)と同階層に docker フォルダを作り、その中に全部入れる。

docker-compose.yml

version: "3"

services:
    web:
        build: ./web
        ports:
            - 8080:80
        volumes:
            - ../source:/var/www/html
  
    mysql:
        build: ./mysql
        ports:
            - 3306:3306
        volumes:
            - data:/var/lib/mysql
        environment:
            MYSQL_ROOT_PASSWORD: root
            MYSQL_DATABASE: docker
            MYSQL_USER: docker
            MYSQL_PASSWORD: docker
            TZ: Asia/Tokyo

    mailhog:
        image: mailhog/mailhog
        ports:
            - 8025:8025

volumes:
    data:

※MySQLデータ永続化で実ディレクトリマウントするとMySQLが2回目以降起動しなくなったためデータボリュームを使う。WSL2の問題かもしれないが詳細不明。

.env

COMPOSE_PROJECT_NAME=適当なプロジェクト名

※他のプロジェクトと名前の競合を避けるため自分で名前つける(何もしないとフォルダ名dockerがプロジェクト名になる)

web/Dockerfile

FROM php:7.3-apache

COPY 000-default.conf /etc/apache2/sites-enabled/000-default.conf
COPY php.ini /usr/local/etc/php/php.ini

RUN apt-get update && \
    apt-get install -y zip unzip libzip-dev && \
    docker-php-ext-install zip pdo_mysql

WORKDIR /var/www/html

web/000-default.conf

LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so

<VirtualHost *:80>

    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html/public

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

web/php.ini

[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

mysql/Dockerfile

FROM mysql:5.7

COPY my.cnf /etc/mysql/conf.d/my.cnf

※my.cnfをdocker-compose.ymlのvolumesでバインドするのはWindowsでは権限問題があるためCOPYを使う。

mysql/my.cnf

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
[client]
default-character-set=utf8mb4

起動

>cd docker
>docker-compose up -d
Creating network "docker_default" with the default driver
Creating docker_mailhog_1 ... done
Creating docker_web_1     ... done
Creating docker_mysql_1   ... done

>docker-compose ps
      Name                    Command               State                 Ports
---------------------------------------------------------------------------------------------
docker_mailhog_1   MailHog                          Up      1025/tcp, 0.0.0.0:8025->8025/tcp
docker_mysql_1     docker-entrypoint.sh mysqld      Up      0.0.0.0:3306->3306/tcp, 33060/tcp
docker_web_1       docker-php-entrypoint apac ...   Up      0.0.0.0:8080->80/tcp

コンテナログイン

>docker-compose exec web bash
>docker-compose exec mysql bash

※exitでログアウト

Laravel

.env (抜粋)

APP_URL=http://localhost:8080

DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=docker
DB_USERNAME=docker
DB_PASSWORD=docker

MAIL_HOST=mailhog
MAIL_PORT=1025

Laravel: http://localhost:8080/

MailHog: http://localhost:8025/

停止

>docker-compose stop

削除

いろんなプロジェクトでDocker環境を作ってるとどんどんコンテナ・イメージ・ボリューム・ネットワークが蓄積されていくのでたまに削除する。