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

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

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

一、實(shí)現(xiàn)目標(biāo)

1.1 概述

編寫(xiě)一個(gè)spring-boot程序,返回user表的所有數(shù)據(jù),并且通過(guò)nginx反向代理實(shí)現(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容器會(huì)自動(dòng)初始化表結(jié)構(gòu)以及一些原始數(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 #項(xiàng)目名
spring.datasource.url=jdbc:mysql://mysql容器名稱:3306/數(shù)據(jù)庫(kù)名稱
spring.datasource.username=root # mysql用戶名
spring.datasource.password=1111 # mysql密碼

注意:

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

1.4 nginx配置文件

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

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

二、spring-boot程序打包

2.1 生成jar包

spring-boot項(xiàng)目編寫(xiě)完后,點(diǎn)擊maveclear清理緩存,然后點(diǎn)擊package打包:

提示BUILD SUCCESS后,target路徑下會(huì)有一個(gè)編譯好的jar包:

2.2 通過(guò)scp命令上傳到服務(wù)器

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

pwd
/root/docker_stu/docker_compose/p11_blog

后續(xù)docker-compose默認(rèn)會(huì)以p11_blog命名容器

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

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

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

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

3.1 宿主機(jī)mysql初始化文件

cd 回到項(xiàng)目路徑
mkdir mysqlinit
cd ./mysqlinit
vim init.sql

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

3.2 宿主機(jī)nginx配置文件

cd 回到項(xiàng)目路徑
mkdir -p ./nginxhome/conf.d 
cd ./nginxhome/conf.d
vim myapp.conf

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

四、定義docker-compose.yml

注意
docker-compose.yml直接放到項(xiàng)目路徑,那么其工作目錄默認(rèn)就是項(xiàng)目路徑,下面的存儲(chǔ)卷路徑默認(rèn)以項(xiàng)目路徑為基準(zhǔn);

4.1 nginx容器定義

# 文件名:docker-compose.yml
services:
  web:
    image: nginx:latest
    volumes:
      - ./nginxhome/conf.d:/etc/nginx/conf.d #簡(jiǎn)潔寫(xiě)法,定義綁定卷
    ports:
      - 8080:80 #端口映射
    expose:
      - 80 #聲明容器內(nèi)部開(kā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  #若宿主機(jī)目錄為空,復(fù)制容器數(shù)據(jù)到宿主機(jī)目錄

4.3 spring-boot容器定義

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

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

4.4容器依賴關(guān)系與健康檢查

4.4.1 概述

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

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

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

4.4.2 健康檢查

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

#文件名: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 #檢查間隔時(shí)間
      timeout: 5s # 定義超時(shí)時(shí)間
      retries: 5 # 重試最大次數(shù)
      start_period: 30s #給一個(gè)啟動(dòng)緩沖時(shí)間,30s之后才開(kāi)始記錄重試次數(shù)

4.4.3 容器依賴關(guān)系(也叫容器拓?fù)洌?/h4>

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

#文件名:docker-compose.yml
services:
  web:
    depends_on:
      mysql:
        condition: service_healthy #condition不為headlthy則容器編排會(huì)報(bào)錯(cuò)
      myapp:
        condition: service_healthy
  myapp:
    depends_on:
      mysql:
        condition: service_healthy

condition健康類型的選項(xiàng):

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

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

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

#文件名:docker-compose.yml
services:
  web:
    image: nginx:latest #指定容器的nginx鏡像版本
    volumes:
      - ./nginxhome/conf.d:/etc/nginx/conf.d #簡(jiǎn)潔寫(xiě)法,定義綁定卷
    ports:
      - 8080:80 #端口映射
    expose:
      - 80 #聲明容器內(nèi)部開(kā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ù)存儲(chǔ)在這里
        read_only: false
        volume:
          nocopy: false
      - type: bind
        source: ./mysql/mysqlinit
        target: /docker-entrypoint-initdb.d/ #自動(dòng)根據(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

五、啟動(dòng)docker-compose.yml

啟動(dòng)所有容器:

cd 回到項(xiàng)目路徑
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)絡(luò)創(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)絡(luò)也已經(jīng)被刪除了

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

相關(guān)文章

  • 在IDEA里Git特別慢的問(wèn)題及解決過(guò)程

    在IDEA里Git特別慢的問(wèn)題及解決過(guò)程

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

    Springmvc nginx實(shí)現(xiàn)動(dòng)靜分離過(guò)程詳解

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

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

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

    SpringMVC攔截器實(shí)現(xiàn)監(jiān)聽(tīng)session是否過(guò)期詳解

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

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

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

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

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

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

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

    在MyBatis-Plus中關(guān)閉SQL日志輸出的方法

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

    Mybatis一對(duì)多和多對(duì)一處理的深入講解

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

    分析HashMap 的 JDK 源碼

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

最新評(píng)論

来凤县| 三明市| 崇阳县| 印江| 高青县| 光山县| 益阳市| 海晏县| 祁东县| 丰原市| 德兴市| 巴林右旗| 泾川县| 玛沁县| 上思县| 镇巴县| 彝良县| 哈尔滨市| 甘南县| 马龙县| 全南县| 察雅县| 西贡区| 大石桥市| 襄樊市| 克山县| 金寨县| 留坝县| 保山市| 南召县| 岗巴县| 治县。| 瑞金市| 富锦市| 长春市| 汉源县| 福鼎市| 南昌市| 新闻| 静宁县| 凤台县|