docker-compose.yml文件如下:
version: '3.8'
services:
nginx:
image: nginx:latest
user: "1000:1000"
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./www:/var/www/html
depends_on:
- php
networks:
- lnmp-network
php:
build: ./php
image: php:8.3-fpm-alpine
volumes:
- ./www:/var/www/html
- ./php/php.ini:/usr/local/etc/php/conf.d/custom.ini
environment:
PHP_OPCACHE_ENABLE: "1"
networks:
- lnmp-network
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root_password # 自己替换
MYSQL_DATABASE: kodbox
MYSQL_USER: user # 自己替换
MYSQL_PASSWORD: user_password # 自己替换
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/conf:/etc/mysql/conf.d
ports:
- "3306:3306"
networks:
- lnmp-network
redis:
image: redis:latest
ports:
- "6379:6379"
networks:
- lnmp-network
phpmyadmin:
image: phpmyadmin/phpmyadmin
ports:
- "8080:80"
environment:
PMA_HOST: mysql
MYSQL_ROOT_PASSWORD: root_password
depends_on:
- mysql
networks:
- lnmp-network
kodbox:
image: kodcloud/kodbox:latest
ports:
- "9000:80"
volumes:
- ./kodbox:/var/kodbox
environment:
MYSQL_HOST: mysql # 与 MySQL 的服务名要一致
MYSQL_USER: user # 自己替换
MYSQL_PASSWORD: user_password # 自己替换
MYSQL_DATABASE:kodbox
depends_on:
- mysql
- redis
networks:
- lnmp-network
networks:
lnmp-network:
driver: bridge
注意:上面数据库只能配置一个,其他数据库在用 root 用户登录 phpMyAdmin 的时候创建
批量创建目录:
mkdir -p ~/lnmp/{www,php,mysql/{data,conf},nginx/conf.d,kodbox}
- nginx/conf.d:nginx站点配置
- mysql/data:MySQL数据持久化
- mysql/conf:MySQL自定义配置(如字符集)
- www:项目代码目录
创建 php/Dockerfile 文件(安装有composer):
FROM php:8.3-fpm
USER root
RUN rm -rf /etc/apt/sources.list /etc/apt/sources.list.d/* && \
touch /etc/apt/sources.list && \
echo "deb http://mirrors.aliyun.com/debian/ bookworm main non-free contrib" > /etc/apt/sources.list && \
echo "deb http://mirrors.aliyun.com/debian-security/ bookworm-security main contrib non-free" >> /etc/apt/sources.list && \
echo "deb http://mirrors.aliyun.com/debian/ bookworm-updates main contrib non-free" >> /etc/apt/sources.list && \
apt-get update && apt-get install -y \
git \
unzip \
libpng-dev \
libonig-dev \
libxml2-dev \
&& docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
# 安装 Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && \
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
WORKDIR /var/www/html && \
chown -R www-data:www-data /var/www/html
RUN if [ ! -f composer.json ]; then composer init --no-interaction --name="temp/project" || echo "{}" > composer.json; fi
COPY . .
RUN composer install
USER www-data
laravel项目的创建:
进入 ~/lnmp 目录使用 docker-compose 创建 laravel 项目
cd ~/lnmp
rm -rf www # 如果要创建 laravel 项目,要先删除 www 目录
docker-compose run --rm composer create-project --prefer-dist laravel/laravel www
laravel的数据库迁移命令:
docker-compose exec php php artisan migrate #第一个 php 是服务名
# 参数说明
# --force:强制在生产环境运行迁移(可选)。
# --seed:同时填充种子数据(可选)。
数据库迁移命令可以在容器启动时迁移(适用于初始化部署)
php:
build: ./php
image: php:8.3-fpm-alpine
command: sh -c "php artisan migrate --force && php-fpm"
# 其他配置保持不变
创建 php/php.ini 文件:
upload_max_filesize = 64M
opcache.enable=1
date.timezone = Asia/Shanghai
创建 nginx/conf.d/app.conf 文件:
server {
listen 80;
server_name www.example.com;
root /var/www/html/public;
index index.php index.html index.htm;
location / {
try_files $uri $uri//index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
运行命令批量创建容器:
docker-compose build --no-cache php && docker-compose up -d
或者
docker-compose up -d --build
运行命令批量停止容器:
docker-compose down #不删除卷
或者
docker-compose down -v #删除卷