文章目錄
- 整合版部署文檔
- 部署架構圖
- 1. 項目目錄結構
- 增加注釋的 Dockerfile 配置
- (1) 后端服務1 Dockerfile (`backend/service1/Dockerfile`)
- (2) 后端服務2 Dockerfile (`backend/service2/Dockerfile`)
- Dockerfile 配置說明
- 重要注意事項
- 3. Nginx 配置
- (1) 主配置文件 (`nginx/nginx.conf`)
- (2) 前端路由配置 (`nginx/conf.d/app.conf`)
- (3) 管理后臺配置 (`nginx/conf.d/admin.conf`)
- 4. Docker Compose 配置
- 5. 部署操作流程
- 6. 關鍵配置說明
- (1) 網絡通信原理
- (2) 健康檢查機制
- 7. 高級優化配置
- HTTPS 配置示例
- 安全增強配置
- 8. 常見問題解決
- 9. 方案優勢
- 10. 驗證部署成功
整合版部署文檔
部署架構圖
1. 項目目錄結構
deploy/
├── docker-compose.yml # 容器編排主文件
├── frontend/ # 前端靜態資源
│ ├── app/ # 主應用構建產物
│ │ ├── index.html
│ │ ├── static/
│ │ └── favicon.ico
│ └── admin/ # 管理后臺構建產物
│ ├── index.html
│ ├── static/
│ └── favicon.ico
├── backend/ # 后端服務
│ ├── service1/ # 服務1
│ │ ├── Dockerfile
│ │ └── service1.jar
│ └── service2/ # 服務2
│ ├── Dockerfile
│ └── service2.jar
└── nginx/ # Nginx配置├── nginx.conf└── conf.d/ # 站點配置├── app.conf # 主應用配置└── admin.conf # 管理后臺配置
增加注釋的 Dockerfile 配置
(1) 后端服務1 Dockerfile (backend/service1/Dockerfile
)
# 使用官方 OpenJDK 17 基礎鏡像
FROM eclipse-temurin:17-jdk# 設置容器內工作目錄為 /app
WORKDIR /app# 將宿主機當前目錄下的 service1.jar 復制到容器工作目錄
COPY service1.jar .# 聲明容器運行時暴露的端口(8080)
EXPOSE 8080# 容器啟動時執行的命令 - 運行 Java 應用
CMD ["java", "-jar", "service1.jar"]
(2) 后端服務2 Dockerfile (backend/service2/Dockerfile
)
# 使用官方 OpenJDK 17 基礎鏡像
FROM eclipse-temurin:17-jdk# 設置容器內工作目錄為 /app
WORKDIR /app# 將宿主機當前目錄下的 service2.jar 復制到容器工作目錄
COPY service2.jar .# 聲明容器運行時暴露的端口(8081)
EXPOSE 8081# 容器啟動時執行的命令 - 運行 Java 應用
CMD ["java", "-jar", "service2.jar"]
Dockerfile 配置說明
指令 | 說明 |
---|---|
FROM | 指定基礎鏡像,這里使用官方 OpenJDK 17 鏡像作為運行環境 |
WORKDIR | 設置工作目錄,后續命令都在此目錄執行 |
COPY | 將本地文件復制到容器內,這里復制編譯好的 JAR 包 |
EXPOSE | 聲明容器運行時監聽的端口號,便于文檔化和端口映射 |
CMD | 指定容器啟動時執行的命令,這里是運行 Java 應用程序 |
重要注意事項
-
JAR 文件位置
確保 JAR 文件與 Dockerfile 在同一目錄下,否則構建會失敗 -
端口映射
在docker-compose.yml
中不需要顯式映射后端端口,因為:- 服務通過 Docker 內部網絡通信
- 外部訪問通過 Nginx 代理
-
多階段構建(高級用法)
如需在容器內編譯代碼,可使用多階段構建:# 第一階段:構建應用 FROM maven:3.8.6 AS build WORKDIR /app COPY . . RUN mvn clean package -DskipTests# 第二階段:運行應用 FROM eclipse-temurin:17-jdk WORKDIR /app COPY --from=build /app/target/service1.jar . CMD ["java", "-jar", "service1.jar"]
-
環境變量配置
應用配置應通過docker-compose.yml
的環境變量注入:environment:- DB_URL=jdbc:mysql://db:3306/app- REDIS_HOST=redis
-
時區設置
如需統一時區,可在 Dockerfile 中添加:RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
3. Nginx 配置
(1) 主配置文件 (nginx/nginx.conf
)
events {}
http {include /etc/nginx/conf.d/*.conf;# 全局優化配置gzip on;gzip_types text/plain text/css application/json application/javascript;keepalive_timeout 65;server_tokens off;
}
(2) 前端路由配置 (nginx/conf.d/app.conf
)
server {listen 80;server_name app.domain.com;location / {root /usr/share/nginx/html/app;try_files $uri $uri/ /index.html;index index.html;# 緩存與安全頭expires 1y;add_header Cache-Control "public";add_header X-Frame-Options "SAMEORIGIN";add_header X-Content-Type-Options "nosniff";}# 代理后端服務1location /api/service1 {proxy_pass http://service1:8080;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_connect_timeout 75s;}
}
(3) 管理后臺配置 (nginx/conf.d/admin.conf
)
server {listen 80;server_name admin.domain.com;location / {root /usr/share/nginx/html/admin;try_files $uri $uri/ /index.html;index index.html;# 禁用緩存add_header Cache-Control "no-store, no-cache, must-revalidate";}# 代理后端服務2location /api/service2 {proxy_pass http://service2:8081;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;# WebSocket支持proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";}# 健康檢查端點location = /health {return 200 'OK';add_header Content-Type text/plain;}
}
4. Docker Compose 配置
version: '3.8'services:# Nginx網關服務nginx:image: nginx:alpineports:- "80:80"volumes:- ./frontend/app:/usr/share/nginx/html/app:ro- ./frontend/admin:/usr/share/nginx/html/admin:ro- ./nginx/conf.d:/etc/nginx/conf.d- ./logs/nginx:/var/log/nginxnetworks:- app-networkrestart: unless-stoppedhealthcheck:test: ["CMD", "curl", "-f", "http://localhost/health"]interval: 30stimeout: 3s# 后端服務1service1:build:context: ./backend/service1environment:- SPRING_PROFILES_ACTIVE=prod- TZ=Asia/Shanghainetworks:- app-networkrestart: unless-stoppeddeploy:resources:limits:memory: 512M# 后端服務2service2:build:context: ./backend/service2environment:- SPRING_PROFILES_ACTIVE=prod- TZ=Asia/Shanghainetworks:- app-networkrestart: unless-stoppeddeploy:resources:limits:memory: 512M# 自定義網絡
networks:app-network:driver: bridgeipam:config:- subnet: 172.28.0.0/16
5. 部署操作流程
# 1. 準備目錄結構
mkdir -p deploy/{frontend/{app,admin},backend/{service1,service2},nginx/conf.d,logs/nginx}# 2. 放入項目文件
cp -r /path/to/app/dist/* deploy/frontend/app/
cp -r /path/to/admin/dist/* deploy/frontend/admin/
cp /path/to/service1.jar deploy/backend/service1/
cp /path/to/service2.jar deploy/backend/service2/# 3. 創建Nginx配置文件
# 將上述nginx配置寫入對應文件# 4. 啟動服務
docker-compose up -d --build# 5. 驗證部署
curl -I http://localhost/app/index.html
docker-compose logs -f nginx
6. 關鍵配置說明
(1) 網絡通信原理
- 所有服務通過
app-network
通信 - 容器間通過服務名自動解析(如
service1:8080
) - 靜態資源通過卷掛載實時更新
(2) 健康檢查機制
healthcheck:test: ["CMD", "curl", "-f", "http://localhost/health"]interval: 30stimeout: 3s
- 每30秒檢查Nginx狀態
- 失敗自動重啟容器
- 通過
/health
端點監控
7. 高級優化配置
HTTPS 配置示例
server {listen 443 ssl;server_name app.domain.com;ssl_certificate /etc/nginx/ssl/fullchain.pem;ssl_certificate_key /etc/nginx/ssl/privkey.pem;ssl_protocols TLSv1.2 TLSv1.3;# HSTS強制HTTPSadd_header Strict-Transport-Security "max-age=31536000" always;# 其他配置保持不變...
}
安全增強配置
server {# 安全頭部add_header Content-Security-Policy "default-src 'self'";add_header X-XSS-Protection "1; mode=block";# 禁用不安全方法if ($request_method !~ ^(GET|POST)$ ) {return 405;}
}
8. 常見問題解決
問題現象 | 解決方案 |
---|---|
靜態資源加載404 | chmod -R 755 deploy/frontend 確保權限正確 |
API代理超時(504) | 檢查proxy_connect_timeout 配置,驗證容器間網絡:docker-compose exec nginx ping service1 |
SPA路由刷新404 | 確認Nginx配置包含try_files $uri $uri/ /index.html |
跨域問題(CORS) | 在代理配置中添加Access-Control-Allow-* 頭信息 |
端口沖突 | 修改docker-compose.yml 中的端口映射:"8080:80" |
9. 方案優勢
- 高效部署:靜態資源實時掛載,無需重建容器
- 資源優化:使用輕量級Alpine鏡像(23MB),內存限制控制
- 生產級特性:
- 健康檢查自動恢復
- 日志持久化
- 安全頭部防護
- 靈活擴展:
# 添加新前端 mkdir deploy/frontend/new-app # 添加Nginx配置 vi deploy/nginx/conf.d/new-app.conf # 重載服務 docker-compose exec nginx nginx -s reload
10. 驗證部署成功
# 1. 檢查容器狀態
docker-compose ps# 2. 測試端點訪問
curl -H "Host: app.domain.com" http://localhost/api/service1/health
curl -H "Host: admin.domain.com" http://localhost/api/service2/health# 3. 檢查日志
tail -f deploy/logs/nginx/access.log
這個部署只能使用自己電腦配置的域名訪問才可以,
使用ip地址或者手機進行訪問的時候會發現前端訪問不到后端的服務,
但是卻可以訪問到前端頁面和后端服務的OpenApi,
后面查了好久也沒有找到是什么問題,就放棄了,要是有大佬知道的話,
還請指點一下?(??????‵?)感謝
本部署文檔和代碼以上傳gitee上:https://gitee.com/banhuayue/shangting-apartment.git
大家可以直接克隆。