Docker容器化部署實戰:Spring Boot + MySQL + Nginx 一鍵部署完整指南

?? 前言

容器化技術已經成為現代軟件部署的標準實踐。作為一名DevOps工程師,我在過去幾年中參與了數十個項目的容器化改造,深刻體會到Docker在提升部署效率、環境一致性和運維便利性方面的巨大價值。

今天我將通過一個完整的實戰案例,詳細展示如何使用Docker部署一個包含Spring Boot后端、MySQL數據庫和Nginx反向代理的完整Web應用,讓你從零開始掌握容器化部署的核心技能!

?? 本文你將學到:

  • Docker容器化的核心概念和最佳實踐
  • Dockerfile編寫技巧和優化策略
  • docker-compose多容器編排
  • Spring Boot應用的容器化實踐
  • MySQL數據庫容器化配置
  • Nginx反向代理和負載均衡
  • 生產環境部署和監控方案

?? 環境準備

系統要求

# 操作系統:Linux/macOS/Windows
- Docker Engine 20.10+
- Docker Compose 2.0+
- 最少 4GB 內存
- 最少 20GB 可用磁盤空間

安裝Docker

Linux (Ubuntu/CentOS):

# 安裝Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh# 啟動Docker服務
sudo systemctl start docker
sudo systemctl enable docker# 添加當前用戶到docker組
sudo usermod -aG docker $USER# 安裝docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.12.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

驗證安裝:

docker --version
docker-compose --version

??? 項目架構設計

整體架構圖

┌─────────────────────────────────────────────┐
│                用戶請求                      │
└─────────────────┬───────────────────────────┘│
┌─────────────────▼───────────────────────────┐
│            Nginx (Port 80)                 │
│        ? 反向代理                           │
│        ? 負載均衡                           │
│        ? 靜態資源服務                        │
└─────────────────┬───────────────────────────┘│
┌─────────────────▼───────────────────────────┐
│        Spring Boot App (Port 8080)         │
│        ? REST API                          │
│        ? 業務邏輯處理                        │
│        ? 數據庫操作                          │
└─────────────────┬───────────────────────────┘│
┌─────────────────▼───────────────────────────┐
│           MySQL (Port 3306)                │
│        ? 數據持久化                          │
│        ? 數據備份                            │
└─────────────────────────────────────────────┘

容器編排策略

# 服務依賴關系
nginx:depends_on: [app]app:depends_on: [mysql]mysql:# 獨立啟動

?? Spring Boot應用容器化

項目結構

my-spring-app/
├── src/
│   └── main/
│       ├── java/
│       └── resources/
│           └── application.yml
├── Dockerfile
├── docker-compose.yml
├── nginx/
│   └── nginx.conf
├── mysql/
│   ├── init.sql
│   └── my.cnf
└── scripts/├── deploy.sh└── backup.sh

優化的Dockerfile

多階段構建Dockerfile:

