必要なもの
・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を作成する。
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を作成する。
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)
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
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
<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で通信できるようになっています。