【環境構築編】半自動で運営される個人開発集サイト作ってみた

プログラミング

こんにちは!

前回は「半自動で運営される個人開発集サイトを作ってみた」シリーズのサービス設計編ということで、どのようなコンセプトのサービスか、技術構成はどうなっているかなどを書きました。

【サービス設計編】半自動で運営される個人開発集サイト作ってみた

今回は環境構築編ということで、Dockerでの環境構築を行なっていきたいと思います。

要所要所で説明を入れていきますが、わからない箇所は都度自分で調べたりコメントで教えていただければと思います。

Docker環境構築

それでは、早速Dockerを使って開発環境を構築していきます。

ディレクトリ構成

以下はディレクトリ構成です。

app
docker-compose.yml
docker
|_app
|  |_000-default.conf
|  |_Dockerfile
|  |_php.ini
|_db
  |_Dockerfile
  |_my.cnf

PHP,Apache

まずはWebサーバーであるApacheやPHPを入れていきましょう。

以下、Dockerfileです。

# docker/app/Dockerfile

FROM php:8.1-apache

COPY /docker/app/php.ini /usr/local/etc/php/
COPY /docker/app/000-default.conf /etc/apache2/sites-available/000-default.conf

# Composerのインストール
RUN cd /usr/bin && curl -s <http://getcomposer.org/installer> | php && 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 \\
    libxrender-dev \\
    libfontconfig \\
    libssl-dev \\
    && docker-php-ext-install pdo_mysql

# Laravelで必要になるmodRewriteを有効化する
RUN mv /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled
RUN /bin/sh -c a2enmod rewrite

まず、以下でphpの設定ファイルであるphp.iniやApacheの設定ファイルである000-default.confをDockerコンテナ内にコピーして反映させています。

COPY /docker/app/php.ini /usr/local/etc/php/
COPY /docker/app/000-default.conf /etc/apache2/sites-available/000-default.conf

また、以下でComposerをインストールしています。

# Composerのインストール
RUN cd /usr/bin && curl -s <http://getcomposer.org/installer> | php && ln -s /usr/bin/composer.phar /usr/bin/composer

ComposerはLaravelプロジェクトの場合、どんなプロジェクトでも必須になるかと思うので、どこかにメモしておいても良いでしょう。

最後に、git,zip,vimなど諸々必要となるモジュール群をコンテナにインストールしています。

RUN apt-get update \\
    && apt-get install -y \\
    git \\
    zip \\
    unzip \\
    vim \\
    libpng-dev \\
    libpq-dev \\
    libxrender-dev \\
    libfontconfig \\
    libssl-dev \\
    && docker-php-ext-install pdo_mysql

次に、php.iniです。

// docker/app/php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.language = "Japanese"
memory_limit = 1024M
post_max_size = 256M
upload_max_filesize = 50M
max_execution_time = 600
extension=pdo_mysql

最後に000-default.confファイルです。

// docker/app/000-default.conf
<VirtualHost *:80>
    DocumentRoot /var/www/html/public

    <Directory /var/www/html/public>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

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

これでWebサーバーとPHPの設定は完了しました。

次に、MySQLの設定を行なっていきます。

MySQL

次にMySQLのDockerfileを書いていきます。

# app/db/Dockerfile
FROM mysql:8.0.29-debian

# 設定ファイルの上書き
COPY /docker/db/my.cnf /etc/mysql/conf.d
RUN chmod 644 /etc/mysql/conf.d

RUN mv /etc/apt/sources.list.d/mysql.list /etc/apt/sources.list.d/mysql.list.disabled
RUN apt-get update && apt-get install -y curl && apt-get clean
RUN curl -sSfL <https://repo.mysql.com/RPM-GPG-KEY-mysql-2023> | gpg --import
RUN gpg --batch --export "B7B3B788A8D3785C" > /etc/apt/keyrings/mysql.gpg
RUN mv /etc/apt/sources.list.d/mysql.list.disabled /etc/apt/sources.list.d/mysql.list

RUN apt-get update && apt-get install -y locales \\
    && echo "ja_JP.UTF-8 UTF-8" > /etc/locale.gen \\
    && locale-gen ja_JP.UTF-8 \\
    && update-locale LANG=ja_JP.UTF-8

