Skip to content

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.jar

2、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 -d

docker直接启动服务(不推荐)

# 基础运行
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项目示例

  1. 创建 .dockerignore 文件,在项目根目录创建 .dockerignore,排除不需要的文件:
node_modules
.vitepress/cache
.git
  1. 创建 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;
        }
    }
}
  1. 创建 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;"]
  1. 构建 Docker 镜像,在项目根目录执行以下命令构建镜像.
docker build -t vitepress-doc .

参数说明:

  • -t vitepress-doc:为镜像指定名称和标签
  • .:使用当前目录作为构建上下文
  1. 运行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:容器自动重启策略
  1. 使用docker compose简化部署 创建 docker-compose.yml 文件:
services:
  vitepress:
    build: .
    container_name: vitepress-container
    ports:
      - "80:80"
    restart: unless-stopped
    volumes:
      - ./logs:/var/log/nginx

docker compose 启动命令:

docker-compose up -d

docker设置容器时间为北京时间

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/timezone

docker-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

Released under the MIT License.