前言: 在通过docker部署java服务时碰见了一些比较奇特的容器问题, 经过网上查找一些资料解决掉了, 共勉= ,= 后面有新的可能会更新
时区问题
容器系统Ubuntu/usr/share/zoneinfo
路径下没有Asia/Shanghai
, 所以容器run的时候要挂载上去才能设置时区-e TZ=Asia/Shanghai
, 不然挂载/etc/localtime
或者/etc/timezone
都是没用的.
rpc注册问题
内网服务器的java服务通过docker部署在需要注册到注册中心需要注意网络问题, 会注册docker容器的内网ip上去, 导致rpc调用失败. 通过--network=host
让容器使用宿主机网络环境, 这样不管是nacos还是sentinel都可以注册宿主机内网ip上去.
jar镜像问题
如果jar包通过docker打成image去run的话, 需要注意版本. 默认是最新的.
其他暂时没碰见但有可能的问题
- 需要的东西挂载就好了, 事后cp很麻烦.
- docker run的时候
-rm
可以在退出时自动删除容器, 和-d
冲突.-d
为后台运行并返回容器id. - docker跑java服务占地方很夸张. 但java9以后jvm才对container提供了原生支持(
useContainerSupport
参数), 所以在java8(8u212以下, 因为8u212及以后开始支持docker, 允许通过参数微调堆大小百分比占用)的时候, 需要通过-m
限制容器内存以及java启动时对jvm做内存限制, 否则jvm无法感知在容器中, 还无法解决问题, 导致周期性重启.