chore(docker): 根据不同环境区分docker容器及网络,完全隔离

This commit is contained in:
2025-12-02 15:00:06 +08:00
parent b81e7b8b1b
commit 5f48980d31
10 changed files with 263 additions and 26 deletions

27
.env.development Normal file
View File

@@ -0,0 +1,27 @@
# 项目配置, 请根据实际情况修改
PROJECT_NAME=newshop
# ThinkPHP 6.x 配置, 请根据实际情况修改
APP_ENV=development
# PHP/PHP-FPM 配置
PHP_VERSION=7.4
PHP_FPM_VERSION=7.4-fpm
PHP_FPM_PORT=9105
XDEBUG_POST=9108
# 数据库配置
MYSQL_ROOT_HOST=%
MYSQL_DATABASE=shop_mallnew
MYSQL_USER=shop_mallnew
MYSQL_PASSWORD=shop_mallnew
MYSQL_PORT=3326
# Redis 绑定端口及密码
REDIS_PASSWORD=luckyshop123!@#
REDIS_PORT=6499
# Nginx 暴漏端口
NGINX_PORT=8050
NGINX_SSL_PORT=8052

27
.env.local Normal file
View File

@@ -0,0 +1,27 @@
# 项目配置, 请根据实际情况修改
PROJECT_NAME=newshop
# ThinkPHP 6.x 配置, 请根据实际情况修改
APP_ENV=local
# PHP/PHP-FPM 配置
PHP_VERSION=7.4
PHP_FPM_VERSION=7.4-fpm
PHP_FPM_PORT=9100
XDEBUG_POST=9103
# 数据库配置
MYSQL_ROOT_HOST=%
MYSQL_DATABASE=shop_mallnew
MYSQL_USER=shop_mallnew
MYSQL_PASSWORD=shop_mallnew
MYSQL_PORT=3316
# Redis 配置
REDIS_PASSWORD=luckyshop123!@#
REDIS_PORT=6399
# Nginx 配置
NGINX_PORT=8010
NGINX_SSL_PORT=8012

2
.gitignore vendored
View File

@@ -20,8 +20,6 @@ __pycache__
# 环境变量 # 环境变量
.env .env
.env.test
.env.local
# 源码结构 # 源码结构
debug.txt debug.txt

View File

@@ -4,5 +4,38 @@
## Docker 部署 ## Docker 部署
```bash ```bash
cp .env.example .env cp .env.example .env.development
```
**注意**
- 在同一目录下面,执行 `docker-compose` 命令时,需要指定项目名称。用来区分不同的环境。如 `shop_local``shop_dev` 等。
- 本地部署时,需要将 `APP_ENV` 设置为 `local`
- 开发环境部署时,需要将 `APP_ENV` 设置为 `development`
## 环境变量
- `APP_ENV`: 应用环境,默认值为 `development`
## 开发环境-local 部署
```bash
# 本地部署时,需要将 APP_ENV 设置为 local, 并指定 docker-compose.local.yml 文件
docker-compose --project-name shop_local --env-file .env.local -f docker-compose.local.yml up -d
# docker-compose down 命令,用来停止并删除容器
docker-compose --project-name shop_local down -v
```
## 开发环境-development 部署
```bash
# 默认使用 docker-compose.yml 文件
docker-compose --project-name shop_development --env-file .env.development up -d
# docker-compose down 命令,用来停止并删除容器
docker-compose --project-name shop_development down -v
``` ```

124
docker-compose.local.yml Normal file
View File

