【環境構築】Laravel × Docker × Apache かつローカルでSSL通信する
もくじ
環境
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
:JP
Common 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