docker踩坑集

Q:Java程序放在docker里,然后像在宿主机|虚拟机里面运行就好了吗?

A:no,no,no ,你会遇到日志时间不准确(时区错误)、中文乱码等异常。

解决办法:

启动时添加如下参数:-Dfile.encoding=utf-8 -Dsun.jnu.encoding=UTF8 -Duser.timezone=Asia/Shanghai
(备注:即便是docker容器的环境变量里设置了也不行,以上参数建议在Java程序中都加上)

Q:不同版本满天飞的情况下,如何互传镜像?

A:思路是都放私服上去下载,但有时客户端版本比较低,遇到报错无法上传,那么可以将dockerfile给对方,或者…

解决办法:

docker save 镜像名字 >镜像名字.war

然后到另一台docker服务器上导入镜像:docker load <镜像名字.war

导入成功之后,可以在这个正确版本的机器上再上传到私服。docker push 镜像名字

注意:镜像名字一般是 域名:端口号/名字 这样的格式才可以直接推送到私服,不然要先将其打上这样的标签再上传。

docker tag 镜像名 规范镜像名

docker push 规范镜像名字

存储方面:默认docker存储限制单个容器10G,总100G,为使之更大并减少IO损耗,可单独做盘独占给docker。但在云环境中这样使用存在问题:根分区太小,数据盘被独占后业务数据存放空间不足,因此需要取消独占使用。

问题:取消后再重启服务器,系统崩溃。

修复办法:

ctrl +d 进入维护模式,修改对那块盘的挂载/etc/fstab中注释对应行,再重启,然后将那块盘重新格式化。

日志问题:

无用的日志 >/dev/null 2&1,否则输出到容器的标准输出,这些日志会被存储在容器的数据卷里,存在性能压力,且在docker logs时几乎无法查到有用信息

有用的日志:写到本地的情况需要注意映射出来,传到远端的情况确保网络连通即可。

这一行启动脚本默认在服务器上运行良好,但在容器中需要做出一定调整。

nohup java -Djavax.net.ssl.keyStore=/data/app/phjrms.jks -Djavax.net.ssl.keyStorePassword=123456 -Djavax.net.debug=true $JAVA_OPTS $JAVA_MEM_OPTS $JAVA_DEBUG_OPTS $JAVA_JMX_OPTS -classpath $CONF_DIR:$LIB_JARS com.puhui.credit.GraphApplication >STDOUT_FILE 2>&1 &

改为:

java -Djavax.net.ssl.keyStore=/data/app/phjrms.jks -Djavax.net.ssl.keyStorePassword=123456 -Djavax.net.debug=true $JAVA_OPTS $JAVA_MEM_OPTS $JAVA_DEBUG_OPTS $JAVA_JMX_OPTS -classpath $CONF_DIR:$LIB_JARS com.puhui.credit.GraphApplication

原因:docker内程序需要非守护态前台运行,否则容器将直接退出。

docker启动srpingboot命令

1
JAVA_OPTS=" -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Djava.security.egd=file:/dev/./urandom -Dfile.encoding=utf-8 -Dsun.jnu.encoding=UTF8 -Duser.timezone=GMT+08 -Djava.net.preferIPv4Stack=true -Djava.util.Arrays.useLegacyMergeSort=true  -Dserver.port=$PORT0"
zhang dong wechat
关注我的微信来交流技术问题吧!