ToB企服应用市场:ToB评测及商务社交产业平台

标题: 实战:Docker Compose 下 Nginx、Java、Mysql 和 Redis 服务协同摆设(包罗 [打印本页]

作者: 刘俊凯    时间: 2024-6-9 13:20
标题: 实战:Docker Compose 下 Nginx、Java、Mysql 和 Redis 服务协同摆设(包罗
1. 配景

在该实战中,我们将探讨如何利用Docker Compose协同摆设Nginx、Java、Mysql和Redis服务,实现一个视频上传与展示的应用。详细需求如下:

2. 实现步骤

2.1 配置Java应用读取服务器IP

我们利用Spring的@Profile注解和InitConfig类,读取摆设时挂载的/data/init.properties文件,获取服务器IP。
拓展:优化,可以在项目所摆设的服务器上,写一个获取服务器IP的脚本(Centos体系Docker获取宿主机IP地点,MAC地点,磁盘序列号和CPU序列号的shell脚本),然后java通过运行该脚本获取服务器IP,如果买了域名,那更好了,直接省掉拼接服务器IP的步骤。
  1. import lombok.Data;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Profile;
  5. import org.springframework.core.io.ClassPathResource;
  6. import org.springframework.stereotype.Component;
  7. import java.io.*;
  8. import java.nio.charset.StandardCharsets;
  9. import java.nio.file.Files;
  10. import java.nio.file.Paths;
  11. import java.util.HashMap;
  12. import java.util.Map;
  13. import java.util.Properties;
  14. import java.util.Set;
  15. @Profile({"pro", "docker"})
  16. @Component
  17. @Data
  18. public class InitConfig {
  19.     private String serverIp;
  20.     @Bean
  21.     public Map<String, String> loadLinuxConfig() {
  22.         Properties prop = new Properties();
  23.         try (InputStream in = new BufferedInputStream(Files.newInputStream(Paths.get("/data/init.properties")))) {
  24.             prop.load(new InputStreamReader(in, StandardCharsets.UTF_8));
  25.         } catch (IOException e) {
  26.             log.error("Failed to load local configuration file InitConfig.properties", e);
  27.         }
  28.         Set<String> keySet = prop.stringPropertyNames();
  29.         Map<String, String> configMap = new HashMap<>();
  30.         for (String key : keySet) {
  31.             String value = prop.getProperty(key);
  32.             log.info("Configuration loaded: key={}, value={}", key, value);
  33.             configMap.put(key, value);
  34.         }
  35.         serverIp = configMap.get("data.serverIp");
  36.         return configMap;
  37.     }
  38. }
复制代码
2.2编写init.properties文件

data.serverIp该key根据本身需求随意取名。
  1. data.serverIp=192.168.xx.xx
复制代码
2.3调解Java资源列表展示接口

返回列表给前端的时候,将获取到的服务器IP拼接到资源的Url中。
  1.     @Autowired
  2.     private VideoInfoMapper videoInfoMapper;
  3.     @Autowired
  4.     private InitConfig initConfig;
  5.     /**
  6.      * 获取资源视频列表
  7.      *
  8.      * @return {@link ResponseResult }
  9.      * @param type    视频类型
  10.      * @param search  搜索关键词
  11.      * @author yangz
  12.      */
  13.     @Override
  14.     public ResponseResult<List<VideoInfo>> getVideoList(String type, String search) {
  15.         List<VideoInfo> videoList = videoInfoMapper.selectByTypeAndSearch(type, search);
  16.         for (VideoInfo videoInfo : videoList) {
  17.             // 构建相对路径
  18.             String relativePath = videoInfo.getFileName();
  19.             // 构建完整的 URL,拼接 Nginx 的部署路径
  20.             videoInfo.setUrl( "http://"+initConfig.getServerIp()+":yourPort/static/" + relativePath);
  21.             // 同样处理 imageUrl
  22.             String relativeImagePath = videoInfo.getImageName();
  23.             videoInfo.setImageUrl("http://"+initConfig.getServerIp()+":yourPort/static/" + relativeImagePath);
  24.         }
  25.         return new ResponseResult<>(videoList);
  26.     }
复制代码
2.4 编写Docker Compose 文件

这里volumes_from属性将Nginx容器的数据卷挂载到Java容器中,实现了两个容器之间数据卷的共享。
这是由于Nginx容器中的/usr/share/nginx/static目录包罗了Java上传的静态资源,而volumes_from确保了Java容器可以访问这个目录。如许,Nginx就可以大概精确地服务Java上传的资源了。
  1. version: '3'
  2. services:
  3.   # Nginx
  4.   nginx:
  5.     image: nginx:1.22.0
  6.     container_name: nginx_education
  7.     restart: always
  8.     ports:
  9.       - "yourPort:8868"
  10.       - "83:80"
  11.     volumes:
  12.       - ./nginx/html:/usr/share/nginx/html
  13.       - ./nginx/static:/usr/share/nginx/static
  14.       - ./nginx/nginx.conf:/etc/nginx/nginx.conf
  15.     privileged: true
  16.   # MySQL
  17.   mysql:
  18.     image: mysql:5.7
  19.     ports:
  20.       - "yourPort:3306"
  21.     container_name: mysql_education
  22.     restart: always
  23.     environment:
  24.       MYSQL_ROOT_PASSWORD: yourPassword
  25.     volumes:
  26.       - ./mysql:/var/lib/mysql
  27.       - ./init/:/docker-entrypoint-initdb.d/
  28.   # Redis
  29.   redis:
  30.     image: redis:5.0.3
  31.     container_name: redis_education
  32.     command: "/usr/local/bin/redis-server /usr/local/etc/redis/redis.conf --appendonly yes"
  33.     restart: always
  34.     ports:
  35.       - "yourPort:6379"
  36.     volumes:
  37.       - ./redis:/data
  38.       - ./redis.conf:/usr/local/etc/redis/redis.conf
  39.       - ./logs/redis:/logs
  40.   # Java
  41.   java:
  42.     image: java:8
  43.     container_name: education
  44.     ports:
  45.       - "yourPort:jarPort"
  46.     environment:
  47.       - TZ=Asia/Shanghai
  48.       - LANG=en_US.UTF-8
  49.     volumes:
  50.       # 映射Java应用程序jar文件
  51.       - ./xxx-education-xxx-0.0.1-SNAPSHOT.jar:/data/xxx-education-xxx-0.0.1-SNAPSHOT.jar
  52.       # 映射Java应用程序的初始化配置文件
  53.       - ./init/init.properties:/data/init.properties
  54.       # 映射Java应用程序的日志目录
  55.       - ./logs:/logs
  56.     # 使用volumes_from属性,挂载Nginx容器的数据卷到Java容器
  57.     volumes_from:
  58.       - nginx
  59.     # Java应用程序的入口命令
  60.     entrypoint: nohup java -jar /data/xxx-education-xxx-0.0.1-SNAPSHOT.jar --spring.profiles.active=docker > nohup.out &
  61.     depends_on:
  62.       - redis
  63.       - mysql
  64.     restart: on-failure
  65. networks:
  66.   default:
  67.     external:
  68.       name: my-education
复制代码
2.5 Nginx配置

在Nginx的配置中,我们配置了/static/路径的访问规则,通过rewrite ^/(.+)/$ /$1 permanent;将URI末端的斜杠去掉,并利用alias指定静态资源的路径。
注意:172.17.0.1是Docker在摆设docker-compose时创建的默认网关地点。在容器网络中,这个地点充当了容器之间直接通信的网关。通过配置Nginx时利用这个地点,使得即使服务器IP变化,也不需要修改Nginx的代理配置。如许一来,容器之间的通信可以通过网关地点和端口举行,实现了更加机动和方便的摆设方式。
  1. server {
  2.     listen yourPort;
  3.     location / {
  4.         root   /usr/share/nginx/html/dist;
  5.         index  index.html index.htm;
  6.         try_files  $uri $uri/ /index.html;
  7.     }
  8.     # 配置静态资源访问的路径
  9.     location /static/ {
  10.         rewrite ^/(.+)/$ /$1 permanent;
  11.         alias /usr/share/nginx/static/;
  12.     }
  13.     location /prod-api/ {
  14.         client_max_body_size 1000m;
  15.         proxy_pass http://172.17.0.1:jarPort/;
  16.         proxy_set_header  Host   $host;
  17.         proxy_set_header  X-Real-IP   $remote_addr;
  18.         proxy_set_header  X-Forwarded-For $remote_addr;
  19.     }
  20.     error_page   500 502 503 504  /50x.html;
  21.     location = /50x.html {
  22.         root   /usr/share/nginx/html;
  23.     }
  24. }
复制代码
3. 摆设与访问

4. 结语

通过这个实战,我们乐成搭建了一个多服务协同摆设的环境,其中Nginx作为静态资源服务器,Java负责业务逻辑。利用Docker Compose,我们实现了服务的快速摆设和环境一致性,为开发和测试提供了便利。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4