生产环境部署疑问

141 天前
 fzdoudou
crud javaer 一枚,平常只会写 CRUD 业务代码,菜鸟一枚,虚心请求各位大佬。从来没有去研究过生产环境部署的流程,现在有个小项目想要部署到阿里云去,有很多疑问。目前已经买了一台阿里云服务器 2C4G 5M 固定带宽 80G 云盘。
项目背景
1 、Java 后端服务一个,B 端管理后台一个,C 端一个
2 、使用到了 jdk17,redis,rabbitmq,mysql 这些基础的中间件,项目构建使用 maven,nginx 做反向代理
3 、前期只是验证业务流程,跑起来后可能需要扩容服务器做集群
4 、有让 ChatGPT 给我梳理流程,前面讲的挺好的,但是我疑问越多发现它会有点不记得我之前的背景,经常做一些结果不一样的输出
疑问
1 、最大的疑问就是对使用 docker 还是直接在宿主机部署一直纠结不定,归根到底还是我从来没有用过 docker ,一直看别人说 docker 部署非常方便,所以就想试试看。但是我在试用服务器边学习 docker 边部署,感觉也没有想象的那么方便。所以想问下对于我这种情况以及未来的发展方向是否需要用 docker
2 、是否一开始就要上 RDS 云数据库,如果上了以后它跟 docker 是怎么连接的,mysql 部署在宿主机会有丢失数据的风险吗
3 、如果使用了 docker ,我的代码在本地改完如何最快的部署上去,现在不考虑用 Jenkins ,一个人精力现在还不够
4 、这样一台服务器能支撑的起多大的业务量,如果一天有几十万请求,是否撑得住
2979 次点击
所在节点    Docker
26 条回复
mahone3297
140 天前
1. docker ,你觉得没那么方便,是因为你不懂 docker ,现在是学习的过程,心里肯定觉得老的方式好,方便
2. 肯定 rds 。不然,部署在 ecs 上?如果挂了,数据丢了怎么办?还是数据无所谓? rds 上有 host ,port ,账号密码,就这样连
3. 用了 docker ,改为代码需要
- push 代码到 git
- docker build
- docker image push to register
- 线上 ecs ,docker pull image ,docker run
- 前端应该有个 LB (可能是 nginx ),指向从老的 docker container-old 指向 docekr container-new
4. 不好说,要看你整个系统。如果真不行,就垂直升级 ecs 。再不行,水平扩容 ecs

## PS
- 上面的 docker 方案,你用熟了,可以换 kubernetes
- 我最近在看 serverless ,没觉得 kubernetes 哪里好,觉得应该 serverless 更方便。serverless 就是 kubernetes 未出现时的解决方案。比如阿里云的 fc ,aws 的 lamba 。你可以考虑试下。阿里云的也比较方便,只要起 1 个 http 服务就好
chloerei
140 天前
推荐使用 docker ,它解决了环境依赖的问题。

单机部署可以用 docker compose ,简单。

多机部署需要一个管理镜像更新的部署工具,企业级方案是 k8s ,但这个会复杂到让你怀疑人生。我推荐用 https://kamal-deploy.org/ ,虽然它一开始用于 Rails 项目,但只要应用能 docker 化就能支持。

数据库推荐用云托管数据库,备份恢复更容易。
nananqujava
140 天前
强烈建议 docker 部署, 流水线就用阿里云效, 数据库直接买 RDS
oneisall8955
140 天前
云服务配置太低,在我司,单个 JAVA 应用也 2C4G 了,像练习 docker ,本地起虚拟机搭建一套环境
scoful
139 天前
1. 有人提到说用 k8s ,个人觉得个人项目使用这种重型管理工具,都是在浪费宝贵的个人服务器资源,运行起来 k8s ,就没剩下多少可以部署项目的资源了,就算是 k3s 或 rancher 也一样,除非是企业项目,有大把资源可以投入 CI/CD
2. 你这个项目看说明应该不是微服务,那扩容就简单粗暴使用 nginx 分流一下,起多几个后端服务
3. 这里面最需要考虑的是你的中间件,redis ,rabbitMQ ,mysql ,这 3 个到底要自己做高可用还是用云服务,还是前面的逻辑,自己做高可用配置的话,又占用了一堆个人服务器资源,如果项目刚起步的时候,其实很浪费
4. 如果只是前期验证业务逻辑的话,可以直接把 3 个中间件和后端服务直接编排进一个镜像里,然后用宿主机挂载数据目录的方式。这样就是 2 个镜像,1 个管理后台的,1 个 c 端的。
5. 使用云数据库,和你本地数据库连接的用法一样的,至于跟 docker ,就是挂载目录,挂载配置文件
6. 宿主机自己部署中间件,肯定有丢数据的风险,只是这个几率不高,如果担心,就是花钱买云厂商的服务
7. 分享一下我自己的项目,我是前端一个镜像,后端一个镜像,redis 一个镜像,mysql 一个镜像,然后使用 docker-compose 编排启动顺序,代码存在 github 私人项目里,然后在 github 里配置 action 脚本,每次我推送代码后,自动打包成新的镜像,然后我最后再去服务器上停了已经启动的服务,再手动修改一下 docker-compose 里的镜像标签,然后重启,就完事了,打包的镜像我推送到阿里云免费的空间里。属于半自动。
fzdoudou
139 天前
@scoful #25 你自己项目的这种方式也是我现在想要用 docker 实现的方式,奈何现在使用 docker 的水平太浅,我一开始连代码在本地改完以后怎么重新更新容器里的服务都不知道

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1128044

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX