我们在日常开发微服务之后需要再服务器上面部署,那么如何进行部署呢,先把微服务的各个服务和中间件以及对应的端口列举出来,都打包成镜像,以及前端代码部署的nginx,使用docker-compose启动,访问服务器nginx端口就部署完成了,大致如下
1.首先需要对多个服务进行打成jar包放到服务器上
微服务一般maven文件有一个父类的pom.xml,如果有一下配置需要将pom.xml的executions删除并在子类加上,不然会找不到主类
<packaging>jar</packaging> <!--打包成jar包-->
在maven的插件中配置如下
是repackage这个配置,父类删除都加到子类中,之后右键maven的选项
点击package进行打包,打包成功之后会显示jar包的路径,可以使用java-jar命令测试能不能跑起来,没出错就可以了
接下来就是部署了,可视化官网1Panel - 现代化、开源的 Linux 服务器运维管理面板,工作一般用这个,今天是从零开始部署
2.制作服务镜像,成功会一个tar的docke镜像包,可转移
将jar包放到linux中/dabaomao/my-images/这个目录中,测试一下java-jar能不能跑
如果需要的话可以加上8080端口访问,镜像内部为映射端口
java-jar -Dserver.port=8080 jar包名称
之后在创建一个Dockerfile文件,注意没有前缀
# 使用一个基础镜像 FROM openjdk:8 # 将jar1.jar复制到镜像中的工作目录 COPY jar1.jar /my-images/jar1.jar # 设置工作目录 WORKDIR /dabaomao/my-images # 暴露端口 EXPOSE 18080 #必须服务端口一致 #定义时区参数 ENV TZ=Asia/Shanghai # 设置时区 RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone # 运行jar文件 CMD java -jar api-0.0.1-SNAPSHOT.jar
之后返回/dabaomao目录,执行命令,创建镜像my-image
docker build -t my-images:1.0 路径
之后会出现下载进度,成功之后就可以启动镜像容器myjar
docker run -d -p 8080:18080 my-image:1.0 docker run -it -d --name my-image my-image:1.0
将镜像打包
docker save 镜像id > /dabaimao/my-image.tar my-image:1.0
也可以加载部署到多个服务器上
docker load < /dabaimao/my-image.tar
注意18080是我们程序的jar包对外的端口,也就是映射端口,是springboot的yml设置的,属于映射端口,需要输入真正端口8080访问,上面java-jar同理
之后使用docker ps查看容器是否存在即可
3.使用docker-compose,同时启动
# docker-compose.yml 文件 version: '3' # 指定 Docker Compose 的版本 # 定义 MySQL 服务 services: #自己服务jar包的镜像 myjar: image: my-imgae:1.0 #自定义镜像名称 container_name: my-mysql # 指定容器的名字 environment: #设置时区 - TZ=Asia/Shanghai ports: - "18080:18080" networks: # 指定网络 - network1 # 将服务连接到network网络上 mysql: # 使用官方的 MySQL 镜像 image: mysql:5.7 # 设置环境变量,用于配置 MySQL environment: MYSQL_ROOT_PASSWORD: rootpassword container_name: my-mysql # 指定容器的名字 # 暴露端口 3306,供外部访问 ports: - "3306:3306" # 定义数据卷,用于持久化 MySQL 数据库文件 volumes: - mysql_data:/var/lib/mysql restart: always # 容器退出时总是重启 networks: # 指定网络 - network1 # 将服务连接到network网络上 redis: # 使用官方的 Redis 镜像 image: redis:latest # 暴露端口 6379,供外部访问 ports: - "6379:6379" container_name: my-redis # 指定容器的名字 restart: always # 容器退出时总是重启 networks: # 指定网络 - network1 # 将服务连接到network网络上 nacos: # 使用官方的 Nacos 镜像 image: nacos/nacos-server:latest # 暴露端口 8848,供外部访问 ports: - "8848:8848" container_name: my-nacos # 指定容器的名字 restart: always # 容器退出时总是重启 networks: # 指定网络 - network1 # 将服务连接到network网络上 # 定义网络,所有服务都使用同一个自定义网络 networks: # 定义网络 network1: # 定义一个名为network的网络
注意,启动顺序要先启动依赖配置服务,在启动业务服务,建议写两个docker-compose文件先启动mysql,redis中间件的容器,再启动各个服务,还有就是depends_on:这个只能决定服务启动顺序,不能保证一个服务启动完再启动下一个服务
4.包含nginx流量网关也可以使用docker部署,可以实现多个端口负载均衡,nginx内部一般用于启动前端代码进行访问
使用run直接期待nginx(不推荐)
docker run --name nginx -it -d -p 80:80 nginx:latest /bin/bash
部署前端代码,进入目录conf/nginx.conf,打开这个文件,找到这里
server { # 前端程序运行端口 # 注释:前端程序运行端口 listen 80; # 前端程序运行ip # 注释:前端程序运行ip server_name localhost; # 前端代码,vue使用dist,需要index.html会开头 # 注释:前端代码,vue使用dist,需要index.html会开头 root /usr/share/nginx/html; # 加载配置文件以使用默认服务器块。 # Load configuration files for the default server block. # 注释:加载配置文件以使用默认服务器块。 include /etc/nginx/default.d/*.conf; location / { proxy_pass http://jar; #通过代理转到jar进行负载均衡 } error_page 404 /404.html; location = /40x.html { # 如果请求的错误页面是404,则返回404.html文件。 # 如果请求的错误页面是40x.html,则不做任何处理。 # 注释:如果请求的错误页面是404,则返回40x.html文件。 # 如果请求的错误页面是50x.html,则不做任何处理。 } error_page 500 502 503 504 /50x.html; location = /50x.html { # 如果发生5xx错误,例如500内部服务器错误,则返回50x.html文件。 # 如果请求的错误页面是50x.html,则不做任何处理。 # 注释:如果发生错误,例如内部服务器错误,则返回5xx.html文件。 } } Upstream jar{ #负载均衡 server 192.168.30.137:18080 server 192.168.30.137:18081 }
这样就绑定成功了,前端端口为80,可以访问后端18080和18081的端口api,并是轮训的方式
不只是轮训,权重的话如下,修改完成后记得重启
Upstream jar{ #负载均衡 #后端服务端口 server 192.168.30.137:18080 weight=10 server 192.168.30.137:18081 weight=5 #根据概率权重为2:1 }
注意:在处理高并发场景时,使用本地(127.0.0.1)两个端口进行负载均衡实际上并没有提供真正的并发处理能力,因为这两个端口最终指向的是同一台物理机器或虚拟机。这种方式通常用于开发和测试环境,而不是生产环境
之后再docker-compose启动的时候也加上
# docker-compose.yml 文件 version: '3' # 指定 Docker Compose 的版本 # 定义 Nginx 服务 services: nginx: # 使用官方的 Nginx 镜像 image: nginx:latest # 设置容器的工作目录 working_dir: /usr/share/nginx/html # 暴露端口 80,供外部访问 container_name: nginx # 指定容器的名字 ports: - "80:80" # 定义数据卷,用于持久化 Nginx 配置和静态文件 volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro # 宿主机上的 nginx.conf 文件 - ./html:/usr/share/nginx/html:ro # 宿主机上的 HTML 目录 restart: on-failure # 容器退出时,如果是因为错误导致的,则重启容器 restart: always # 总是在容器退出时重启容器 networks: # 指定网络 - network1 # 将服务连接到network网络上 networks: # 定义网络 network1: # 定义了一个名为network的网络
之后nginx进行扩容gateway的地址,访问nginx的对外端口即可
大致就这些环节了,如果服务部署在多个服务器那么需要使用k8s进行集中管理,哪个环节出错可以使用gpt或者博客了解