【Laravel+Docker】既に動いているWEBサイトの開発環境と本番運用をDockerで構築してみた。
どうもskです。
以前、記事にも書きましたが年明けからDockerを学習してます。
手を動かさないと覚えられなさそうなので実践してみました。
タイトルにある、既に稼働しているサービスというのは個人開発で作ったアニメの掲示板になります。
・・・もう勉強した技術を試すサンドボックスみたいな存在になってますw
本記事で扱うGitHubリポジトリです↓
https://github.com/seki19/docker-laravel
Docker移行前の環境
サイトの構成として、Laravel(PHP)+Vue.js+MySQL+apacheという割とオーソドックスな構成になっています。
開発環境はHomesteadで開発していました。
本番環境はさくらVPSを借りて、Centos7の上にミドルウェアを直にインストールして動かしていました。(yum install httpdなどで一個ずつコマンド入力で構築)
参考にした記事
ucanさんの記事を参考に、自分なりに構成してみました。
Dockerfileの構成など、結構真似させてもらってます。🙇♂️
https://qiita.com/ucan-lab/items/38cd04cee1f3f9e024b9
ディレクトリ構造
サイトの構成として、Laravel(PHP)+MySQL+apacheという基本的な構成になっています。
ですので、とりあえずは3つのコンテナで稼働できるかなと思い、以下のようなディレクトリ構成にしました。(本当は開発環境にphpmyadminとかmailhogとか入れたい)
.
├── db
│ └── mysql_data
├── docker
│ ├── apache
│ │ └── 000-default.conf
│ ├── db
│ │ ├── Dockerfile
│ │ └── my.cnf
│ └── php
│ ├── Dockerfile
│ └── php.ini
├── src
├── .env.example
└── docker-compose.yml
docker-compose.yml構造
version: "3.8"
services:
https-portal:
image: steveltn/https-portal:1
ports:
- '${WEB_PORT}:80'
- '${SSL_PORT}:443'
links:
- web
restart: always
environment:
DOMAINS: '${DOMAIN} -> http://web:80'
STAGE: '${STAGE}' # Don't use production until staging works
# FORCE_RENEW: 'true'
networks:
- frontend
web:
build:
context: .
dockerfile: ./docker/php/Dockerfile
volumes:
- ${APP_PATH}:/var/www/html
networks:
- frontend
- backend
db:
build:
context: .
dockerfile: ./docker/db/Dockerfile
volumes:
- ./db/mysql_data:/var/lib/mysql
environment:
- MYSQL_DATABASE=${DB_NAME}
- MYSQL_USER=${DB_USER}
- MYSQL_PASSWORD=${DB_PASS}
- MYSQL_ROOT_PASSWORD=${DB_ROOT_PASS}
networks:
- backend
networks:
frontend:
driver: bridge
ipam:
driver: default
config:
- subnet: 192.168.10.0/24
backend:
driver: bridge
ipam:
driver: default
config:
- subnet: 192.168.20.0/24
環境変数について
APP_PATH=./src
WEB_PORT=80
SSL_PORT=443
DOMAIN=docker.test.com
STAGE=local
DB_PORT=3306
DB_NAME=lara_db
DB_USER=lara_user
DB_PASS=lara_pass
DB_ROOT_PASS=root_pass
.env.exampleファイルにはdocker-compose.ymlファイル内で使用する環境変数を設定しています。
APP_PATH:Laravelプロジェクトが保存されるディレクトリ
WEB_PORT:ホストからアクセスするポート番号
SSL_PORT:ホストからhttpsでアクセスする際に使用するポート
DOMAIN:ドメイン
DB_PORT、DB_NAME、DB_USER、DB_PASS、DB_ROOT_PASS:dbコンテナで使用する値
networksについて
backendとfrontendでコンテナ間の通信を制限しています。
今回の場合は、http-portalコンテナからdbコンテナにアクセスできないようにしています。(あまり意味がないかもしれませんが)
今の構成はwebコンテナ内でPHPの実行環境とwebサーバー(apache)が一緒になっています。
今後はPHPを動かすコンテナとapacheのコンテナを分けたいです。
次にservicesで設定しているコンテナ毎に解説します。
https-portalコンテナ
Let's encryptでhttps対応が簡単にできるコンテナになります。
ですが、localモードで動かすと、Chromeで警告がでるので注意。
以下はGithubリポジトリになります。
https://github.com/SteveLTN/https-portal
webコンテナ
Dockerfileです↓
FROM php:7.4-apache
# 設定ファイルをdockerコンテナ内のPHP、Apacheに読み込ませる
ADD ./docker/php/php.ini /usr/local/etc/php/
ADD ./docker/apache/000-default.conf /etc/apache2/sites-enabled/
# Composerのインストール 素のままインストールすると2.x系が入ってしまうので、1系を指定している
RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php -- --version=1.10.15 && ln -s /usr/bin/composer.phar /usr/bin/composer
# ミドルウェアインストール
RUN apt-get update \
&& apt-get install -y \
git \
zip \
unzip \
vim \
libpng-dev \
libpq-dev \
libfreetype6-dev \
libjpeg62-turbo-dev \
libwebp-dev \
libxpm-dev \
&& docker-php-ext-install pdo_mysql \
&& docker-php-ext-configure gd \
--with-freetype \
--with-jpeg \
--with-webp \
--with-xpm \
&& docker-php-ext-install -j$(nproc) gd
# Node.jsをインストール
RUN curl -sL https://deb.nodesource.com/setup_14.x | bash -
RUN apt-get install -y nodejs
RUN mv /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled
RUN /bin/sh -c a2enmod rewrite
WORKDIR /var/www/html/
基本構成はucanさんの記事を参考にしてます。
違う点としてはnode.jsをインストールしているところでしょうか、
こちらはVue.jsをビルドするためにインストールしています。
あとはcomposerも1系を指定しています。(2系だとcompose installでコケたので・・・・w)
dbコンテナ
dbコンテナ用のDockerfile↓
FROM mysql:5.7
ENV TZ=UTC
COPY ./docker/db/my.cnf /etc/my.cnf
こちら特に変わった設定は無いです。
躓いた点
本番運用をする際、データのインポートで少し躓きました、
Docker移行前のMySQLから全てのDBをダンプしたファイルのインポートを行ったのですが、設定用のDBなどが原因でwebコンテナからdbコンテナにアクセスできないということが発生しました。
対策として、LaravelからアクセスしているDBのみをダンプしてインポートを行い、解決しました。
感想
Dockerは便利だな〜と思う反面、気になる点も何個かありました。
・コンテナを複数に分けると結局Dockerイメージが大きくなる
・Docker for macだとちょっと動作が遅い
・データの永続化をどうするか
・本番運用でどのような構築がベストプラクティスかわからない
と感じました。
個人開発ではあまりメリットを感じられない部分はありますが、
複数人での開発で真価を発揮すると思います。
例えば、Dockerfileもしくはdocker-compose.ymlファイルを見ることでサービスの構成が視認できるなど、あとから参画した人もサービスの構成が簡単に俯瞰できるのはとても魅力的なのではないかなと思います。
また、CICDでもDockerを使うことが多いので、今後も積極的にDockerを導入していきたいと思いました。
この記事が気に入ったらサポートをしてみませんか?