企业网站框架图,关键词排名点击软件推荐,网站建设需要矢量文件,wap网站做视频直播1. 背景 
在该实战中#xff0c;我们将探讨如何使用Docker Compose协同部署Nginx、Java、Mysql和Redis服务#xff0c;实现一个视频上传与展示的应用。具体需求如下#xff1a; 
Java应用负责上传视频和图片资源到Nginx目录下#xff0c;作为资源服务器。Nginx服务作为静态…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 MapString, 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);}SetString keySet  prop.stringPropertyNames();MapString, 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.serverIp192.168.xx.xx2.3调整Java资源列表展示接口 
返回列表给前端的时候将获取到的服务器IP拼接到资源的Url中。 Autowiredprivate VideoInfoMapper videoInfoMapper;Autowiredprivate InitConfig initConfig;/*** 获取资源视频列表** return {link ResponseResult }* param type    视频类型* param search  搜索关键词* author yangz*/Overridepublic ResponseResultListVideoInfo getVideoList(String type, String search) {ListVideoInfo 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:80volumes:- ./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:3306container_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 yesrestart: alwaysports:- yourPort:6379volumes:- ./redis:/data- ./redis.conf:/usr/local/etc/redis/redis.conf- ./logs/redis:/logs# Javajava:image: java:8container_name: educationports:- yourPort:jarPortenvironment:- TZAsia/Shanghai- LANGen_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.activedocker  nohup.out depends_on:- redis- mysqlrestart: on-failure
networks:default:external:name: my-education2.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. 部署与访问 使用docker-compose up -d命令启动所有服务。  访问Java容器中的日志文件查看Java应用启动时是否正确加载了服务器IP。  通过浏览器访问http://serverIP:Port/static/验证Nginx是否正确访问了Java上传的资源。   
4. 结语 
通过这个实战我们成功搭建了一个多服务协同部署的环境其中Nginx作为静态资源服务器Java负责业务逻辑。利用Docker Compose我们实现了服务的快速部署和环境一致性为开发和测试提供了便利。