# 第一階段:構建階段
FROM maven:3.8.6-openjdk-17-slim AS builder# 設置工作目錄
WORKDIR /app# 復制Maven配置文件,利用Docker緩存
COPY pom.xml .
COPY src ./src# 構建應用
RUN mvn clean package -DskipTests# 第二階段:運行階段
FROM openjdk:17-jre-slim# 創建非root用戶
RUN groupadd -r appuser && useradd -r -g appuser appuser# 安裝必要的工具
RUN apt-get update && apt-get install -y \curl \jq \&& rm -rf /var/lib/apt/lists/*# 設置工作目錄
WORKDIR /app# 從構建階段復制jar包
COPY --from=builder /app/target/*.jar app.jar# 創建日志目錄
RUN mkdir -p /app/logs && chown -R appuser:appuser /app# 切換到非root用戶
USER appuser# 健康檢查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \CMD curl -f http://localhost:8080/actuator/health || exit 1# 暴露端口
EXPOSE 8080# JVM優化參數
ENV JAVA_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC -XX:+UseContainerSupport"# 啟動應用
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]

應用配置優化

application.yml (容器化配置):

server:port: 8080# 關閉Tomcat訪問日志(由容器日志管理)tomcat:accesslog:enabled: falsespring:application:name: my-spring-app# 數據庫配置(容器環境)datasource:url: jdbc:mysql://mysql:3306/app_db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=trueusername: ${DB_USERNAME:root}password: ${DB_PASSWORD:123456}driver-class-name: com.mysql.cj.jdbc.Driver# 連接池配置hikari:minimum-idle: 5maximum-pool-size: 20idle-timeout: 300000connection-timeout: 20000max-lifetime: 1200000# JPA配置jpa:hibernate:ddl-auto: validateshow-sql: falseproperties:hibernate:dialect: org.hibernate.dialect.MySQL8Dialectformat_sql: false# 批量處理優化jdbc:batch_size: 20order_inserts: trueorder_updates: true# Redis配置(如果需要)redis:host: redisport: 6379database: 0timeout: 3000mslettuce:pool:max-active: 8max-idle: 8min-idle: 0# 監控配置
management:endpoints:web:exposure:include: health,info,metrics,prometheusendpoint:health:show-details: alwayshealth:redis:enabled: false# 日志配置
logging:level:com.example: INFOorg.springframework.web: WARNorg.hibernate.SQL: WARNpattern:console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"file:name: /app/logs/application.logmax-size: 100MBmax-history: 30

??? MySQL數據庫容器化

MySQL配置文件

mysql/my.cnf:

[mysqld]
# 基本配置
user = mysql
default-storage-engine = InnoDB
socket = /var/lib/mysql/mysql.sock
pid-file = /var/lib/mysql/mysql.pid# 字符集配置
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'# 連接配置
max_connections = 200
max_connect_errors = 6000
open_files_limit = 65535
table_open_cache = 128
max_allowed_packet = 64M
binlog_cache_size = 1M
max_heap_table_size = 8M
tmp_table_size = 16M# 查詢緩存配置
query_cache_size = 8M
query_cache_type = 1
query_cache_limit = 2M# InnoDB配置
innodb_additional_mem_pool_size = 4M
innodb_buffer_pool_size = 256M
innodb_data_file_path = ibdata1:10M:autoextend
innodb_write_io_threads = 4
innodb_read_io_threads = 4
innodb_thread_concurrency = 0
innodb_purge_threads = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 2M
innodb_log_file_size = 32M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120# 慢查詢日志
slow_query_log = 1
slow_query_log_file = /var/lib/mysql/mysql-slow.log
long_query_time = 3# 二進制日志
log-bin = mysql-bin
binlog_format = mixed
expire_logs_days = 7[mysql]
default-character-set = utf8mb4[client]
default-character-set = utf8mb4

數據庫初始化腳本

mysql/init.sql:

-- 創建應用數據庫
CREATE DATABASE IF NOT EXISTS app_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;-- 創建應用用戶
CREATE USER IF NOT EXISTS 'app_user'@'%' IDENTIFIED BY 'app_password_2024!';
GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'%';
FLUSH PRIVILEGES;-- 使用應用數據庫
USE app_db;-- 創建用戶表
CREATE TABLE IF 

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/88087.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/88087.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/88087.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

分布式選舉算法<一> Bully算法

分布式選舉算法詳解:Bully算法 引言 在分布式系統中,節點故障是不可避免的。當主節點(Leader)發生故障時,系統需要快速選舉出新的主節點來保證服務的連續性。Bully算法是一種經典的分布式選舉算法,以其簡…

高效調試 AI 大模型 API:用 Apipost 實現 SSE 流式解析與可視化

借助 AI 大模型的實時接口(如 OpenAI GPT 或其他第三方模型 API),開發者可以通過 SSE(Server-Sent Events)流式處理數據,實時獲取模型的逐步輸出。這一技術已廣泛應用于實時問答、代碼生成等領域。本文將基…

【網絡產品經營】園區網絡

園區網絡的產品經營邏輯發生顯著變化,從傳統的“連接功能”導向轉向“業務體驗驅動”,并結合行業場景化需求、技術架構革新及智能化能力提升,形成多維度的產品策略升級。 一、技術架構變革:從多層復雜到極簡全光 傳統架構的瓶頸與…

EasyExcel 4.X 讀寫數據

文章目錄 EasyExcel與SpringBoot集成讀數據讀取數據的流程定義實體類簡單讀取自定義監聽器 讀取指定sheet和所有sheet多行頭讀取數據格式轉換列表數據實體類自定義轉換器自定義監聽器數據讀取 寫數據簡單數據寫出存儲到磁盤返回前端下載 寫出指定列寬,和數值精度丟失…

JVM內存管理<一>:Java內存異常問題排查

一、 內存溢出問題的排查 1. 使用工具 - jdk自帶 jmapvisualvm 2. 流程 堆轉儲: (1) 方法一:程序運行時,采用:jmap -dump:formatb,filed:\\data\\xxlJob.hprof 23300 進行堆文件的轉儲 (2) 方法二:在內存溢出的時候…

Android中Glide.with().load().into() 應付面試源碼解析

1. with(this):生命周期綁定 Glide.with(Activity/Fragment/Context) 核心機制:創建與 UI 生命周期綁定的 RequestManager 底層實現: 通過 RequestManagerRetriever 獲取單例 非 Application 上下文: 向 Activity/Fragment 添加…

#### es相關內容的索引 ####

倒排索引 結構 #### es倒排索引的結構 ####-CSDN博客 向量索引 結構應用 #### es向量檢索 的 結構及應用_es 向量 文本檢索-CSDN博客 ann算法 ann算法的種類有哪些,之間的區別,各自的適用場景-CSDN博客 地理信息索引 es地理信息索引的類型以及geo_po…

小飛電視:智能電視與移動設備的娛樂新選擇

在數字娛樂時代,人們對于影視內容的需求日益增長,不僅追求豐富多樣的節目選擇,還希望獲得便捷、個性化的觀看體驗。小飛電視正是這樣一款專為智能電視和移動設備設計的視頻娛樂應用,它憑借海量的影視資源、高清流暢的播放效果以及…

刪除node并且重裝然后重裝vue

參考第一篇文章 node.js卸載與安裝超詳細教程_node卸載重裝-CSDN博客 第二篇文章安裝vue Vue安裝與配置教程(非常詳細)_安裝vue-CSDN博客

基于YOLOv10算法的交通信號燈檢測與識別

目錄 一.🦁 寫在前面1.1 實現模塊劃分1.2 優化與實時性支持 二.🦁 相關技術與理論基礎2.1 各版本yolo對比2.2 YOLOv10網絡結構 三.🦁 結果分析3.1 訓練損失與驗證損失分析3.2 精確率(Precision)、召回率(Re…

洪水風險圖制作全流程:HEC-RAS 與 ArcGIS 的耦合應用

技術點目錄 一、HER-RAS理論二、一維數學模型基本地形導入三、恒定流、非恒定流一維數學模型水流計算四、一維數學模型計算結果分析五、一維數學模型增設構筑物六、二維河道水動力模擬七、HEC-RAS在潰壩模型中的應用八、HEC-RAS在洪水風險圖中的應用了解更多 —————————…

視覺大語言模型未能充分利用視覺表征

視覺大語言模型未能充分利用視覺表征 FesianXu 20250612 at Wechat Search Team 前言 這兩天看到一篇新掛在arxiv上的文章 [1],討論了下視覺大語言模型的視覺表征退化問題。先前的研究將VLM缺陷歸咎于視覺編碼器薄弱,并提出集成編碼器方案以彌補不足&am…

SSRF3 任意文件讀取

一.任意文件讀取 http://192.168.112.12/pikachu-master/vul/ssrf/ssrf_curl.php?urlfile:///etc/passwd 讀取文件使用 file://文件路徑即可,這里我們換協議為file,然后從根目錄開始讀取。 /etc/passwd 我們這樣修改完url路徑后查看結果可以看到文件內…

洛谷P3953 [NOIP 2017 提高組] 逛公園

洛谷P3953 [NOIP 2017 提高組] 逛公園 洛谷題目傳送門 題目背景 NOIP2017 D1T3 題目描述 策策同學特別喜歡逛公園。公園可以看成一張 N N N 個點 M M M 條邊構成的有向圖,且沒有 自環和重邊。其中 1 1 1 號點是公園的入口, N N N 號點是公園的出…

Vue3+TypeScript+Element Plus 表格展開行優化方案

在 Vue3 TypeScript Element Plus 項目中優化表格展開行的內存使用,主要從 渲染優化、數據管理 和 內存回收 三方面入手。以下是最佳實踐和完整解決方案: 1. 懶加載展開內容(核心優化) 只當行展開時才渲染內容,避免…

OpenCV——直方圖與匹配

直方圖與匹配 一、直方圖簡介二、直方圖統計三、直方圖比較四、直方圖均衡化五、自適應的直方圖均衡化六、直方圖反向投影七、模板匹配 一、直方圖簡介 圖像直方圖(Histogram)是一種頻率分布圖,它描述了不同強度值在圖像中出現的頻率。圖像直…

通義大模型在文檔自動化處理中的高效部署指南(OCR集成與批量處理優化)

1. 傳統OCR解決方案常面臨識別精度低、版面分析能力弱、處理效率瓶頸等問題。通義大模型憑借其多模態理解和生成能力,為文檔處理領域帶來革命性突破。本文將深入探討如何高效部署通義大模型實現端到端的文檔自動化處理,特別聚焦OCR集成與批量處理優化兩…

Ubuntu20.04通過ssh協議配置遠程終端

一、在目標計算機(即被連接的計算機)上操作: 1、安裝 OpenSSH 服務器: sudo apt update sudo apt install openssh-server3、啟動并設置 SSH 服務開機自啟: sudo systemctl enable --now ssh二、在源計算機&#xf…

《HTTP權威指南》 第7章 緩存

帶著問題學習: 緩存如何提高性能如何衡量緩存的有效性緩存置于何處作用最大HTTP如何保持緩存副本的新鮮度緩存如何與其他緩存及服務器通信 web緩存是可以自動保存常見文檔副本的HTTP設備。 緩存優點 減少冗余的數據傳輸,節省網絡費用緩解網絡瓶頸問題&…

第十三章 模板

函數模板 函數模板使用 函數模板注意事項 自動類型推導,必須推導出一致的數據類型T,才可以使用 模板必須要確定出T的數據類型,才可以使用 普通函數和函數模板的類型轉化 普通函數隱式類型轉化(char轉int) 函數模板正常使用不會發生…