ENV LANG ja_JP.UTF-8

CMD ["mysqld"]

以下でMySQLの日本語化を行なっています。

RUN apt-get update && apt-get install -y locales \\
    && echo "ja_JP.UTF-8 UTF-8" > /etc/locale.gen \\
    && locale-gen ja_JP.UTF-8 \\
    && update-locale LANG=ja_JP.UTF-8

注意点として、以下でGPGキーの設定を行わないと、ビルド時にエラーが発生するようです。追記しておきます。

RUN mv /etc/apt/sources.list.d/mysql.list /etc/apt/sources.list.d/mysql.list.disabled
RUN apt-get update && apt-get install -y curl && apt-get clean
RUN curl -sSfL <https://repo.mysql.com/RPM-GPG-KEY-mysql-2023> | gpg --import
RUN gpg --batch --export "B7B3B788A8D3785C" > /etc/apt/keyrings/mysql.gpg
RUN mv /etc/apt/sources.list.d/mysql.list.disabled /etc/apt/sources.list.d/mysql.list

次に、my.cnfでMySQLの設定を行なっていきます。

[client]
default-character-set=utf8mb4
[mysqld]
user            = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci

こちらの設定ファイルでは、MySQLのポートの設定や文字コードの設定などを行なっています。

docker-compose.yml

さて、環境構築の最後にルートディレクトリにdocker-compose.ymlを作成していきましょう。

# ./docker-compose.yml
version: '3'

services:
  app:
    build:
      context: .
      dockerfile: docker/app/Dockerfile
    container_name: prdev_app
    volumes:
      - ./app:/var/www/html
    ports:
      - 8000:80
    depends_on:
      - database
  database:
    build:
      context: .
      dockerfile: docker/db/Dockerfile
    container_name: prdev_db
    platform: linux/amd64
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - db_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: 管理者パスワード
      MYSQL_DATABASE: データベース名
      MYSQL_USER: ユーザー名
      MYSQL_PASSWORD: ユーザーパスワード
    ports:
      - 3306:3306
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: prdev_phpmyadmin
    environment:
      PMA_HOST: database
      PMA_PORT: 3306
    ports:
      - 8080:80
    depends_on:
      - database
volumes:
  db_data: {}

docker-compose.ymlの詳しい説明は割愛しますが、上記で以下3つのコンテナを作成しています。

  • Laravel
  • データベース(MySQL)
  • PHPMyAdmin(データベース管理)

Laravelプロジェクト作成

さて、それでは次にLaravelプロジェクトを作成していきましょう。

プロジェクトのルートディレクトリで以下のコマンドを実行します。

composer create-project laravel/laravel=9.x --prefer-dist app

これで、ルートディレクトリにapp/ディレクトリが作られているかと思います。

このままだと、Laravelがデータベースに接続できないので、MySQLの秘匿情報をLaravel側に設定しておきましょう。

# .env
DB_CONNECTION=mysql
DB_HOST=database # コンテナのサービス名
DB_PORT=3306
DB_DATABASE=データベース名
DB_USERNAME=ユーザー名
DB_PASSWORD=ユーザーのパスワード

.envに設定する値は、docker-compose.ymlのdatabaseサービスに記載した値を入れていきます。

こちらを設定することで、LaravelからMySQLに接続できるようになります。

Dockerコンテナ立ち上げ

さて、これで環境構築の準備が整いました。

最後にDockerコンテナを立ち上げましょう。

DockerDesktopを起動してから以下のコマンドを叩きます。

docker-compose build
docker-compose up -d

これで全てのコンテナが立ち上がっていれば、成功です。

最後に動作確認として、以下のURLにアクセスしてLaravel初期画面が反映されているか確認しておきましょう。

http://localhost:8000

Laravelの初期画面が反映されていれば成功です。

最後に

今回は、環境構築編ということでDockerでの開発環境の構築を行いました。

サービスが小規模ということで、WebサーバーはApache、コンテナも3つのみで、簡易的な構成になっています。

Dockerに慣れていない方は、もしかすると難しかったかもしれないですが、わからないところは都度調べながら追っていただければ知識がつくと思います。

さて、今回で環境構築まで終わったので、次回からは開発編に移っていこうと思います。

お楽しみに😊

コメント

タイトルとURLをコピーしました