网站首页 > 博客文章 正文
小伙伴儿们,如果觉得文章干货满满,欢迎加入公众号【编程识堂】,更多干货等着你们来哦!
简介
通过springboot 搭建微服务项目,使用docker容器化部署,通过maven插件,结合maven命令,实现打包、生成镜像、推送到私有镜像仓库功能。
微服务项目
搭建
pom.xml文件配置
项目代码比较简单,如上图所示,只需在项目pom.xml文件添加docker插件
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<serverId>xl-docker-registry</serverId>
<imageName>192.168.5.217:5000/${project.parent.artifactId}/${project.artifactId}:v${project.version}</imageName>
<!--docker文件所在的目录-->
<dockerDirectory>docker</dockerDirectory>
<dockerHost>http://192.168.5.217:2375</dockerHost>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
settings.xml配置
<server>
<id>xl-docker-registry</id>
<username>admin</username>
<password>Harbor12345</password>
<configuration>
<email>447293059@qq.com</email>
</configuration>
</server>
DockerFile
# 指定基础镜像 openjdk
FROM openjdk:8
# 维护作者信息
MAINTAINER docker-demo rom date UTC by Asia/Shanghai "C.X.L"
# 设置环境变量
ENV TZ Asia/Shanghai
# 暴露镜像端口
EXPOSE 8099
# 指定挂载目录
VOLUME /data/log/docker/docker-demo
# VOLUME /tmp/tomcat
ARG JAR_FILE
# 将本地文件添加到容器中
COPY docker-demo-*.jar docker-demo.jar
#提供容器运行的默认命令
ENTRYPOINT ["java","-Xms256m","-Xmx1g","-Xss256k","-Djava.security.egd=file:/dev/./urandom","-jar","/docker-demo.jar"]
推送镜像至私服
docker基础使用、harbor镜像私服搭建以及idea集成docker等等相关知识请参考我之前写的博客:
Docker容器虚拟化技术
maven命令
搭建完环境之后就可以愉快的使用maven命令,实现打包、生成镜像、推送到私有镜像仓库功能了;
## 通过dockerfile构建镜像
mvn docker::build
## 将镜像推至harbor镜像私服
mvn docker::push
idea插件
当然也可以使用idea插件构建、推送镜像
问题排查
1. Exception caught: denied: requested access to the resource is denied
解决: 需在私有仓库建立好对应的项目 ,或者将构建好的镜像通过docker tag 打好对应项目的镜像,再推送至私服
docker tag 192.168.5.217:5000/spring-boot-starter-parent/docker-demo:v1.0.0-SNAPSHOT 192.168.5.217:5000/xl/spring-boot-starter-parent/docker-demo:v1.0.0-SNAPSHOT
项目启动
docker run
## 停止运行的容器
docker stop docker-demo
## 删除旧容器
docker rm docker-demo
##删除本地旧镜像
docker rmi 192.168.5.217:5000/xl/spring-boot-starter-parent/docker-demo:v1.0.0-SNAPSHOT
##拉取项目最新镜像并运行容器
docker run -d --restart=always --name docker-demo -v /data/log/docker/docker-demo:/data/log/docker/docker-demo
-p 8099:8099 -e TZ="Asia/Shanghai" 192.168.5.217:5000/xl/spring-boot-starter-parent/docker-demo:v1.0.0-SNAPSHOT
Docker-Compose
version: '3'
services:
docker-demo:
image: 192.168.5.217:5000/spring-boot-starter-parent/docker-demo:v1.0.0-SNAPSHOT
container_name: docker-demo
restart: always
ports:
- 8099:8099
volumes:
- /data/log/docker/docker-demo:/data/log/docker/docker-demo
environment:
- "TZ=Asia/Shanghai"
networks:
demo-net:
driver: overlay
运行容器
## 停止容器
docker-compose down
##删除本地旧镜像
docker rmi 192.168.5.217:5000/xl/spring-boot-starter-parent/docker-demo:v1.0.0-SNAPSHOT
##拉取项目最新镜像并运行容器
docker-compose pull & docker-compose up -d
集群部署
通过docker-swarm实现docker集群,若对docker-swarm还不了解的可以参考我之前写的博客:Docker-Swarm
初始化管理节点
master 192.168.150.128
node1 192.168.150.129
node2 192.168.150.136
提前在各个节点均已拉取了docker-demo 镜像
创建3个docker-demo微服务集群
将镜像tag修改为xl/docker-demo:v1.0.0-SNAPSHOT
docker tag 192.168.5.217:5000/xl/spring-boot-starter-parent/docker-demo:v1.0.0-SNAPSHOT xl/docker-demo:v1.0.0-SNAPSHOT
在master节点中创建overlay网络
docker network create -d overlay demo-net
创建服务
docker service创建服务
docker service create --name docker-demo --network demo-net -p 8100:8099 --mount=type=bind,src=/data/log/docker/docker-demo,dst=/data/log/docker/docker-demo -e TZ="Asia/Shanghai" --replicas 3 xl/docker-demo:v1.0.0-SNAPSHOT
docker stack创建服务
docker-compose.yml
version: '3'
services:
docker-demo:
image: xl/docker-demo:v1.0.0-SNAPSHOT
container_name: docker-demo
restart: always
ports:
- 8099:8099
volumes:
- /data/log/docker/docker-demo:/data/log/docker/docker-demo
environment:
- "TZ=Asia/Shanghai"
deploy:
replicas: 3
networks:
demo-net:
driver: overlay
运行
docker stack deploy docker-demo -c docker-compose.yml
查看stack服务运行情况。执行如下命令:
docker stack services docker-demo
测试
Docker Swarm 负载均衡详解
- Swarm模式内置DNS组件,可以自动为集群中的每个服务分配DNS记录。
- Swarm manager使用内部负载均衡,根据服务的DNS名称在集群内的服务之间分发请求。
- Swarm manager使用 ingress load blancing暴露你想从外部访问集群提供的服务。
- Swarm manager自动为服务分配一个范围30000-32767端口的Published Port,也可以为该服务指定一个Published Port。
ingress network是一个特殊的overlay网络,便于服务的节点直接负载均衡。当任何swarm节点在已发布的端口上接收到请求时,它将该请求转发给调用的IPVS模块,IPVS跟踪参与该服务的所有容器IP地址,选择其中一个,并通过ingress network将请求路由给它。
Docker Swarm 负载均衡模式选择
负载均衡有两种模式:VIP、DNSRR
- VIP:分配独立的虚拟IP,DNS记录解析到服务名中作为代理IP。
- dnsrr:DNS记录不解析VIP,而去解析每个容器内的IP。dnsrr模式不支持端口对外暴露。
管理节点:通过查看服务详细信息筛选当前模式负载均衡模式
docker service inspect docker-demo|grep 'EndpointSpec' -C10
注:当前模式为VIP模式
管理节点:设置DNS轮询模式
docker service update --endpoint-mode dnsrr docker-demo
推荐使用VIP模式
基于DNS负载均衡存在如下问题:
- 某些应用程序将DNS主机名缓存 到IP地址映射,这会导致应用程序在映射更改时超时。
- 具有非零DNS ttl值 会导致DNS条目反映最新的详细信息时,发生延迟。
基于VIP的负载均衡克服了基于DNS负载均衡的一些问题。
在这种方法中,每个服务都有一个虚拟IP地址,并且该IP地址映射到与该服务关联的多个容器的IP地址。在这种情况下,与服务关联的服务IP不会改变,即使与改服务关联的容器死亡并重新启动。
Docker Swarm 负载均衡模扩展知识
可在容器Swarm负载均衡之上在建立一层负载均衡。HAProxy可代理工作节点端暴露的端口进行再次代理,做到双层负载均衡的作用。保证高可用与大规模的应用。
- 上一篇: 【云原生】k8s 一键部署(ansible)
- 下一篇: Kubernetes系列之集群部署
猜你喜欢
- 2024-12-31 二进制部署k8s集群
- 2024-12-31 Kubernetes系列之集群部署
- 2024-12-31 【云原生】k8s 一键部署(ansible)
- 2024-12-31 【云原生】k8s 离线部署讲解和实战操作
- 2024-12-31 探索eBPF:Linux内核的黑科技
- 2024-12-31 Kubernetes 常见故障排查和处理
- 2024-12-31 使用RKE的方式快速部署K8S集群
- 2024-12-31 在 Anolis 8.8 | Rocky 9.3 | AlmaLinux 9.3 上部署 k8s v1.28.3 集群
- 2024-12-31 k8s集群报错:check that the calico/node container is running and has
- 2024-12-31 使用kubeadm搭建一单节点k8s测试集群
你 发表评论:
欢迎- 最近发表
-
- 告别频繁登录!Nuxt3 + TS + Vue3实战:双Token无感刷新方案全解析
- SpringBoot实现单点登录(SSO)的4种方案
- 随机密聊 匿名聊天室程序源码(随机匿名聊天在线)
- SpringBoot大文件上传卡死?分块切割术搞定GB级传输,速度飙升!
- Java 微服务从源码实战开始 | Gitee 项目推荐
- 轻量级埋点sdk搭建,便捷更全面(埋点sdk是什么)
- Spring Boot 实现文件秒传功能(springboot上传文件到指定文件夹)
- 项目中不用redis分布式锁,怎么防止用户重复提交?
- SpringBoot项目日志打印traceId生成
- 如何实现PC端网站扫码登录操作?(网页 扫码)
- 标签列表
-
- ifneq (61)
- 字符串长度在线 (61)
- googlecloud (64)
- flutterrun (59)
- 系统设计图 (58)
- powershellfor (73)
- messagesource (71)
- plsql64位 (73)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- qcombobox样式表 (68)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)