この記事ではDocker上にLaravelプロジェクトを立ち上げる方法を解説していきます。
今回の記事を理解する上で大事な用語が多いですが、随時解説していきますので安心してついてきてくださいね!
なお、自分のPCは
・MacBook Pro
・M2チップ
なので、予めご了承ください
まずはDockerのインストールから
なにはともあれ、まずはDockerのインストールをしないと始まらないので、
公式サイトから、ご自身のOS用のDockerをダウンロードしてください。
DockerDesktopをインストールしてくださいね。Docker Hubの方ではないので注意してくださいね。
指示通りインストールできたらターミナルを開いて
docker version
と叩いて、Dockerに関する情報が出てきたらインストールは無事完了です!
Macをお使いの方で何か不具合があったら、再起動することで動くことがあるので試してみてください!
実際にDocker上にLaravelプロジェクトを作成
まず適当なディレクトリを作成してください。
ぼくはpracticeというディレクトリを作成しました。
次に、作成したディレクトリの中にdockerディレクトリを作成します。
practice
docker
ここまでは大丈夫でしょうか?
dockerイメージの作成
新たな言葉が出てきました。
手を動かしながら説明していきます
先ほど作成したdockerファイルに3つのフォルダを作成してきます
practice
docker
app
db
web
appとdbとwebというディレクトリを作成してください。
そしたら、それぞれのディレクトリにDockerfileを作成してください。
それ以外のファイルも少し作成します。
practice
docker
app
Dockerfile
php.ini
db
Dockerfile
my.cnf
web
Dockerfile
default.conf
このDockerfileに記述された内容によってdockerイメージが作成されていきます
Dockerイメージ
dockerイメージはコンテナの中で使われます
ちなみにコンテナに関しては前の記事で解説していますので、よくわからない方はそちらもご覧ください。
Dockerイメージとは、コンテナ内で動かすDBやアプリケーションやメールサーバー等を作る際の設定ファイルのことです。
これらのファイルによって、コンテナ内で動かすDBやアプリケーションやメールサーバー等が作成されます。
まず、appディレクトリ内のDockerfileを作成していきます。
その作成したDockerfileに以下のコードを記述します
FROM php:8.0-fpm
ENV TZ Asia/Tokyo
RUN apt-get update && \
apt-get install -y git unzip libzip-dev libicu-dev libonig-dev && \
docker-php-ext-install intl pdo_mysql zip bcmath
COPY ./docker/app/php.ini /usr/local/etc/php/php.ini
COPY --from=composer:2.0 /usr/bin/composer /usr/bin/composer
WORKDIR /app
ちゃんと理解していくために、1行1行読み解いていきます。
FROM
FROMは、Dockerイメージ(コンテナ内で動かすDBやアプリケーションやメールサーバー等を作る際の設定ファイルのこと)のベースイメージを指定します。
今回は、Laravelのプロジェクトを作成するので、PHPを指定していますが、Railsプロジェクトを作成するときは、Rubyを指定する必要があります。
また、ベースイメージのバージョンも指定することができます。
原則として、Dockerfileの1番上に記述する必要があります。
ENV
このコマンドでは、環境変数を指定していいます。
環境変数とは、OSが持つ変数のことです。
RUN
RUNコマンドは、ビルド時に実行されるコマンド自体を指定しています。
ここで指定されるコマンドは、ぼくの主観ではありますが、Linuxコマンド自体が多いように感じます。
1だけ取り上げますがここでは、apt-get updateコマンドが指定されています。
このコマンドは、アップデートが可能なパッケージがあるかをチェックして、パッケージリストを更新するコマンドです。
Dockerfileがビルドされるときに、この処理が行われます。
COPY
COPYコマンドはローカルのファイルをDockerイメージのファイルシステムにコピーするコマンドです。
後ろの方で出てきますが、php.iniファイルを作成し、それを/usr/local/etc/php/php.iniにコピーしますよ、というコマンドです。
WORKDIR
WORKDIRコマンドは、このDockerfileを操作するパスを指定します。
今回のように、Dockerfileが複数ある場合、操作するパスを指定してあげることで、ビルドしたときのエラーを防ぐことができます。
appディレクトリ下にphp.iniファイルを設定します。
そのファイルに以下のコードを書きます。
zend.exception_ignore_args = off
expose_php = on
max_execution_time = 30
max_input_vars = 1000
upload_max_filesize = 64M
post_max_size = 128M
memory_limit = 256M
error_reporting = E_ALL
display_errors = on
display_startup_errors = on
log_errors = on
error_log = /var/log/php/php-error.log
default_charset = UTF-8
[Date]
date.timezone = Asia/Tokyo
[mysqlnd]
mysqlnd.collect_memory_statistics = on
[Assertion]
zend.assertions = 1
[mbstring]
mbstring.language = Japanese
説明は省きますが、メモリサイズや、文字コードを指定しています。
環境設定をしています。
dbディレクトリのDockerfileには以下のコードを記述します。
FROM mysql:8.0
先程のFROMコマンドを理解していれば、何をしているかわかると思います。
my.cnfファイルには以下のコードを記述します。
[mysqld]
character_set_server = utf8mb4
collation_server = utf8mb4_0900_ai_ci
default-time-zone = SYSTEM
log_timestamps = SYSTEM
log-error = mysql-error.log
slow_query_log = 1
slow_query_log_file = mysql-slow.log
long_query_time = 1.0
log_queries_not_using_indexes = 0
general_log = 1
general_log_file = mysql-general.log
[mysql]
default-character-set = utf8mb4
[client]
default-character-set = utf8mb4
webディレクトリのDockerfileには以下のようなコードを記述してください。
FROM nginx:1.20-alpine
ENV TZ Asia/Tokyo
RUN chmod 755 -R /root
COPY ./docker/web/default.conf /etc/nginx/conf.d/default.conf
default.confファイルには以下のようなコードを記述してください。
server {
listen 80;
server_name example.com;
root /app/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass app:9000;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
これでDockerイメージを作成するためのファイルが完成しました。
これで目標のDocker上でLaravelのプロジェクトを作成するまでの手順の50%が終わりました!
次の記事では、docker-composeについて説明していきます!
最後まで読んでいただきありがとうございました!
Twitterもやっているので、こちらもご覧ください!
【参考文献】