最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Boot+Nginx+MySQL容器化實戰(zhàn)指南

 更新時間:2026年03月20日 16:33:27   作者:灰陽陽  
這篇文章主要介紹了Spring Boot+Nginx+MySQL容器化實戰(zhàn)指南,本文通過思路代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧

一、實現(xiàn)目標

1.1 概述

編寫一個spring-boot程序,返回user表的所有數(shù)據(jù),并且通過nginx反向代理實現(xiàn)。

1.2 表定義

# 文件名:init.sql 
DROP DATABASE IF EXISTS test;
CREATE DATABASE `test` DEFAULT CHARACTER SET utf8mb4;
USE `test`;
CREATE TABLE `users` (
    `sno` int(11) DEFAULT NULL,
    `sname` varchar(50) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO users (sno, sname) VALUES
    (1, 'hyy'),
    (2, 'blog');

小提示:
init.sql需要存放到容器的docker-entrypoint-initdb.d路徑,mysql容器會自動初始化表結構以及一些原始數(shù)據(jù)!

1.3 spring-boot程序

controller:

package com.example.docker_compose;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class Controller {
    @Autowired
    JdbcTemplate jdbcTemplate;
    @RequestMapping("/list")
    @ResponseBody
    public Object Users(){
        return jdbcTemplate.queryForList("select * from users");
    }
}

application.properties配置:

spring.application.name=docker_compose #項目名
spring.datasource.url=jdbc:mysql://mysql容器名稱:3306/數(shù)據(jù)庫名稱
spring.datasource.username=root # mysql用戶名
spring.datasource.password=1111 # mysql密碼

注意:

  1. jdbc的url一定不能錯,尤其是容器名稱,后面我們定義容器網(wǎng)絡,它會根據(jù)容器名稱尋址(域名解析)。
  2. Docker Compose 未自定義容器名時,容器會生成默認名稱,規(guī)則為:[項目目錄名]-[服務名]-[容器啟動序號](例如 p12_spring-mysql-1)
  3. 默認情況下,容器名稱會隨項目目錄、啟動次數(shù)變化,不建議直接用于 JDBC 配置;可以使用container_name自定義容器名稱(后續(xù)會講到)

1.4 nginx配置文件

# 文件名:myapp.conf(只要是.conf后綴都行)
server{ 
  listen 80; #容器內(nèi)部監(jiān)聽80端口
  access_log off; # 關閉日志記錄-減少io
  location / {# /所有請求,轉(zhuǎn)發(fā)到user/list路徑下
    proxy_pass http://myapp:8080/user/list; 
  }
}

小提示:
myapp.conf文件配置到容器/etc/nginx/conf.d可以實現(xiàn)路徑轉(zhuǎn)發(fā)

二、spring-boot程序打包

2.1 生成jar包

spring-boot項目編寫完后,點擊maveclear清理緩存,然后點擊package打包:

提示BUILD SUCCESS后,target路徑下會有一個編譯好的jar包:

2.2 通過scp命令上傳到服務器

首先創(chuàng)建好服務器這邊的項目路徑:

pwd
/root/docker_stu/docker_compose/p11_blog

后續(xù)docker-compose默認會以p11_blog命名容器

然后直接在控制臺(windows終端或者idea的控制臺都可以)
執(zhí)行scp命令:

scp jar包路徑.jar 用戶名(一般都是root)@你的公網(wǎng)IP:你的服務器項目路徑

執(zhí)行完命令會提示輸入服務器密碼,輸入完成后,即可開始傳輸jar

三、創(chuàng)建宿主機依賴路徑、文件

3.1 宿主機mysql初始化文件

cd 回到項目路徑
mkdir mysqlinit
cd ./mysqlinit
vim init.sql

然后把剛才我們提及到的1.2中的init.sql拷貝到這個路徑(宿主機路徑)

3.2 宿主機nginx配置文件

cd 回到項目路徑
mkdir -p ./nginxhome/conf.d 
cd ./nginxhome/conf.d
vim myapp.conf

1.4中的myapp.conf配置文件拷貝過去即可,功能1.4已經(jīng)講過,這里不過多贅述

四、定義docker-compose.yml

注意
docker-compose.yml直接放到項目路徑,那么其工作目錄默認就是項目路徑,下面的存儲卷路徑默認以項目路徑為基準;

4.1 nginx容器定義

# 文件名:docker-compose.yml
services:
  web:
    image: nginx:latest
    volumes:
      - ./nginxhome/conf.d:/etc/nginx/conf.d #簡潔寫法,定義綁定卷
    ports:
      - 8080:80 #端口映射
    expose:
      - 80 #聲明容器內(nèi)部開放端口

4.2 mysql容器定義

# 文件名:docker-compose.yml
services:
  web:
  ...省略
  mysql:
    image: mysql:5.7
    container_name: mysql_container #定義容器名稱
    volumes:
      - type: bind #這是完整方式定義綁定卷
        source: ./mysqlinit/
        target: /var/lib/mysql/
        read_only: true
        volume:
          nocopy: false  #若宿主機目錄為空,復制容器數(shù)據(jù)到宿主機目錄

4.3 spring-boot容器定義

這里我們使用openjdk鏡像去驅(qū)動jar包:

# 文件名:docker-compose.yml
services:
  web:
  ....省略
  myapp:
    image: openjdk:17 #這里版本,使用和自己java版本一致的就行
    volumes:
      - ./app:/app/ #簡潔定義綁定卷
    command: java -jar /app/docker_compose-0.0.1-SNAPSHOT.jar #設置啟動命令

4.4容器依賴關系與健康檢查

4.4.1 概述

回到第一節(jié)的目標上,我們需要啟動一個spring-boot程序,查詢user表內(nèi)容,并且通過nginx實現(xiàn)反向代理;這里涉及多個容器:myapp、mysql、nginx;
那么容器之間一定存在這樣的依賴關系:

  1. myapp查詢user表需要mysql
  2. nginx反向代理myapp,前提是myapp要優(yōu)先于nginx啟動

docker-compose.yml提供了depends_on來實現(xiàn)這種容器之間的依賴需求。
此外這還引入了一個問題:如何判斷依賴的容器是否成功啟動呢?
docker-compose.yml也很貼心,給我們提供了healthcheck來自定義容器如何算是啟動成功;
接下來,我會接著用這個案例來具體顯示其用法

4.4.2 健康檢查

根據(jù)4.4.1的說明myappmysql是被依賴的容器,那么它們兩個一定需要健康檢查(雖然nginx健康檢出是不必須的,但是建議也加上,實現(xiàn)增肌)

#文件名:docker-compose.yml
services:
  mysql:
    healthcheck:
      test: mysql -u root -p1111 -e 'select 1;' #mysql自帶的健康檢查
      interval: 10s
        timeout: 10s
        retries: 5
  myapp:
    healthcheck:
      test: ["CMD", "sh", "-c", "jps -l | grep 'docker_compose-0.0.1-SNAPSHOT.jar' || exit 1"] #該命令openjdk自帶的
      interval: 10s #檢查間隔時間
      timeout: 5s # 定義超時時間
      retries: 5 # 重試最大次數(shù)
      start_period: 30s #給一個啟動緩沖時間,30s之后才開始記錄重試次數(shù)

4.4.3 容器依賴關系(也叫容器拓撲)

以下為省略寫法(只含有依賴定義):

#文件名:docker-compose.yml
services:
  web:
    depends_on:
      mysql:
        condition: service_healthy #condition不為headlthy則容器編排會報錯
      myapp:
        condition: service_healthy
  myapp:
    depends_on:
      mysql:
        condition: service_healthy

condition健康類型的選項:

狀態(tài)值含義
service_healthy依賴的服務容器狀態(tài)為 healthy(健康檢查通過)
service_started依賴的服務容器只是 running(進程啟動,不校驗健康狀態(tài))—— 這是默認值
service_completed_successfully依賴的服務容器已 exited 且退出碼為 0(適用于一次性任務,如初始化腳本)

4.5 容器網(wǎng)絡定義

還是回到第一節(jié)講到的目標,配置Spring-boot+Mysql+Nginx容器編排,網(wǎng)絡類型毫無疑問,bridge是最合適的;所以我們可以定義一個自定義bridge網(wǎng)絡,讓三個容器都加入該自定義網(wǎng)絡即可:

#文件名:docker-compose.yml
services:
  web:
    image: nginx:latest #指定容器的nginx鏡像版本
    volumes:
      - ./nginxhome/conf.d:/etc/nginx/conf.d #簡潔寫法,定義綁定卷
    ports:
      - 8080:80 #端口映射
    expose:
      - 80 #聲明容器內(nèi)部開放端口
    depends_on:
      mysql:
        condition: service_healthy
      myapp:
        condition: service_healthy
    networks:
      - mybridge_network
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: 1111
    container_name: mysql_container
    volumes:
      - type: bind #這是完整定義方式
        source: ./mysql/mysqllib/
        target: /var/lib/mysql/ #mysql元數(shù)據(jù)存儲在這里
        read_only: false
        volume:
          nocopy: false
      - type: bind
        source: ./mysql/mysqlinit
        target: /docker-entrypoint-initdb.d/ #自動根據(jù)ini.sql初始化數(shù)據(jù)
    healthcheck:        
      test: mysql -u root -p1111 -e 'select 1;'
      interval: 10s
      timeout: 10s
      retries: 5
    networks:
      - mybridge_network
  myapp:
    image: openjdk:17
    volumes:
      - ./app:/app/
    command: java -jar /app/docker_compose-0.0.1-SNAPSHOT.jar
    healthcheck:
      test: ["CMD", "sh", "-c", "jps -l | grep 'docker_compose-0.0.1-SNAPSHOT.jar' || exit 1"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s
    networks:
      - mybridge_network
networks:
  mybridge_network:
    driver: bridge

五、啟動docker-compose.yml

啟動所有容器:

cd 回到項目路徑
docker compose up -d
WARN[0000] mount of type `bind` should not define `volume` option 
[+] Running 3/3
 ? Container p11_blog-myapp-1  Healthy                                                                                                                                6.5s 
 ? Container mysql_container   Healthy                                                                                                                               11.0s 
 ? Container p11_blog-web-1    Started                                                                                                                               13.0s 
root@iZ2ze8ve39i30yl0dhbqneZ:~/docker_stu/docker_compose/p11_blog# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                    PORTS                                     NAMES
bf059297e184   nginx:latest   "/docker-entrypoint.…"   48 seconds ago   Up 37 seconds             0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   p11_blog-web-1
82746d8b74d1   openjdk:17     "java -jar /app/dock…"   48 seconds ago   Up 48 seconds (healthy)                                             p11_blog-myapp-1
a69b1ac6de7d   mysql:5.7      "docker-entrypoint.s…"   48 seconds ago   Up 48 seconds (healthy)   3306/tcp, 33060/tcp                       mysql_container

查看地址:公網(wǎng)IP:8080
成功回顯數(shù)據(jù):

查看網(wǎng)絡創(chuàng)建情況:

docker network ls |grep  p11
1de554ab3031   p11_blog_mybridge_network   bridge    local
docker compose down
[+] Running 4/4
 ? Container p11_blog-web-1           Removed                                                                                                                         1.3s 
 ? Container mysql_container          Removed                                                                                                                         4.6s 
 ? Container p11_blog-myapp-1         Removed                                                                                                                         1.3s 
 ? Network p11_blog_mybridge_network  Removed                                                                                                                         0.3s 
root@iZ2ze8ve39i30yl0dhbqneZ:~/docker_stu/docker_compose/p11_blog# docker network ls |grep  p11 #停止并且刪除容器后,再次查看,網(wǎng)絡也已經(jīng)被刪除了

到此這篇關于Spring Boot+Nginx+MySQL容器化實戰(zhàn)指南的文章就介紹到這了,更多相關Spring Boot Nginx MySQL容器化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 在IDEA里Git特別慢的問題及解決過程

    在IDEA里Git特別慢的問題及解決過程

    IDEA中Git操作慢的問題可以通過重命名`runnerw.exe`和`runnerw64.exe`文件來解決,這可能是由于殺毒軟件或防火墻攔截導致的
    2025-12-12
  • Springmvc nginx實現(xiàn)動靜分離過程詳解

    Springmvc nginx實現(xiàn)動靜分離過程詳解

    這篇文章主要介紹了Springmvc nginx實現(xiàn)動靜分離過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • request如何獲取完整url(包括域名、端口、參數(shù))

    request如何獲取完整url(包括域名、端口、參數(shù))

    這篇文章主要介紹了request如何獲取完整url(包括域名、端口、參數(shù))問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • SpringMVC攔截器實現(xiàn)監(jiān)聽session是否過期詳解

    SpringMVC攔截器實現(xiàn)監(jiān)聽session是否過期詳解

    這篇文章主要介紹了SpringMVC攔截器實現(xiàn)監(jiān)聽session是否過期詳解,還是比較不錯的,這里分享給大家,供需要的朋友參考。
    2017-11-11
  • 解決MyEclipse出現(xiàn)the user operation is waiting的問題

    解決MyEclipse出現(xiàn)the user operation is waiting的問題

    今天做項目的時候每次修改代碼保存后都會跳出一個框框,然后就有兩個進度條,上面寫the user operation is wating...小編去網(wǎng)上查了查解決了這個問題,下面跟大家分享一下。
    2018-04-04
  • Java中的引用和動態(tài)代理的實現(xiàn)詳解

    Java中的引用和動態(tài)代理的實現(xiàn)詳解

    這篇文章主要介紹了Java中的引用和動態(tài)代理的實現(xiàn)詳解,涉及Java中的引用類型,JVMGC的可達性分析,代理模式等相關內(nèi)容,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • 詳解SpringBoot如何實現(xiàn)緩存預熱

    詳解SpringBoot如何實現(xiàn)緩存預熱

    緩存預熱是指在 Spring Boot 項目啟動時,預先將數(shù)據(jù)加載到緩存系統(tǒng)(如 Redis)中的一種機制,下面我們就來看看SpringBoot是如何實現(xiàn)緩存預熱的吧
    2024-01-01
  • 在MyBatis-Plus中關閉SQL日志輸出的方法

    在MyBatis-Plus中關閉SQL日志輸出的方法

    在使用MyBatis-Plus開發(fā)Java應用程序時,隨著項目的復雜性提升,SQL日志的輸出可能會導致日志文件變得龐大,影響系統(tǒng)的性能和可維護性,本文將介紹如何在Spring Boot項目中關閉MyBatis-Plus的SQL日志輸出,感興趣的朋友一起看看吧
    2025-04-04
  • Mybatis一對多和多對一處理的深入講解

    Mybatis一對多和多對一處理的深入講解

    Mybatis可以通過關聯(lián)查詢實現(xiàn),關聯(lián)查詢是幾個表聯(lián)合查詢,只查詢一次,通過在resultMap里面的association,collection節(jié)點配置一對一,一對多的類就可以完成,這篇文章主要給大家介紹了關于Mybatis一對多和多對一處理的相關資料,需要的朋友可以參考下
    2021-09-09
  • 分析HashMap 的 JDK 源碼

    分析HashMap 的 JDK 源碼

    這篇文章主要分析了HashMap 的 JDK 源碼,幫助大家更好的理解和學習Java,感興趣的朋友可以了解下
    2020-10-10

最新評論

新巴尔虎右旗| 绥中县| 搜索| 毕节市| 鄂托克旗| 杂多县| 九龙坡区| 宝山区| 买车| 奉贤区| 贡山| 伊金霍洛旗| 合肥市| 团风县| 静海县| 延寿县| 义乌市| 平度市| 昌邑市| 商都县| 乌拉特后旗| 洛宁县| 湘阴县| 利川市| 德令哈市| 芦山县| 临沂市| 宝清县| 鲜城| 潞西市| 珠海市| 建湖县| 麦盖提县| 揭东县| 太湖县| 通河县| 通城县| 梓潼县| 灌南县| 磐石市| 洛隆县|