Nginx部署前端项目示例
1、Dockerfile
# 基础镜像
From nginx
或使用轻量级基础镜像
FROM nginx:alpine
# 设置工作目录
WORKDIR /app
# 删除镜像默认的静态文件(可选)
#RUN rm -rf /usr/share/nginx/html/*
# 复制文件到容器
COPY ./dist/ /usr/share/nginx/html
# 复制自定义 Nginx 配置(可选)
#COPY nginx.conf /etc/nginx/conf.d/default.conf
COPY ./nginx.conf /etc/nginx/nginx.conf
# 设置权限(Alpine 镜像需显式配置)
RUN chmod -R 755 /usr/share/nginx/html
#声明容器暴露端口
EXPOSE 80
# 健康检查(可选)
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost/ || exit 1
#使用默认的nginx命令 (已在基础镜像中定义)
#CMD ["nginx", "-g", "daemon off;"]2、nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
location /prod-api/{
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 避免actuator暴露
if ($uri ~ "/actuator") {
return 403;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}3、docker-compose.yml
services:
wangshu-vitepress:
build: .
#container_name: vitepress-app
ports:
- "80:80"
restart: unless-stopped
labels:
- "traefik.enable=true"4、docker-compose启动服务
docker compose up -d部署springboot后端项目示例
1、Dockerfile
# 基础镜像
From openjdk:17
# 设置工作目录
WORKDIR /app
# 复制文件到容器
COPY manshu-api-1.0.0.jar /app/manshu-api-1.0.0.jar
# 声明需要暴露的端口
EXPOSE 8899
# 配置容器启动后执行的命令
ENTRYPOINT java -jar /app/manshu-api-1.0.0.jar2、docker-compose.yml
services:
db:
image: mysql:8
container_name: my_mysql
ports:
- "3306:3306"
volumes:
- ./mysql/conf:/etc/mysql/conf.d # 挂载自定义配置
- ./mysql/logs:/logs
- mysql_data:/var/lib/mysql
command: [
'mysqld',
'--innodb-buffer-pool-size=80M',
'--character-set-server=utf8mb4',
'--collation-server=utf8mb4_unicode_ci',
'--default-time-zone=+8:00',
'--lower-case-table-names=1'
]
environment:
MYSQL_DATABASE: 'mydatabase'
MYSQL_ROOT_PASSWORD: 123456
restart: on-failure # 仅故障时重启(退出码非0)
networks:
- mynet
healthcheck: # MySQL健康检查
test: [ "CMD", "mysqladmin", "ping", "-h", "localhost" ]
interval: 30s
timeout: 10s
retries: 5
redis:
image: redis
container_name: my_redis
ports:
- "6379:6379"
environment:
REDIS_PASSWORD: 123456
volumes:
- redis_data:/data
- ./redis/conf/redis.conf:/home/redis/redis.conf
restart: always # 强制自动恢复
networks:
- mynet
healthcheck: # Redis健康检查
test: [ "CMD", "redis-cli", "ping" ]
interval: 10s
timeout: 5s
manshutingyu:
build: .
image: manshutingyu:1.0.0
container_name: manshutingyu
ports:
- "8899:8899"
volumes:
- ./config:/config # 挂载生产环境配置
- ./logs:/var/log/
environment:
- SPRING_PROFILES_ACTIVE=prod
- SPRING_CONFIG_LOCATION=file:/config/
depends_on:
- redis
- db
networks:
- mynet
restart: unless-stopped # 自动重启除非手动停止
healthcheck: # 健康检查避免空重启
test: [ "CMD", "curl", "-f", "http://localhost:8899/health" ]
interval: 30s
timeout: 10s
retries: 3
networks:
mynet:
driver: bridge
volumes:
redis_data:
mysql_data:3、docker compose启动所有服务 docker compose启动服务语法格式如下:
docker compose up [options]
常用形式:docker compose up -d
常用选项:
-d:后台运行(detached mode)。
--build:强制重新构建镜像(即使镜像已存在)。
--force-recreate:强制重新创建容器(即使配置未更改)。
--scale SERVICE=NUM:指定某个服务的实例数量(如 --scale web=3)。
# 重新构建应用镜像
docker-compose build myapp
# 仅重启应用容器,不影响其他服务
docker-compose up -d --no-deps myapp
#普通启动服务
docker-compose up -ddocker直接启动服务(不推荐)
# 基础运行
docker run -p 8080:8080 --name myapp springboot-app:1.0
# 生产环境推荐(资源限制+自动重启)
docker run -d \
--name myapp \
--restart=always \
--memory=512m \
--cpus=1 \
-p 8080:8080 \
-v /host/path/logs:/app/logs \
springboot-app:1.0部署vitepress项目示例
- 创建 .dockerignore 文件,在项目根目录创建 .dockerignore,排除不需要的文件:
node_modules
.vitepress/cache
.git- 创建 nginx.conf 配置文件
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
location /prod-api/{
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 配置静态资源缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# 避免actuator暴露
if ($uri ~ "/actuator") {
return 403;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}- 创建 Dockerfile 文件,创建 Dockerfile 来定义镜像构建过程:
# 构建阶段
FROM node:23-alpine as build-stage
WORKDIR /app
# 复制 package.json 并安装依赖
COPY package.json ./
RUN npm install -g pnpm && pnpm install
# 复制源代码并构建
COPY . .
RUN pnpm run docs:build
# 生产阶段
FROM nginx:alpine as production-stage
# 创建非 root 用户
RUN addgroup -g 1001 -S nginx && \
adduser -S nginx -u 1001
# 复制构建产物
COPY --from=build-stage /app/docs/.vitepress/dist /usr/share/nginx/html
# 复制 Nginx 配置
COPY nginx.conf /etc/nginx/conf.d/default.conf
# 设置权限
RUN chown -R nginx:nginx /usr/share/nginx/html
# 切换到非 root 用户
USER nginx
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]- 构建 Docker 镜像,在项目根目录执行以下命令构建镜像.
docker build -t vitepress-doc .参数说明:
- -t vitepress-doc:为镜像指定名称和标签
- .:使用当前目录作为构建上下文
- 运行docker容器
docker run -d \
--name vitepress-container \
-p 8080:80 \
--restart unless-stopped \
vitepress-doc参数说明:
- -d:后台运行容器
- --name:为容器指定名称
- -p 8080:80:将容器的 80 端口映射到主机的 8080 端口
- --restart unless-stopped:容器自动重启策略
- 使用docker compose简化部署 创建 docker-compose.yml 文件:
services:
vitepress:
build: .
container_name: vitepress-container
ports:
- "80:80"
restart: unless-stopped
volumes:
- ./logs:/var/log/nginxdocker compose 启动命令:
docker-compose up -ddocker设置容器时间为北京时间
dockerFile
yml
# 方法1:安装时区配置并设置
RUN apt-get update && apt-get install -y tzdata && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "Asia/Shanghai" > /etc/timezone
# 或者方法2:仅设置环境变量
ENV TZ=Asia/Shanghai
# 方法3:对于Alpine镜像
RUN apk add --no-cache tzdata && \
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "Asia/Shanghai" > /etc/timezonedocker-compose.yml
yml
version: '3.8'
services:
app:
image: your-image:tag
environment:
- TZ=Asia/Shanghai
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
# 或者使用宿主机北京时间
# - /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime:ro