Spring Boot 项目,Docker 部署相比于非 Dokcer 部署,在编码过程中,应该注意哪些事项。
1
coderxy 2023-09-27 17:08:20 +08:00
没啥要注意的,部署方式跟业务代码没啥关系。
|
2
Gota 2023-09-27 17:09:47 +08:00 via iPhone
最好手动指定 jvm 和 pod 的内存,防止线上出现 oom 。
|
3
Gota 2023-09-27 17:15:05 +08:00 via iPhone
编码过程就注意下有没有对 native 的依赖,有时候基底镜像的 so 不一定全。
|
4
luomao 2023-09-27 17:21:57 +08:00
docker 中使用的 java 版本最好是 8u191 以后的。
https://www.oracle.com/java/technologies/javase/8u191-relnotes.html https://blog.aicq.icu/archives/jvm-optimization-in-docker-k8s |
5
naidelii 2023-09-27 17:24:32 +08:00
注意设置 docker 日志大小,不然一直增长可能会把磁盘撑满,导致服务异常
|
6
rayae 2023-09-27 17:26:06 +08:00
特权容器、数据卷持久化
|
7
lsk569937453 2023-09-27 17:28:14 +08:00
|
8
xiaooloong 2023-09-27 17:41:52 +08:00
如果不走 k8s 的话感觉用 docker 更麻烦
毕竟已经习惯了走 k8s 的网络管理 和 env 管理 了 |
9
tramm 2023-09-28 08:12:07 +08:00
对我来说, 主要注意时区
|
10
zpf124 2023-09-28 10:17:24 +08:00
@lsk569937453 早期 jre 无法识别 docker 容器资源 limit 限制,如果不指定 Xmx 之类的参数会直接按照宿主机内存大小进行分配,容易超限 oom , 后续不知道 java 10 几来着 在 openjdk 级别做了一些通用设置可以识别 jvm 可以支持识别 容器限制了。
java 8 按道理后面的版本可能也有加类似的功能,只是当时还是几个不同提供商自己私有实现,没统一规范。 |
11
guochao 2023-09-28 10:54:36 +08:00
Dockerfile 略微注意一下就好了
- 尽量使用多阶段构建,要不然代码拷到 layer 里面了 - 慎用 alpine ,不清楚的时候一律用 debian 作为基础镜像 - 部署环境内核比较新的时候,base 不要使用 centos7 这种带着很老的 glibc 的 image ,java 和库依赖 glibc 的时候,很老的 glibc 在新内核上会有问题 |
12
guochao 2023-09-28 10:56:58 +08:00 1
补充内存计算的问题:java8 用 8u372 及以上版本,修了 cgroup2 支持,这是很多新发行版默认的 cgroup 实现,涉及到内存的限制和计算。
java11 以上可能没这个问题了 |
13
luomao 2023-09-28 11:35:53 +08:00
@lsk569937453 你是真的不看我贴出来的文章呀
|
14
chendy 2023-09-28 14:02:11 +08:00
应用本身没啥,镜像有一些建议
1. 基础镜像建议用官方的 & 不是 alpine 的 & JDK 的不是 JRE 的,从优雅的角度来说这样的镜像攻击面略大但是从实用的角度这样的镜像内置工具更全 2. 做好分层,springboot 自己有解包的命令,可以分出依赖和代码,能真正缩小镜像体积 3. 外挂配置文件 |