こんにちは!
前回は「半自動で運営される個人開発集サイトを作ってみた」シリーズのサービス設計編ということで、どのようなコンセプトのサービスか、技術構成はどうなっているかなどを書きました。
【サービス設計編】半自動で運営される個人開発集サイト作ってみた
今回は環境構築編ということで、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初期画面が反映されているか確認しておきましょう。
Laravelの初期画面が反映されていれば成功です。
最後に
今回は、環境構築編ということでDockerでの開発環境の構築を行いました。
サービスが小規模ということで、WebサーバーはApache、コンテナも3つのみで、簡易的な構成になっています。
Dockerに慣れていない方は、もしかすると難しかったかもしれないですが、わからないところは都度調べながら追っていただければ知識がつくと思います。
さて、今回で環境構築まで終わったので、次回からは開発編に移っていこうと思います。
お楽しみに😊
コメント