Rock笔记
~/rocknotes/articles/425.md article
// 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: bridge


4、检查yml文件,加-q表示有问题才输出

docker compose config -q



5、启动

docker compose up -d

image.png


相关命令

# 启动
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








回复// 0 replies

最新回复 ↓
// 暂无回复

回复功能沿用原详情页:前往原页面参与讨论 →