V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fzdoudou
V2EX  ›  Docker

生产环境部署疑问

  •  
  •   fzdoudou · 42 天前 · 2356 次点击
    这是一个创建于 42 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 、这样一台服务器能支撑的起多大的业务量,如果一天有几十万请求,是否撑得住
    第 1 条附言  ·  40 天前
    感谢各位大佬的解答,大概已经有了一个比较清晰的思路了
    1 、首先我目前的目标主要是快速上线(五一假期结束前)验证业务,业务跑起来才是最主要的。我现在大部分疑问都是因为对 docker 的不熟悉,这无疑是给我的快速上线增加了学习成本。
    2 、在这一周的时间我在测试服务器练习了一下 docker ,docker compose 确实比较方便,但是我只能达到浅显使用的水平,一旦遇到什么不熟悉的问题,解决耗时非常久,比如第一个问题就是想要在启动 rabbitmq 容器的时候自动启动延时插件,结果一直启动失败。最后只能做到启动 rabbitmq 镜像的时候挂载宿主机插件目录,启动成功后进入容器内手动启动一下延时插件。第二个问题也是耗时最久的,卡了两三天,我把 Java 服务部署在了宿主机,nginx 使用 docker, 启动是可以正常启动,但是前端页面访问后端接口的时候一直访问不到,他们之间的通信有问题,这个是因为我不了解 docker 和宿主机之间的通讯原理。
    3 、看完大佬们的回答,我决定使用混合部署的方式,数据库我直接使用阿里云 RDS (先买个便宜的用用),redis 和 rabbitmq 使用 docker ,Java 和前端直接使用最熟悉的方式在宿主机部署,写了一个脚本可以实现 git 拉项目,编译打包启动项目。因为这段时间接触 docker 下来觉得容器化还是挺有必要的,特别是在未来的一年半载里都是我一个人开发运维,后面我把 docker 练熟悉了再把服务统一容器化,业务跑起来,升级服务器再搞容器化也更好些,现在资源都很吃紧
    4 、昨天花了半天时间已经在宿主机装了 Java 环境,maven ,nginx ,node.js ,redis 和 rabbitmq 使用容器启动成功,RDS 也准备好了,接下来就是部署业务代码了
    最后也希望大佬们看到我哪里有做的不合理不对甚至很低级的错误行为麻烦指正一下,也是第一次部署自己的项目到生产运营,不懂的太多。
    26 条回复    2025-04-27 10:33:05 +08:00
    hwdq0012
        1
    hwdq0012  
       42 天前
    等你 docker compose up -d 一下拉起一个服务,你就爽到了,我觉得你职业的后期阶段会是 devops ,kubernetes 肯定是必由之路,那么 docker 学一学是很有必要的, 等你 docker compose up -d 一下拉起 n 个服务组成的一个可用应用,如 gitlab ,kafka 之类的, 你就不会想直接在主要上部署了
    docker 的 volumne 可以定义为 ntfs , 大部分存储都支持 ntfs ,
    你可以在做一个开发 docker, ssh 上去开发 ,生产的 docker 可以从开发的 docker 直接 commit 成为镜像,但建议最好写 docker 脚本, 理解一下 docker 的缓存机制, 每次增量 push 增量 pull 是最佳方案。

    滚动更新,弹性扩容我也很想学,我没实践经验, 开多个负载均衡的 docker ,然后用 keeplive 让它们选举一个 ip 绑定到虚拟 ip 上, 实际的实例挂掉了其他的实例会再重新选举,绑定到虚拟 ip ,虚拟 ip 向外提供

    无状态的这样搞应该没什么问题, 有状态的可能要在负载均衡上做粘性会话之类的东西
    iloveayu
        2
    iloveayu  
       42 天前
    1. 你都想后续扩容做集群了,建议直接 Docker 做部署,你可能需要详细设计一下哪些组件进容器。
    2. RDS 和你连普通 MySQL 没区别,改 Java 的配置就可以了,直接装 MySQL 到 VM 里也是可以的,阿里云定期快照或者镜像,或者想办法单独备份数据库到 OSS 啥的。
    3. 不用 Jenkins 就自己本地写脚本,打包代码时直接带上 docker build 步骤,然后每次 save image ,传输到你的服务器上去 run 。
    4. 5M 固定带宽是瓶颈。
    fzdoudou
        3
    fzdoudou  
    OP
       42 天前
    @hwdq0012 #1 没错,后期肯定是 devops ,我考虑用 docker 的时候也是这么想,因为这个项目只有我一个人负责,前端后端运维全套都要做,前端可以用 cursor ,运维方面是一点经验都没有。想到用 docker 就是想到大家都在说 docker 可以一键拉起整个项目,现在纠结的那些点可能还是在于对 docker 太不熟悉了。
    fzdoudou
        4
    fzdoudou  
    OP
       42 天前
    还有一个疑问是 docker 性能会比直接在宿主机部署有下降吗
    fzdoudou
        5
    fzdoudou  
    OP
       42 天前
    @iloveayu #2 哪些组件进容器这个也是我最大的问题,我并不知道哪些适合进容器,哪些不适合进容器,如果有些不进容器,那么他们之间的通信会不会有什么问题,我在测试服务器上是把所有中间件和 nginx 代理前端都部署在了容器,Java 服务部署在了宿主机,结果前端一直访问不到后端服务,让 ChatGPT 教了两天都没解决
    jianghuan2
        6
    jianghuan2  
       42 天前
    @fzdoudou #4 可忽略不计
    runinhard
        7
    runinhard  
       42 天前   ❤️ 1
    docker 玩到最后就是 k8s 干脆直接跳过 docker compose 算了
    jianghuan2
        8
    jianghuan2  
       42 天前
    @runinhard #7 个人感觉还是要学,因为在没有 k8s 环境下,最优选择就是 docker-compose
    jianghuan2
        9
    jianghuan2  
       42 天前
    @fzdoudou #5 什么叫部署在容器?正确操作方式是:一个组件一个镜像(再启动容器),再把端口映射出来。中间件、前端 nginx 、后端 java 皆是镜像(容器)
    ala2008
        10
    ala2008  
       42 天前
    经验就是,docker 比 jar 和 war 包吃多很多资源 你这个服务器配置有点低
    wangwaner
        11
    wangwaner  
       42 天前
    docker 国内镜像被 ban 了之后学习曲线陡然就上去了,直接卡在拉镜像这步了
    fzdoudou
        12
    fzdoudou  
    OP
       42 天前
    @ala2008 #10 前期只是验证业务流程是否跑的通,跑的通以后会升级,大概要多大的配置才能跑的起来
    fzdoudou
        13
    fzdoudou  
    OP
       42 天前
    @wangwaner #11 为什么国内会 ban docker 呢,不是很理解
    fzdoudou
        14
    fzdoudou  
    OP
       42 天前
    @ala2008 #10 另外吃资源指的是 cpu 还是内存呢
    defunct9
        15
    defunct9  
       42 天前   ❤️ 1
    2C 4G ,还要跑这么多东西,用个鬼的 Docker 。直接部署。
    zepc007
        16
    zepc007  
       42 天前
    @runinhard k8s 后面还有 helm-chart😅
    ala2008
        17
    ala2008  
       42 天前
    @fzdoudou #12 内存,基本一个 java 服务就要 1g 以上
    sagaxu
        18
    sagaxu  
       42 天前
    1. Java 项目没必要用 Docker ,除了 JRE 并没有其它依赖,JRE 安装很方便,没必要用 Docker ,资源隔离用 systemd 就能做了。

    2. RDS 当然要上,起码 1 主 1 从,省去自己折腾备份和监控的麻烦。

    3. 做个 ssh 密钥登陆,写个 Makefile ,命令行一键部署。

    4. 一天几十万请求量并不大,一般瓶颈在 DB 和网络,不在业务负载机。
    lucasj
        19
    lucasj  
       42 天前
    1. 生产环境,别乱搞,用自己最熟悉的方案。想用 Docker 先自己用熟了再上生产环境。
    2. RDS 云数据库,有钱就上啊,反正上了比没上好。没钱也可以定期自己备份。
    3. 最快部署?你当前最熟练的方式。
    4. 先撑,撑不住再说。
    julyclyde
        20
    julyclyde  
       42 天前
    “容器是一个界限”
    你要深刻理解这句话
    不仅仅是静态的(文件系统 image )同时也有动态的(运行时 namespace 、cgroups )

    把应用程序向容器环境改造的过程,其实是梳理应用程序边界的过程
    mahone3297
        21
    mahone3297  
       41 天前
    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
        22
    chloerei  
       41 天前 via iPhone
    推荐使用 docker ,它解决了环境依赖的问题。

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

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

    数据库推荐用云托管数据库,备份恢复更容易。
    nananqujava
        23
    nananqujava  
       41 天前
    强烈建议 docker 部署, 流水线就用阿里云效, 数据库直接买 RDS
    oneisall8955
        24
    oneisall8955  
       41 天前
    云服务配置太低,在我司,单个 JAVA 应用也 2C4G 了,像练习 docker ,本地起虚拟机搭建一套环境
    scoful
        25
    scoful  
       40 天前
    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
        26
    fzdoudou  
    OP
       40 天前
    @scoful #25 你自己项目的这种方式也是我现在想要用 docker 实现的方式,奈何现在使用 docker 的水平太浅,我一开始连代码在本地改完以后怎么重新更新容器里的服务都不知道
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2654 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 11:44 · PVG 19:44 · LAX 04:44 · JFK 07:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.