見出し画像

【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を導入していきたいと思いました。



この記事が気に入ったらサポートをしてみませんか?