もくじ
環境
Mac Laravel Docker Apache
最終的なディレクトリ構成
Test ├── LaravelApp // 自動生成(A) ├── docker │ ├── apache │ │ ├── Dockerfile │ │ ├── config │ │ │ └── 000-default.conf │ │ └── php.ini │ └── ssl │ ├── san.txt │ ├── server.key // 自動生成(B) │ ├── server.csr // 自動生成(C) │ ├── server.crt // 自動生成(D) │ └── server.key.org // 自動生成(E) └── docker-compose.yml
Laravelをインストール(A)
- アプリ名:
LaravelApp - バージョン:9.x
$ composer create-project "laravel/laravel=9.*" LaravelApp
最新をインストールするなら
$ laravel new LaravelApp
ファイル作成
# PHPバージョン指定
FROM php:8.1-apache-bullseye
# composerバージョン指定
COPY --from=composer:2.4.1 /usr/bin/composer /usr/bin/composer
# apt install iputils-ping net-tools で ping を導入
RUN apt-get update \
&& apt-get install -y zlib1g-dev libzip-dev unzip vim iputils-ping net-tools sudo\
&& docker-php-ext-install zip
# node と npm をインストール
RUN apt-get install -y gnupg
RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash -\
&& apt-get install -y nodejs\
&& npm install npm@8.12.1 --global
# a2emod rewrite をして apache に rewrite モジュールを追加
# これをしないと Laravel でルート以外にアクセスできない
RUN a2enmod rewrite
ADD docker/apache/php.ini /usr/local/etc/php/
# Apache の conf は seites-available に作成し
# a2ensite コマンドでシンボリックリンクを sites-enabled に作成する
ADD docker/apache/config/000-default.conf /etc/apache2/sites-available/
RUN a2ensite 000-default
WORKDIR /var/www/html
COPY ./LaravelApp /var/www/html
RUN chown www-data storage/ -R \
&& composer install\
&& npm install
# サーバ証明書ファイル・秘密鍵ファイルをコンテナ内に配置(ローカルSSL通信用)
COPY docker/ssl/server.crt /etc/ssl/certs/
COPY docker/ssl/server.key /etc/ssl/private/
RUN sed -i 's!/var/www/html!/var/www/html/public!g' /etc/apache2/sites-available/default-ssl.conf \
&& sed -i 's!/etc/ssl/certs/ssl-cert-snakeoil.pem!/etc/ssl/certs/server.crt!g' /etc/apache2/sites-available/default-ssl.conf \
&& sed -i 's!/etc/ssl/private/ssl-cert-snakeoil.key!/etc/ssl/private/server.key!g' /etc/apache2/sites-available/default-ssl.conf
RUN a2enmod ssl \
&& a2ensite default-ssl.conf
ServerName localhost:443
<VirtualHost _default_:443>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/public
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
ServerName localhost:443
ServerAlias *.localhost:443
SSLEngine on
SSLCertificateFile "/etc/ssl/certs/server.crt"
SSLCertificateKeyFile "/etc/ssl/private/server.key"
</VirtualHost>
[Date] date.timezone = "Asia/Tokyo" [mbstring] mbstring.language = "Japanese"
subjectAltName = DNS:localhost
version: '3'
services:
apache:
container_name: apache
build:
context: .
dockerfile: ./docker/apache/Dockerfile
ports:
- 443:443
environment:
- TZ=Asia/Tokyo
- APACHE_DOCUMENT_ROOT=/var/www/html/public
- APP_DOMAIN=localhost
volumes:
- ./LaravelApp:/var/www/html
- ./docker/apache/php.ini:/usr/local/etc/php/php.ini
- ./docker/ssl/server.crt:/etc/ssl/certs/server.crt
networks:
- net1
networks:
net1:
自己署名証明書を準備
ローカルでSSL通信するために、ローカルであっても証明書を作成する必要があります。
パスワードは任意でok
1. server.key(秘密鍵)の作成(B)
sslディレクトリに移動しておく
$ cd docker/ssl/ $ openssl genrsa -aes128 2048 > server.key
2. server.csr(公開鍵+認証局での署名に必要な情報)の作成(C)
$ openssl req -new -key server.key > server.csr
Country Name:JPCommon Name:任意(localhost など)- 他はブランクでOK
3. server.crt(サーバ証明書)の作成(D)
$ openssl x509 -in server.csr -days 365 -req -signkey server.key > server.crt -extfile san.txt
4. パスフレーズを削除(E)
$ mv server.key server.key.org $ openssl rsa -in server.key.org > server.key
5. 証明書を「常に信頼する」
server.crtをダブルクリックで開く(キーチェーンアクセス.app)- システム > 証明書 > 作成した証明書の行をダブルクリック
信頼を開いて「常に信頼する」を選択

6. Chrome 再起動
Docker
ビルドして起動
$ docker-compose up -d --build
https://localhost/ にアクセスしてちゃんと鍵マークになってれば完了!

うまくいかないときは停止して再構築
$ docker-compose down --rmi all --volumes --remove-orphans $ docker-compose up -d --build
ログを確認してデバッグもしてみてください。
$ docker ps -a $ docker logs コンテナID
さいごに
Laravel × Docker × nginx は結構記事を見つけたんですが、Apacheを使った参考が少なかったのでまとめてみました。 自分も時間かかった身なので、誰かの助けになれば幸いです。
参考URL
Docker + Apache + Laravel で Web アプリケーションつくる - kita127のブログ
Laravel開発環境をDockerを使ってサクッと構築する【最小限のコード】|Webエンジニア研究室
【Apache】ローカルに立てたDockerコンテナでHTTPS通信する方法|Webエンジニア研究室
SAN(Subject Alternative Name) のオレオレ証明書 - Qiita