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" |