@@ -0,0 +1,124 @@
x-shared-env: &shared-api-env
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-rootpassword}
MYSQL_ROOT_HOST: ${MYSQL_ROOT_HOST:-'%'} # 允许root从任何主机连接
MYSQL_DATABASE: ${MYSQL_DATABASE:-shop_mallnew}
MYSQL_USER: ${MYSQL_USER:-shop_mallnew}
MYSQL_PASSWORD: ${MYSQL_PASSWORD:-shop_mallnew}
REDIS_PASSWORD: ${REDIS_PASSWORD:-luckyshop123!@#}
REDIS_PORT: ${REDIS_PORT:-6379}
# 将服务归类到目录 A 中
services:
php-fpm:
build:
context: ./docker/php
dockerfile: Dockerfile
container_name: ${PROJECT_NAME}_php
restart: always
extra_hosts:
- "host.docker.internal:host-gateway" # 支持主机名解析
environment:
PHP_ENV: ${PHP_ENV:-development}
# 环境变量, APP_ENV 应用于 ThinkPHP 6.x 框架, .env.local 要想启用,需要在项目根目录下创建 .env.local 文件,并将 APP_ENV 设置为 local
# 同理,如果要启用开发环境,则将 APP_ENV 设置为 development如果要启用生产环境则将 APP_ENV 设置为 production
# 不然ThinkPHP 6.x 系列,会只加载 .env 文件,而不会加载 .env.local 文件,导致 .env.local 文件中的配置不会生效
APP_ENV: ${APP_ENV:-development}
APP_DEBUG: ${APP_DEBUG:-true}
XDEBUG_CONFIG: ${XDEBUG_CONFIG:-client_host=host.docker.internal client_port=9003}
PHP_IDE_CONFIG: serverName=docker-php
ports:
- "${PHP_FPM_PORT:-9000}:9000" # PHP-FPM
- "${XDEBUG_POST:-9003}:9003" # Xdebug
volumes:
- ./:/var/www/all_source
- ./src:/var/www/html
# 更新下载源列表以加速apt-get
- ./docker/debian/sources.list:/etc/apt/sources.list:ro
- ./docker/php/php.ini:/usr/local/etc/php/php.ini:ro
- ./docker/php/xdebug.ini:/usr/local/etc/php/conf.d/xdebug.ini
- xdebug_logs:/tmp # Xdebug 日志目录
depends_on:
- db
healthcheck:
test: ["CMD", "bash", "-c", "curl -f http://localhost:9000/status && ps aux | grep '[p]hp think cron:schedule'"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
networks:
- sass-platform-net
labels:
- "com.docker.compose.project.working_dir=${PROJECT_NAME}"
nginx:
build:
context: ./docker/nginx
dockerfile: Dockerfile
container_name: ${PROJECT_NAME}_nginx
restart: always
ports:
- "${NGINX_PORT:-80}:80"
- "${NGINX_SSL_PORT:-443}:443"
volumes:
# 挂载项目代码到 Nginx 容器中
- ./src:/var/www/html:rw
# 更新下载源列表以加速apt-get
- ./docker/debian/sources.list:/etc/apt/sources.list:ro
# 创建临时目录
- /var/www/server/nginx/proxy_temp_dir
- /var/www/server/nginx/proxy_cache_dir
depends_on:
- php-fpm
networks:
- sass-platform-net
labels:
- "com.docker.compose.project.working_dir=${PROJECT_NAME}"
db:
image: mysql:5.7.44
container_name: ${PROJECT_NAME}_mysql
environment:
<<: *shared-api-env
volumes:
- mysql_db_data:/var/lib/mysql
- ./docker/mysql/init:/docker-entrypoint-initdb.d
- ./docker/mysql/my.cnf:/etc/mysql/conf.d/custom.cnf
ports:
- ${MYSQL_PORT:-3306}:3306
networks:
- sass-platform-net
restart: unless-stopped
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --innodb_buffer_pool_size=256M
labels:
- "com.docker.compose.project.working_dir=${PROJECT_NAME}"
# Redis 服务(可选)
redis:
image: redis:8.2
container_name: ${PROJECT_NAME}_redis
environment:
REDIS_PASSWORD: ${REDIS_PASSWORD:-luckyshop123!@#}
REDISCLI_AUTH: ${REDIS_PASSWORD:-luckyshop123!@#}
ports:
- "${REDIS_PORT:-6379}:6379"
volumes:
- redis_data:/data
- ./docker/redis/redis.conf:/etc/redis/redis.conf
networks:
- sass-platform-net
restart: unless-stopped
labels:
- "com.docker.compose.project.working_dir=${PROJECT_NAME}"
volumes:
mysql_db_data:
redis_data:
xdebug_logs:
networks:
sass-platform-net:
driver: bridge

View File

@@ -14,7 +14,7 @@ services:
build: build:
context: ./docker/php context: ./docker/php
dockerfile: Dockerfile dockerfile: Dockerfile
container_name: ${PROJECT_NAME}_php container_name: ${PROJECT_NAME}_${APP_ENV}_php
restart: always restart: always
extra_hosts: extra_hosts:
- "host.docker.internal:host-gateway" # 支持主机名解析 - "host.docker.internal:host-gateway" # 支持主机名解析
@@ -49,13 +49,13 @@ services:
networks: networks:
- sass-platform-net - sass-platform-net
labels: labels:
- "com.docker.compose.project.working_dir=${PROJECT_NAME}" - "com.docker.compose.project.working_dir=${PROJECT_NAME}_${APP_ENV}"
nginx: nginx:
build: build:
context: ./docker/nginx context: ./docker/nginx
dockerfile: Dockerfile dockerfile: Dockerfile
container_name: ${PROJECT_NAME}_nginx container_name: ${PROJECT_NAME}_${APP_ENV}_nginx
restart: always restart: always
ports: ports:
- "${NGINX_PORT:-80}:80" - "${NGINX_PORT:-80}:80"
@@ -73,11 +73,11 @@ services:
networks: networks:
- sass-platform-net - sass-platform-net
labels: labels:
- "com.docker.compose.project.working_dir=${PROJECT_NAME}" - "com.docker.compose.project.working_dir=${PROJECT_NAME}_${APP_ENV}"
db: db:
image: mysql:5.7.44 image: mysql:5.7.44
container_name: ${PROJECT_NAME}_mysql container_name: ${PROJECT_NAME}_${APP_ENV}_mysql
environment: environment:
<<: *shared-api-env <<: *shared-api-env
volumes: volumes:
@@ -94,12 +94,12 @@ services:
- --collation-server=utf8mb4_unicode_ci - --collation-server=utf8mb4_unicode_ci
- --innodb_buffer_pool_size=256M - --innodb_buffer_pool_size=256M
labels: labels:
- "com.docker.compose.project.working_dir=${PROJECT_NAME}" - "com.docker.compose.project.working_dir=${PROJECT_NAME}_${APP_ENV}"
# Redis 服务(可选) # Redis 服务(可选)
redis: redis:
image: redis:8.2 image: redis:8.2
container_name: ${PROJECT_NAME}_redis container_name: ${PROJECT_NAME}_${APP_ENV}_redis
environment: environment:
REDIS_PASSWORD: ${REDIS_PASSWORD:-luckyshop123!@#} REDIS_PASSWORD: ${REDIS_PASSWORD:-luckyshop123!@#}
REDISCLI_AUTH: ${REDIS_PASSWORD:-luckyshop123!@#} REDISCLI_AUTH: ${REDIS_PASSWORD:-luckyshop123!@#}
@@ -112,29 +112,32 @@ services:
- sass-platform-net - sass-platform-net
restart: unless-stopped restart: unless-stopped
labels: labels:
- "com.docker.compose.project.working_dir=${PROJECT_NAME}" - "com.docker.compose.project.working_dir=${PROJECT_NAME}_${APP_ENV}"
volumes: volumes:
mysql_db_data: mysql_db_data:
name: ${PROJECT_NAME}_${APP_ENV}_mysql_db_data
driver: local driver: local
driver_opts: driver_opts:
type: none type: none
o: bind o: bind
device: ./docker/mysql_db_data device: ./docker/mysql_db_data/${APP_ENV}
redis_data: redis_data:
name: ${PROJECT_NAME}_${APP_ENV}_redis_data
driver: local driver: local
driver_opts: driver_opts:
type: none type: none
o: bind o: bind
device: ./docker/redis_data device: ./docker/redis_data/${APP_ENV}
xdebug_logs: xdebug_logs:
name: ${PROJECT_NAME}_${APP_ENV}_xdebug_logs
driver: local driver: local
driver_opts: driver_opts:
type: none type: none
o: bind o: bind
device: ./docker/xdebug_logs device: ./docker/xdebug_logs/${APP_ENV}
networks: networks:
sass-platform-net: sass-platform-net:
name: ${PROJECT_NAME}_net name: ${PROJECT_NAME}_${APP_ENV}_net
driver: bridge driver: bridge

View File

@@ -6,7 +6,7 @@ DEFAULT_TIMEZONE = Asia/Shanghai
default_lang = zh-cn default_lang = zh-cn
[DATABASE] [DATABASE]
TYPE = mysql TYPE = mysql
HOSTNAME = dev-newshop_mysql HOSTNAME = db
DATABASE = shop_mallnew DATABASE = shop_mallnew
USERNAME = shop_mallnew USERNAME = shop_mallnew
PASSWORD = shop_mallnew PASSWORD = shop_mallnew
@@ -16,7 +16,7 @@ DEBUG = true
[RRDATABASE] [RRDATABASE]
HOSTNAME = host.docker.internal HOSTNAME = host.docker.internal
[redis] [redis]
HOST = dev-newshop_redis HOST = redis
PORT = 6379 PORT = 6379
PASSWORD = 'luckyshop123!@#' PASSWORD = 'luckyshop123!@#'
EXPIRY = 604800 EXPIRY = 604800

22
src/.env.local Normal file
View File

@@ -0,0 +1,22 @@
APP_DEBUG = true
APP_TRACE = true
[APP]
DEFAULT_TIMEZONE = Asia/Shanghai
[LANG]
default_lang = zh-cn
[DATABASE]
TYPE = mysql
HOSTNAME = db
DATABASE = shop_dev
USERNAME = shop_mallnew
PASSWORD = shop_mallnew
HOSTPORT = 3306
CHARSET = utf8
DEBUG = true
[RRDATABASE]
HOSTNAME = redis
[redis]
HOST = redis
PORT = 6379
PASSWORD = 'luckyshop123!@#'
EXPIRY = 604800

View File

@@ -68,12 +68,13 @@ if ($appEnv) {
if (is_file($envFile)) { if (is_file($envFile)) {
$app->env->load($envFile); $app->env->load($envFile);
} }
} } else {
echo "⚠️ 警告未设置APP_ENV环境变量默认使用local环境。\n";
// 3. 为了兼容性,如果存在.env.local也加载优先级最高 // 3. 为了兼容性,如果存在.env.local也加载优先级最高
if (is_file(__DIR__ . '/.env.local')) { if (is_file(__DIR__ . '/.env.local')) {
$app->env->load(__DIR__ . '/.env.local'); $app->env->load(__DIR__ . '/.env.local');
} }
}
// 执行HTTP应用并响应 // 执行HTTP应用并响应
$http = $app->http; $http = $app->http;

View File

@@ -21,12 +21,14 @@ if ($appEnv) {
if (is_file($envFile)) { if (is_file($envFile)) {
$app->env->load($envFile); $app->env->load($envFile);
} }
} } else {
echo "⚠️ 警告未设置APP_ENV环境变量默认使用local环境。\n";
// 3. 为了兼容性,如果存在.env.local也加载优先级最高 // 3. 为了兼容性,如果存在.env.local也加载优先级最高
if (is_file(__DIR__ . '/.env.local')) { if (is_file(__DIR__ . '/.env.local')) {
$app->env->load(__DIR__ . '/.env.local'); $app->env->load(__DIR__ . '/.env.local');
} }
}
// 应用初始化 // 应用初始化
$app->console->run(); $app->console->run();