Docker:使用Laravel9 + Nginx + MySQL + phpMyAdmin搭建环境
本文的目的是什么?
最近有一个名为Laravel Sail的工具可以快速搭建Laravel环境,但是我还是想亲自通过Dockerfile构建容器环境,并将其记录下来作为备忘录。
我可以感受到正在建立某种基础设施环境的心情。
构建容器
-
- nginx
-
- Laravel(PHP)
-
- MySQL
- phpMyAdmin
构成
There is only one option: “构成”
目录结构如下:
在docker目录下创建nginx和php的Dockerfile。
从docker Hub拉取MySQL和phpMyAdmin的镜像。
容器执行的定义将记录在docker-compose.yml文件中。
test
├── docker
│ ├── nginx
│ │ ├── Dockerfile
│ │ ├── default.conf
│ │ └── nginx.conf
│ └── php
│ ├── Dockerfile
│ ├── php.ini
│ └── www.conf
├── src
└── docker-compose.yml
创建与Nginx相关的文件
- まずはnginxのDockerfileを作成します。
# コンテナのベースとしてamazonlinux:2023を指定
FROM amazonlinux:2023
# インストール可能なパッケージの一覧を更新
RUN yum -y update
# 最新版のnginxをインストール
RUN yum -y install nginx
ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]
在Docker引擎上运行的客户操作系统指定为刚刚在2023年3月发布的amazonlinux:2023。
- サーバ設定のdefault.confファイル
server {
listen 80;
server_name test.com;
root /var/www/vhosts/test/public;
index index.php index.html;
client_max_body_size 30M;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index /index.php;
include /etc/nginx/fastcgi_params;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTP_X_REAL_IP $remote_addr;
fastcgi_param HTTP_X_FORWARDED_HOST $host;
fastcgi_param HTTP_X_FORWARDED_FOR $proxy_add_x_forwarded_for;
fastcgi_param HTTP_X_REMOTE_ADDR $remote_addr;
# Security
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
add_header Access-Control-Allow-Origin '*';
add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE';
add_header Access-Control-Allow-Headers 'Origin, Authorization, Accept, Content-Type';
}
location /healthcheck.html {
satisfy any;
allow all;
}
}
- nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
use epoll;
worker_connections 51200;
multi_accept on;
accept_mutex_delay 100ms;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
server_tokens off;
sendfile on;
tcp_nopush on;
keepalive_timeout 10;
fastcgi_read_timeout 300;
include /etc/nginx/conf.d/*.conf;
}
创建与Laravel(PHP)相关的文件
- Dockerfile作成
# コンテナのベースとしてamazonlinux:2023を指定
FROM amazonlinux:2023
RUN yum -y update
RUN yum -y install unzip \
wget
# php、モジュール関連インストール
RUN yum -y install php less php-intl \
php-cli php-json php-common php-devel php-fpm \
php-gd php-mysqlnd php-mbstring php-pdo php-xml
# unix socket
RUN mkdir /var/run/php-fpm
VOLUME [ "/var/run/php-fpm" ]
RUN echo 'short_open_tag = On' >> /etc/php.ini
RUN echo 'date.timezone = Asia/Tokyo' >> /etc/php.ini
EXPOSE 9000
ENTRYPOINT /usr/sbin/php-fpm -F
# composerインストール
WORKDIR /tmp
RUN wget https://getcomposer.org/installer -O composer-installer.php
RUN php composer-installer.php --filename=composer --install-dir=/usr/local/bin
RUN composer self-update
# nodeのインストール
RUN curl -fsSL https://rpm.nodesource.com/setup_18.x | bash -
RUN yum -y install nodejs
# コンテナのディレクトリ指定
WORKDIR /var/www/vhosts/test
与nginx相同,我们将amazonlinux:2023指定为客户操作系统。
- www.conf(php-fpmの設定ファイル)
[www]
listen = 9000
user = nginx
group = nginx
;listen = /run/php-fpm/www.sock
;listen.allowed_clients = 127.0.0.1
listen.owner = nginx
listen.group = nginx
listen.mode = 0666
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
- php.ini(PHPの設定ファイル)
zend.exception_ignore_args = off
expose_php = on
max_execution_time = 240
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 = /dev/stderr
default_charset = UTF-8
[Date]
date.timezone = Asia/Tokyo
[mysqlnd]
mysqlnd.collect_memory_statistics = on
[Assertion]
zend.assertions = 1
[mbstring]
mbstring.language = Japanese
创建docker-compose.yml
version: '3'
services:
nginx:
container_name: test_nginx
build:
context: ./docker/nginx/
ports:
- 80:80
volumes:
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:cached
- ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf:cached
depends_on:
- php
php:
container_name: test_php
build:
context: ./docker/php/
volumes:
- ./src:/var/www/vhosts/test/:cached
- ./docker/php/www.conf:/etc/php-fpm.d/www.conf:cached
- ./docker/php/php.ini:/etc/php.ini:cached
db:
image: mysql:8.0
container_name: test_db
hostname: mysql
expose:
- 3306
ports:
- 3306:3306
command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci --default-time-zone=Asia/Tokyo
environment:
- MYSQL_ALLOW_EMPTY_PASSWORD=no
- MYSQL_DATABASE=testdb
- MYSQL_USER=testuser
- MYSQL_PASSWORD=testpass
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: test_pma
hostname: phpmyadmin
depends_on:
- db
ports:
- "8888:80"
创建容器
进入包含docker-compose.yml的目录,并执行以下命令来创建docker镜像并启动容器。
$ docker-compose up -d

Laravel的安装
进入已启动的 test_php 容器并安装 Laravel。
# test_phpコンテナに入る
$ docker exec -it test_php bash
# /var/www/vhosts/testディレクトリにいるか確認してLaravelをインストール(今回はバージョン9)
$ composer create-project --prefer-dist "laravel/laravel=9.*" .
如果Laravel的源代码已经在src文件夹中生成,那就表示成功了。
Laravel的界面验证

确认数据库

总结
这次我尝试用Laravel9 + Nginx + MySQL + phpMyadmin在Docker中构建了一个环境。虽然使用Laravel Sail可以加快开发速度,但从零开始亲手创建并且逐步调整也是一种乐趣。
我希望未来能以此为基础,进一步进行改进。