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
スクリーンショット 2023-05-30 23.05.13.png

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的界面验证

スクリーンショット 2023-05-31 22.58.43.png

确认数据库

スクリーンショット 2023-05-31 23.01.20.png

总结

这次我尝试用Laravel9 + Nginx + MySQL + phpMyadmin在Docker中构建了一个环境。虽然使用Laravel Sail可以加快开发速度,但从零开始亲手创建并且逐步调整也是一种乐趣。

我希望未来能以此为基础,进一步进行改进。

bannerAds