当前位置:   article > 正文

springboot构建docker集群实践部署_单体springboot集群部署

单体springboot集群部署

为啥要用Docker

为啥要用Docker?这要从目前软件行业的痛点来讲起

·  软件更新发布及部署低效,过程繁琐且需要人工介入

·  环境一致性难以保证

·  不同环境之间迁移成本太高

既然docker那么火那么热,那我们不妨学习一下如何构建自己的docker镜像 

通过dockerFile构建自己的镜像

  1. # 基于java镜像创建新镜像
  2. FROM java:8
  3. # 作者
  4. MAINTAINER 杨汉奇
  5. #在容器内创建创建目录,创建的目录之后需要挂载到宿主机外,实现持久化
  6. RUN mkdir -p /demo/data /demo/logs /demo/config /demo/avatar/custom /demo/jar/config
  7. #将jar包添加到容器中并更名为demo.jar
  8. ADD demo.jar /demo/jar/demo.jar
  9. # 启动容器运行的命令
  10. ENTRYPOINT ["nohup","java","-jar","-Dspring.config.location=/demo/jar/config/application.properties","-Duser.timezone=GMT+8","/demo/jar/demo.jar","&"]
  11. #容器对外暴露的端口,比如运行tomcat是8080,则暴露8080端口
  12. EXPOSE 8080

1,编写dockerFile文件,文件内容如上

2,在jar所在目录运行一下命令构建镜像

docker build -t  (dockerFile路径)  (镜像名称:版本号) .      例如:docker build -t  /demo/dockerFile  demo:test  .        [不要缺少最后的点号]

最好构建的镜像可以push到远程仓库,避免部署人员重新进行繁琐的构建镜像

通过docker-stack 方式启动容器

  1. version: '3'
  2. services:
  3. #jar包镜像
  4. demo:
  5. image: demo:test
  6. ports:
  7. - 8080:8080
  8. networks:
  9. #加入的网络名称
  10. - demo_netword
  11. tty: true
  12. command:
  13. - /bin/bash
  14. - -c
  15. - |
  16. tail -f /etc/profile
  17. volumes:
  18. #静态资源挂载到宿主机
  19. - /home/demo/data:/demo/avatar/custom
  20. #系统日志挂载到宿主机
  21. - /home/demo/logs:/demo/logs
  22. #启动配置,启动会运行/home/demo/jar/config的application.properties文件
  23. - /home/demo/config:/demo/jar/config
  24. environment:
  25. #设置环境变量
  26. - BASE_HOST=xxx.xxxx
  27. deploy:
  28. #构建多少个容器,(分布式:访问都是同个IP,docker实现自动分配)
  29. replicas: 3
  30. placement:
  31. #指定在管理节点部署
  32. constraints: [node.role == manager]
  33. depends_on:
  34. - demo_redis
  35. - demo_mysql
  36. - demo_rabbitmq
  37. #nginx服务
  38. demo_nginx:
  39. image: nginx:1.19.2
  40. ports:
  41. - 80:80
  42. networks:
  43. - demo_netword
  44. volumes:
  45. #指定读取的nginx.conf配置
  46. - /home/demo/nginx/nginx.conf:/etc/nginx/nginx.conf
  47. #读取静态文件的目录挂载
  48. - /home/demo/data:/var/www/html/upload
  49. deploy:
  50. placement:
  51. #指定在管理节点部署
  52. constraints: [node.role == manager]
  53. depends_on:
  54. - demo
  55. #redis服务
  56. demo_redis:
  57. image: redis:5.0
  58. ports:
  59. - 6379:6379
  60. networks:
  61. - demo_netword
  62. #设置密码123456,开启持久化,并设置重启数据不丢失
  63. command: redis-server --requirepass 123456 --appendonly yes --save ""
  64. volumes:
  65. #上面开启了持久化,只是在容器内持久化,需要挂载到宿主机才能实现真正持久化
  66. - /home/demo/redis/data:/data
  67. deploy:
  68. placement:
  69. #指定在管理节点部署
  70. constraints: [node.role == manager]
  71. #mysql服务
  72. demo_mysql:
  73. image: mysql:5.7
  74. ports:
  75. - 3306:3306
  76. networks:
  77. - demo_netword
  78. environment:
  79. #最好使用此设定时区,其它静像也可以使用
  80. - TZ=CST-8
  81. - MYSQL_ROOT_PASSWORD=123456
  82. #可以加--default-time-zone='+8:00'设定时区
  83. command: --character-set-server=utf8
  84. --collation-server=utf8_general_ci
  85. --sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
  86. volumes:
  87. #挂载mysql文件目录,实现持久化
  88. - /home/demo/mysql:/var/lib/mysql
  89. deploy:
  90. placement:
  91. constraints: [node.role == manager]
  92. #rabbitmq服务
  93. demo_rabbitmq:
  94. image: rabbitmq:3.7.7-management
  95. ports:
  96. - 4369:4369
  97. - 5671:5671
  98. - 5672:5672
  99. - 15671:15671
  100. - 15672:15672
  101. - 25672:25672
  102. networks:
  103. - demo_netword
  104. volumes:
  105. #本地文件目录
  106. - /home/demo/rabbitmq/pwd:/var/lib/rabbitmq
  107. environment:
  108. - RABBITMQ_DEFAULT_VHOST=my_vhost
  109. - RABBITMQ_DEFAULT_USER=test
  110. - RABBITMQ_DEFAULT_PASS=test
  111. deploy:
  112. placement:
  113. constraints: [node.role == manager]
  114. networks:
  115. #指定加入的docker网络
  116. demo_netword:
  117. external: true

1,编写好docker-stack.yml文件

2,执行以下命令运行运行docker容器

docker stack deploy -c (yml文件)  (名称)         例如:docker stack deploy -c docker-stack.yml  mydockerdemo

查看docker集群运行情况

docker service ls  

停止某个docker集群

docker stack rm mydockerdemo

docker集群还提供滚动更新机制,生成环境更新用户再也无感了,但是前提是开启了多个容器副本

指定某个镜像更新到某个容器

docker service update --image demo:test1  mydockerdemo_demo      (如果名字不清楚,可以通过docker service ls查看需要更新容器的名字)

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/57789
推荐阅读
相关标签
  

闽ICP备14008679号