實戰:Docker Compose 下 Nginx、Java、Mysql 和 Redis 服務協同部署(包含解決瀏覽器訪問Linux部署服務器本地資源問題)

1. 背景

在該實戰中,我們將探討如何使用Docker Compose協同部署Nginx、Java、Mysql和Redis服務,實現一個視頻上傳與展示的應用。具體需求如下:

  • Java應用負責上傳視頻和圖片資源到Nginx目錄下,作為資源服務器。
  • Nginx服務作為靜態資源服務器,通過URL訪問已上傳的視頻和圖片資源。
  • Java服務通過讀取數據卷掛載的/data/init.properties文件獲取服務器的IP地址,用于拼接資源的訪問URL。

2. 實現步驟

2.1 配置Java應用讀取服務器IP

我們使用Spring的@Profile注解和InitConfig類,讀取部署時掛載的/data/init.properties文件,獲取服務器IP。

拓展:優化,可以在項目所部署的服務器上,寫一個獲取服務器IP的腳本(Centos系統Docker獲取宿主機IP地址,MAC地址,磁盤序列號和CPU序列號的shell腳本),然后java通過運行該腳本獲取服務器IP,如果買了域名,那更好了,直接省掉拼接服務器IP的步驟。

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Profile;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
@Profile({"pro", "docker"})
@Component
@Data
public class InitConfig {private String serverIp;@Beanpublic Map<String, String> loadLinuxConfig() {Properties prop = new Properties();try (InputStream in = new BufferedInputStream(Files.newInputStream(Paths.get("/data/init.properties")))) {prop.load(new InputStreamReader(in, StandardCharsets.UTF_8));} catch (IOException e) {log.error("Failed to load local configuration file InitConfig.properties", e);}Set<String> keySet = prop.stringPropertyNames();Map<String, String> configMap = new HashMap<>();for (String key : keySet) {String value = prop.getProperty(key);log.info("Configuration loaded: key={}, value={}", key, value);configMap.put(key, value);}serverIp = configMap.get("data.serverIp");return configMap;}
}

2.2編寫init.properties文件

data.serverIp該key根據自己需求隨意取名。

data.serverIp=192.168.xx.xx

2.3調整Java資源列表展示接口

