LoginSignup
5
5

More than 5 years have passed since last update.

LaravelのSSL付き環境の構築 (Docker + nginx-proxy + Let’s Encrypt)

Last updated at Posted at 2017-04-28

必要なもの
・docker, docker-composeが使えるサーバー環境
・ドメイン

流れ
プロキシコンテナの作成 → Laravel環境コンテナの作成 → プロキシコンテナが認識してSSLで通信が可能に

プロキシコンテナの作成

参考:https://hackerslog.net/post/labs/docker-letsencrypt-on-docker-and-nginx/
詳細は参考先のurlを見てください。
nginx-proxyとLet's Encryptを利用したコンテナを生成します。

以下のdocker-comppose.ymlを作成する。

docker-compose.yml
nginx-proxy:
  image: jwilder/nginx-proxy
  privileged: true
  ports:
    - 80:80
    - 443:443
  volumes:
    - ./docker-compose.d/certs:/etc/nginx/certs:ro
    - ./docker-compose.d/htpasswd:/etc/nginx/htpasswd
    - /etc/nginx/vhost.d
    - /usr/share/nginx/html
    - /var/run/docker.sock:/tmp/docker.sock:ro

letsencrypt-nginx-proxy-companion:
  image: jrcs/letsencrypt-nginx-proxy-companion
  privileged: true
  volumes:
    - ./docker-compose.d/certs:/etc/nginx/certs:rw
    - /var/run/docker.sock:/var/run/docker.sock:ro
  volumes_from:
    - nginx-proxy

そして次のコマンドで実行

$ docker-compose up -d

プロキシコンテナはこれにて完了です。

Laravel環境のコンテナを作成する際に、
任意のドメインのリクエストを自分のコンテナに来るように
コンテナの環境変数に設定することで通信できるようになります。
それではLaravel環境コンテナの作成を以下に述べます。

Laravle環境のコンテナを作成(webコンテナ + mysqlコンテナ)

参考:http://qiita.com/kukimo/items/c044ad42fffac062e2f5

以下のdocker-compose.ymlを作成する。

docker-compose.yml
web:
  build: php
  ports:
    - "80"
  environment:
    VIRTUAL_HOST: example.com
    LETSENCRYPT_HOST: example.com
    LETSENCRYPT_EMAIL: example@example.com
  volumes:
    - ./project:/var/www/html
  links:
    - mysql:mysql
mysql:
  image: mysql:5.7
  environment:
    MYSQL_ROOT_PASSWORD: password
    MYSQL_DATABASE: db_name
  volumes:
    - ./mysql:/var/lib/mysql

buildで指定しているフォルダには以下の3つのファイル(Dockerfile, php.ini, 000-default.conf)

Dockerfile
FROM php:7-apache
COPY php.ini /usr/local/etc/php/
RUN apt-get update \
  && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng12-dev libmcrypt-dev \
  && docker-php-ext-install pdo_mysql mysqli mbstring gd iconv mcrypt && \

  apt-get install -y zip unzip && \

  apt-get install -y vim && \  

  curl -sS https://getcomposer.org/installer | php && \
  mv composer.phar /usr/local/bin/composer

COPY ./000-default.conf /etc/apache2/sites-available/000-default.conf
RUN a2enmod rewrite
php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
000-default.conf
<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html/public

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

基本的に参考と同じですが、
今回はnginx-proxyを使っているので
docker-compose.yml内でport80は開くだけ、
また、nginx-proxyとLet's Encryptにドメインを指定するために
以下の環境変数が追加されています。

    VIRTUAL_HOST: example.com
    LETSENCRYPT_HOST: example.com
    LETSENCRYPT_EMAIL: example@example.com

また、バージョンの影響かapacheのドキュメントルートの指定方法が変わっていたので、
000-default.confを上書きするように変更しています。

またLaravelプロジェクト内でデフォルトで入っているpublic/.htaccessのrewriteを使えるように
Dockerfile内で以下の命令を追加しています。

RUN a2enmod rewrite

あとはwebコンテナに入って/var/www/htmlにLaravel公式のインストールを行い(ディリクトリ権限、.envやmigration)
指定したドメインにアクセスすることでSSLで通信できるようになっています。

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5