// article · linux
Docker 部署 Laravel 项目
CentOS系统,已安装docker和docker compose,现在/laravel-project目录下
1、创建本地目录结构,供后面数据持久化用
/laravel-project/
├── mysql/
├── data/
├── log/
├── my.cnf
├── nginx/
├── conf.d/
├── laravel.conf
├── phpmyadmin.conf
├── php/
├── local.ini
└── wwwroot/
├──laravel/
├──phpmyadmin/编辑/laravel-project/php/local.ini文件,输入以下内容更改php配置
upload_max_filesize=40M
post_max_size=40M
memory_limit=512M
session.cookie_secure = Off
session.cookie_samesite = Lax/laravel-project/nginx/conf.d/下,laravel.conf配置了Laravel项目,端口80;phpmyadmin.conf配置了phpmyadmin,端口8080
2、创建Dockerfile文件,构建 Laravel 运行所需的 PHP-FPM 容器镜像
#指定来自的基础镜像
FROM php:8.3-fpm
# 设置容器默认工作目录 /var/www
WORKDIR /var/www
# 安装编译 PHP 扩展所需系统库、图片压缩工具、常用命令行工具,php:8.3-fpm 镜像是 Debian,Debian 使用 apt
RUN apt-get update && apt-get install -y \
build-essential \
libpng-dev \
libonig-dev \
libzip-dev \
zlib1g-dev \
libjpeg62-turbo-dev \
libfreetype6-dev \
locales \
zip \
jpegoptim optipng pngquant gifsicle \
vim \
unzip \
git \
curl
# apt update 会下载大量索引缓存,及时删除是制作轻量化镜像的好习惯
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# 安装 PHP 扩展,docker-php-ext-install 是官方 php 镜像内置脚本,用来编译安装 PHP 扩展
RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl mysqli
# PHP 图像处理扩展,用于图片裁剪、生成缩略图;不加参数编译出来的 gd 不支持 jpg、字体,很多图片处理功能失效
RUN docker-php-ext-configure gd \
--with-freetype \
--with-jpeg
RUN docker-php-ext-install gd
# 安装 composer,容器内可以直接执行 composer install
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# 创建 www 用户组(gid=1000)和 www 用户(uid=1000),目的:不使用 root 运行 PHP,解决 Laravel 缓存、日志权限问题
RUN groupadd -g 1000 www
RUN useradd -u 1000 -ms /bin/bash -g www www
# 拷贝wwwroot站点代码到容器 /var/www,并设置归属 www:www
COPY --chown=www:wwwroot www /var/www
# 切换运行身份为 www 用户,后续 php-fpm 不以 root 启动
USER www
# 声明容器开放 9000 端口(仅仅文档说明,不会自动发布端口),php-fpm 默认监听 9000,供 Nginx 反向代理通信
EXPOSE 9000
CMD ["php-fpm"]3、创建docker-compose.yml文件
services:
# PHP-FPM Laravel 服务
app:
build:
context: .
dockerfile: Dockerfile
#构建完成后打上镜像名称
image: tytrock/php
#定义容器名字
container_name: app
#除非手动执行docker stop,否则容器自动重启(崩溃、宿主机重启都会自动启动)
restart: unless-stopped
#分配终端,方便后续 docker exec -it app bash 进入容器交互
tty: true
environment:
SERVICE_NAME: app
SERVICE_TAGS: dev
working_dir: /var/www
volumes:
# 宿主机当前代码目录映射到容器网站目录
- ./wwwroot:/var/www
# PHP日志
- ./logs/php:/var/log/php
#自定义 PHP 配置,可调整上传大小、内存限制、超时等参数,这里不是php全局配置文件php.ini,全局配置文件在/usr/local/etc/php/conf.d下,而conf.d是附加配置目录,PHP 启动时自动扫描这个目录下所有 *.ini 文件并加载,按文件名字母顺序合并生效,文件下内容的同名配置项会覆盖主 php.ini,没有定义的沿用php.ini默认值
- ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
networks:
- app-network
# Nginx Web服务
webserver:
image: nginx:alpine
container_name: webserver
restart: unless-stopped
tty: true
security_opt:
- seccomp:unconfined
ports:
- "80:80"
- "443:443"
- "8080:8080"
volumes:
# 和 PHP 容器共享项目代码
- ./wwwroot:/var/www
# Nginx配置配置文件,如需要可配置,需提前创建 ./nginx/conf.d文件并写入配置内容,如果不新建会报错,如果新建后不填写内容会覆盖容器内的文件
#- ./nginx/nginx.conf:/etc/nginx/nginx.conf
# Nginx站点配置目录,需提前创建该目录
- ./nginx/conf.d:/etc/nginx/conf.d
# Nginx日志
- ./nginx/log:/var/log/nginx
# 如需ssl证书
# - ./nginx/ssl:/etc/nginx/ssl
#控制启动顺序:先启动 app,再启动 nginx
depends_on:
- app
networks:
- app-network
# MySQL8.4
db:
image: mysql:8.4
container_name: db
restart: unless-stopped
tty: true
ports:
- "3306:3306"
environment:
#容器首次初始化时自动创建名称为 laravel 的数据库(仅第一次有效)
MYSQL_DATABASE: laravel
#root 账号密码,生产绝对不要明文写在 yml!
MYSQL_ROOT_PASSWORD: xxxxxx
SERVICE_TAGS: dev
SERVICE_NAME: mysql
TZ: Asia/Shanghai
volumes:
# 数据库持久化
- ./mysql/data:/var/lib/mysql
- ./mysql/log:/var/log/mysql
- ./mysql/my.cnf:/etc/mysql/my.cnf
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
networks:
- app-network
networks:
app-network:
driver: bridge4、检查yml文件,加-q表示有问题才输出
docker compose config -q5、启动
docker compose up -d
相关命令
# 启动
docker compose up -d
# 停止
docker compose down
# 查看日志
docker compose logs -f
# 重建PHP镜像(修改Dockerfile后执行)
docker compose build app
docker compose up -d
# 进入PHP容器执行artisan命令
docker exec -it app bash
# 或直接执行
docker exec -it app php artisan migrate