返回列表給前端的時候,將獲取到的服務器IP拼接到資源的Url中。

    @Autowiredprivate VideoInfoMapper videoInfoMapper;@Autowiredprivate InitConfig initConfig;/*** 獲取資源視頻列表** @return {@link ResponseResult }* @param type    視頻類型* @param search  搜索關鍵詞* @author yangz*/@Overridepublic ResponseResult<List<VideoInfo>> getVideoList(String type, String search) {List<VideoInfo> videoList = videoInfoMapper.selectByTypeAndSearch(type, search);for (VideoInfo videoInfo : videoList) {// 構建相對路徑String relativePath = videoInfo.getFileName();// 構建完整的 URL,拼接 Nginx 的部署路徑videoInfo.setUrl( "http://"+initConfig.getServerIp()+":yourPort/static/" + relativePath);// 同樣處理 imageUrlString relativeImagePath = videoInfo.getImageName();videoInfo.setImageUrl("http://"+initConfig.getServerIp()+":yourPort/static/" + relativeImagePath);}return new ResponseResult<>(videoList);}

2.4 編寫Docker Compose 文件

這里volumes_from屬性將Nginx容器的數據卷掛載到Java容器中,實現了兩個容器之間數據卷的共享。

這是因為Nginx容器中的/usr/share/nginx/static目錄包含了Java上傳的靜態資源,而volumes_from確保了Java容器可以訪問這個目錄。這樣,Nginx就能夠正確地服務Java上傳的資源了。

version: '3'
services:# Nginxnginx:image: nginx:1.22.0container_name: nginx_educationrestart: alwaysports:- "yourPort:8868"- "83:80"volumes:- ./nginx/html:/usr/share/nginx/html- ./nginx/static:/usr/share/nginx/static- ./nginx/nginx.conf:/etc/nginx/nginx.confprivileged: true# MySQLmysql:image: mysql:5.7ports:- "yourPort:3306"container_name: mysql_educationrestart: alwaysenvironment:MYSQL_ROOT_PASSWORD: yourPasswordvolumes:- ./mysql:/var/lib/mysql- ./init/:/docker-entrypoint-initdb.d/# Redisredis:image: redis:5.0.3container_name: redis_educationcommand: "/usr/local/bin/redis-server /usr/local/etc/redis/redis.conf --appendonly yes"restart: alwaysports:- "yourPort:6379"volumes:- ./redis:/data- ./redis.conf:/usr/local/etc/redis/redis.conf- ./logs/redis:/logs# Javajava:image: java:8container_name: educationports:- "yourPort:jarPort"environment:- TZ=Asia/Shanghai- LANG=en_US.UTF-8volumes:# 映射Java應用程序jar文件- ./xxx-education-xxx-0.0.1-SNAPSHOT.jar:/data/xxx-education-xxx-0.0.1-SNAPSHOT.jar# 映射Java應用程序的初始化配置文件- ./init/init.properties:/data/init.properties# 映射Java應用程序的日志目錄- ./logs:/logs# 使用volumes_from屬性,掛載Nginx容器的數據卷到Java容器volumes_from:- nginx# Java應用程序的入口命令entrypoint: nohup java -jar /data/xxx-education-xxx-0.0.1-SNAPSHOT.jar --spring.profiles.active=docker > nohup.out &depends_on:- redis- mysqlrestart: on-failure
networks:default:external:name: my-education

2.5 Nginx配置

在Nginx的配置中,我們配置了/static/路徑的訪問規則,通過rewrite ^/(.+)/$ /$1 permanent;將URI結尾的斜杠去掉,并使用alias指定靜態資源的路徑。

注意172.17.0.1是Docker在部署docker-compose時創建的默認網關地址。在容器網絡中,這個地址充當了容器之間直接通信的網關。通過配置Nginx時使用這個地址,使得即使服務器IP變化,也不需要修改Nginx的代理配置。這樣一來,容器之間的通信可以通過網關地址和端口進行,實現了更加靈活和方便的部署方式。

server {listen yourPort;location / {root   /usr/share/nginx/html/dist;index  index.html index.htm;try_files  $uri $uri/ /index.html;}# 配置靜態資源訪問的路徑location /static/ {rewrite ^/(.+)/$ /$1 permanent;alias /usr/share/nginx/static/;}location /prod-api/ {client_max_body_size 1000m;proxy_pass http://172.17.0.1:jarPort/;proxy_set_header  Host   $host;proxy_set_header  X-Real-IP   $remote_addr;proxy_set_header  X-Forwarded-For $remote_addr;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   /usr/share/nginx/html;}
}

3. 部署與訪問

  1. 使用docker-compose up -d命令啟動所有服務。

  2. 訪問Java容器中的日志文件,查看Java應用啟動時是否正確加載了服務器IP。

  3. 通過瀏覽器訪問http://serverIP:Port/static/,驗證Nginx是否正確訪問了Java上傳的資源。
    在這里插入圖片描述

4. 結語

通過這個實戰,我們成功搭建了一個多服務協同部署的環境,其中Nginx作為靜態資源服務器,Java負責業務邏輯。利用Docker Compose,我們實現了服務的快速部署和環境一致性,為開發和測試提供了便利。

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

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

相關文章

Numpy數組常用屬性匯總(第5講)

Numpy數組常用屬性匯總 (第5講) ??????? ??博主 侯小啾 感謝您的支持與信賴。?? ????????????????????????????????????????????????????????????????????????????????????…

【JavaEE進階】 Spring使用注解存儲對象

文章目錄 &#x1f334;序言&#x1f340;前置?作&#xff1a;配置掃描路徑&#x1f384;添加注解存儲 Bean 對象&#x1f333;類注解&#x1f6a9;為什么要這么多類注解&#x1f6a9;注解之間的聯系 &#x1f38b;?法注解 Bean&#x1f6a9;?法注解需要配合類注解使? ?總…

探索AIGC未來:CPU源碼優化、多GPU編程與中國算力瓶頸與發展

★人工智能&#xff1b;大數據技術;AIGC;Turbo;DALLE 3;多模態大模型&#xff1b;MLLM&#xff1b;LLM&#xff1b;Agent&#xff1b;Llama2&#xff1b;國產GPU芯片&#xff1b;GPU;CPU&#xff1b;高性能計算機&#xff1b;邊緣計算&#xff1b;大模型顯存占用&#xff1b;5G…

如何夸張孩子

你剛才很努力啊&#xff01;——表揚努力盡管艱難&#xff0c;但你一直沒有放棄——表揚耐心和堅持你做事情的態度非常不錯——表揚態度你在_____上進步了很多&#xff01;——表揚細節這個方法真有新意&#xff01;——表揚創意你和小伙伴合作得真棒&#xff01;——表揚合作精…

中國特供閹割版 RTX 4090 曝光,老黃這操作絕了

到了現在大伙兒應該發現&#xff1a;國內禁售 NVIDIA RTX 4090 顯卡這事兒基本實錘了。 實際上根據老美規定&#xff0c;從上個月 17 號開始&#xff0c;凡是公司主體在中國的顯卡品牌&#xff0c;就已經不能生產和銷售 RTX 4090。 以后廠商想要賣 4090 只能以整機形式出售&am…

藝術畫廊展廳網站制作的效果如何

藝術展廳往往有很多人前往&#xff0c;在主要城市有不少畫廊&#xff0c;對經營者來說&#xff0c;不同于銷售行業&#xff0c;其更多的是打造品牌吸引用戶前來或合作等形式&#xff0c;而由于行業特殊性&#xff0c;需要準屬性用戶才會前往。 因此在品牌打造及信息承載宣傳方…

防止企業敏感數據泄露

敏感數據泄露是指意外或故意泄露關鍵信息&#xff0c;例如個人身份信息&#xff08;PII&#xff09;、支付卡信息&#xff08;PCI&#xff09;、受保護的電子健康信息&#xff08;ePHI&#xff09;和知識產權&#xff08;IP&#xff09;&#xff0c;數據保護措施不足的組織會在…

10-Hadoop組件開發技術

單選題 題目1&#xff1a;下列選項描述錯誤的是&#xff1f; 選項: A Hadoop HA即集群中包含Secondary NameNode作為備份節點存在。 B ResourceManager負責的是整個Yarn集群資源的監控、分配和管理工作 C NodeManager負責定時的向ResourceManager匯報所在節點的資源使用情況…

Spark---DataFrame存儲、Spark UDF函數、UDAF函數

四、DataFrame存儲Spark UDF函數 1、儲存DataFrame 1&#xff09;、將DataFrame存儲為parquet文件 2&#xff09;、將DataFrame存儲到JDBC數據庫 3&#xff09;、將DataFrame存儲到Hive表 2、UDF&#xff1a;用戶自定義函數 可以自定義類實現UDFX接口 java&#xff1a; …

案例062:基于微信小程序的健身房私教預約系統

文末獲取源碼 開發語言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 數據庫&#xff1a;mysql 5.7 開發軟件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序開發軟件&#xff1a;HBuilder X 小程序…

模塊式雨水調蓄池施工簡單,無需大型機械,可實現當天開挖當天回填

模塊式雨水調蓄池的施工過程非常簡單&#xff0c;無需大型機械和繁瑣的施工工藝。在施工過程中&#xff0c;只需要進行簡單的開挖和回填即可&#xff0c;而且可以在當天完成。這種施工方式不僅節省了施工時間和成本&#xff0c;還可以避免因大型機械和繁瑣工藝引起的安全隱患。…

MIT_線性代數筆記: 復習一

目錄 問題一問題二問題三問題四 本講為考前復習課&#xff0c;考試范圍就是 Axb 這個單元&#xff0c;重點是長方形矩陣&#xff0c;與此相關的概念包括零空間、左零空間、秩、向量空間、子空間&#xff0c;特別是四個基本子空間。當矩陣為可逆的方陣時&#xff0c;很多性質是一…

二叉樹的層次遍歷

102. 二叉樹的層序遍歷 - 力扣&#xff08;LeetCode&#xff09; 題目描述 給你二叉樹的根節點 root &#xff0c;返回其節點值的 層序遍歷 。 &#xff08;即逐層地&#xff0c;從左到右訪問所有節點&#xff09;。 樣例輸入 示例 1&#xff1a; 輸入&#xff1a;root [3…

php研究課題

對于PHP這門語言而言&#xff0c;可以研究的課題有很多&#xff0c;以下是可能的課題方向和對應的內容&#xff1a; PHP語言基礎研究 PHP語言特性和基本語法PHP的數據類型、變量、運算符和表達式PHP的流程控制語句PHP的函數和引用PHP的面向對象編程和設計模式 PHP與Web開發 …

harmony開發之Text組件的使用

TextInput、TextArea是輸入框組件&#xff0c;通常用于響應用戶的輸入操作&#xff0c;比如評論區的輸入、聊天框的輸入、表格的輸入等&#xff0c;也可以結合其它組件構建功能頁面&#xff0c;例如登錄注冊頁面。 圖片來源黑馬程序員 Text組件的使用&#xff1a; 文本顯示組…

flutter學習-day1-環境搭建和啟動第一個項目

&#x1f4da; 目錄 SDK 下載配置環境變量安裝 flutter搭建 Android 環境SDK 和依賴升級IDE 配置與使用 Android Studio 配置與使用VS Code 配置與使用 真機調試 本文學習和引用自《Flutter實戰第二版》&#xff1a;作者&#xff1a;杜文 1. SDK下載 前置需要操作系統 window …

Spring Cloud + Vue前后端分離-第4章 使用Vue cli 4搭建管理控臺

Spring Cloud Vue前后端分離-第4章 使用Vue cli 4搭建管理控臺 4-1 使用vue cli創建admin項目 Vue 簡介 Vue作者尤雨溪在google工作時&#xff0c;最早只想研究angular的數據綁定功能&#xff0c;后面覺得這個小功能很好用&#xff0c;有前景&#xff0c;就再擴展&#xff…

[MySQL] MySQL復合查詢(多表查詢、子查詢)

前面我們學習了MySQL簡單的單表查詢。但是我們發現&#xff0c;在很多情況下單表查詢并不能很好的滿足我們的查詢需求。本篇文章會重點講解MySQL中的多表查詢、子查詢和一些復雜查詢。希望本篇文章會對你有所幫助。 文章目錄 一、基本查詢回顧 二、多表查詢 2、1 笛卡爾積 2、2…

機器學習筆記 - 基于深度學習計算視頻中演員的出鏡時間

一、基本步驟 這里是使用動畫片貓和老鼠進行計算,基本流程如下: 1、導入并讀取視頻,從中提取幀,并將其另存為圖像 2、標記一些圖像以訓練模型(別擔心,我已經為你做好了) 3、根據訓練數據構建我們的模型 4、對剩余圖像進行預測 5、計算湯姆和杰瑞的屏幕時間 二、基礎環境…

教師未來發展前景如何

作為一名教師&#xff0c;我對未來發展的前景也感到有些迷茫。 不過教育行業仍然是一個穩定的職業&#xff0c;但是隨著社會的變化和科技的發展&#xff0c;傳統的教學模式已經逐漸被在線教育、人工智能等新型教學方式所取代。這使得教師的角色和職責也在發生變化&#xff0c;需…