使用 Docker 部署项目,编码注意事项有哪些?

2023-09-27 17:05:58 +08:00
 fireworksV2

Spring Boot 项目,Docker 部署相比于非 Dokcer 部署,在编码过程中,应该注意哪些事项。

1867 次点击
所在节点    Java
14 条回复
coderxy
2023-09-27 17:08:20 +08:00
没啥要注意的,部署方式跟业务代码没啥关系。
Gota
2023-09-27 17:09:47 +08:00
最好手动指定 jvm 和 pod 的内存,防止线上出现 oom 。
Gota
2023-09-27 17:15:05 +08:00
编码过程就注意下有没有对 native 的依赖,有时候基底镜像的 so 不一定全。
luomao
2023-09-27 17:21:57 +08:00
naidelii
2023-09-27 17:24:32 +08:00
注意设置 docker 日志大小,不然一直增长可能会把磁盘撑满,导致服务异常
rayae
2023-09-27 17:26:06 +08:00
特权容器、数据卷持久化
lsk569937453
2023-09-27 17:28:14 +08:00
@luomao docker 中使用的 java 版本最好是 8u191 以后的。

这个和使用不使用 docker 有关系吗?
xiaooloong
2023-09-27 17:41:52 +08:00
如果不走 k8s 的话感觉用 docker 更麻烦

毕竟已经习惯了走 k8s 的网络管理 和 env 管理 了
tramm
2023-09-28 08:12:07 +08:00
对我来说, 主要注意时区
zpf124
2023-09-28 10:17:24 +08:00
@lsk569937453 早期 jre 无法识别 docker 容器资源 limit 限制,如果不指定 Xmx 之类的参数会直接按照宿主机内存大小进行分配,容易超限 oom , 后续不知道 java 10 几来着 在 openjdk 级别做了一些通用设置可以识别 jvm 可以支持识别 容器限制了。

java 8 按道理后面的版本可能也有加类似的功能,只是当时还是几个不同提供商自己私有实现,没统一规范。
guochao
2023-09-28 10:54:36 +08:00
Dockerfile 略微注意一下就好了

- 尽量使用多阶段构建,要不然代码拷到 layer 里面了
- 慎用 alpine ,不清楚的时候一律用 debian 作为基础镜像
- 部署环境内核比较新的时候,base 不要使用 centos7 这种带着很老的 glibc 的 image ,java 和库依赖 glibc 的时候,很老的 glibc 在新内核上会有问题
guochao
2023-09-28 10:56:58 +08:00
补充内存计算的问题:java8 用 8u372 及以上版本,修了 cgroup2 支持,这是很多新发行版默认的 cgroup 实现,涉及到内存的限制和计算。

java11 以上可能没这个问题了
luomao
2023-09-28 11:35:53 +08:00
@lsk569937453 你是真的不看我贴出来的文章呀
chendy
2023-09-28 14:02:11 +08:00
应用本身没啥,镜像有一些建议
1. 基础镜像建议用官方的 & 不是 alpine 的 & JDK 的不是 JRE 的,从优雅的角度来说这样的镜像攻击面略大但是从实用的角度这样的镜像内置工具更全
2. 做好分层,springboot 自己有解包的命令,可以分出依赖和代码,能真正缩小镜像体积
3. 外挂配置文件

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

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

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

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

© 2021 V2EX