zoukankan      html  css  js  c++  java
  • 从零开始部署发布Java项目到服务器的Docker中

    本以为很简单,由于没用过docker和java,本文将会阐述一路遇到的拦路虎。

     首先,写好Java项目,本地跑通。

    可能会遇到的问题:

    1.jar包正常运行,war包404:

    如何打包很多教程都有介绍,本文不重复赘述。

    如果jar包正常,war包404,大概率是由于打包错误导致的(假如你不使用xml文件。需要在启动程序中添加extends spriingbootservletInitializer,并继承。

    2.tomcat404

    tomcat404除了上面的问题,那就是路径的问题。

    war包放在waeapps中后会自动生成文件夹,如果war包名为root就可以在localhost:8080/根路径直接访问。否则就需要在localhost:8080/war包名/下访问程序。

    3.tomcat404

    tomcat版本问题,如果是jdk1.8就建议tomcat8以上版本

    4.还是404,自己程序Idea可以运行,但是放在tomcat报错

    可能是tomcat版本问题,如果tomcat版本比较低,只要数据库连接有问题,直接所有页面无法访问,然而新的版本tomcat,不连数据库的连接可以正常访问,连数据库的页面会报Whitelabel Error Page

    因此建议jdk8用tomcat8.5

    5.依然是404

    打包问题,确保pom文件中,build包含你你所需的文件。例如如果你是theamleaf编写前端,必须要包含相关的teaamleaf文件。自然配置文件也必须包含在包里。可以通过解压缩观察包文件结构来判断是否为打包问题。

    6.本地tomcat正常,但是docker无法访问8080端口

    如果自己本地不是linux,docker run -p 无法完成映射,需要指定端口号映射,例如-p 8080:8080

    例如我的:

    docker  build  -t  demo-image:v1  .

    docker run -d -p 8080:8080 demo-image:v1

    7.docker可以访问,但是数据库无法访问

    mysql不可对外开放。在mysql状态下运行如下:

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '密码' WITH GRANT OPTION;

    flush privileges;

    8.宿主机器的数据库无法访问

    宿主机器在docker中无法通过localhost这类方式访问。

    如果不是linux电脑,docker0也不存在。

    可以使用host.docker.internal访问

    本人mac,用docker.for.mac.host.internal也可以访问。

    host.docker.internal如下:

    url: jdbc:mysql://host.docker.internal:3306/javaDemo?allowPublicKeyRetrieval=true

    9.Public Key Retrieval is not allowed错误解决方法

    见问题7,?后增加allowPublicKeyRetrieval=true即可

    10.docker无法push,报错denied: requested access to the resource is denied

    docker页面中创建仓库

    docker tag demo-image:v1  账号/test-image:v1

    docker push  账号/tdemo-image:v1

    我是在docker页面中创建仓库,然后执行相关指令,然后给自己本地镜像改名,解决此报错信息。

     

    11.linux中docker 无法访问本地数据库

    可能是我服务器centos无法host.docker.internal这种dns地址,所以使用ifconfig,找docker0的ip地址。

    吧连接改为docker地址对于的ip。重新发布一下程序。

     

     

    如何检索问题:

    1.报错404

    如果404,检查路径,是否能够正确对应上;检查打的包有没有问题。检查webapps里文件是否存在。

    如果在docker中

    docker exec -it 容器名 /bin/bash

    可以进入容器目录的tomcat文件夹。容器名可以通过docker ps来查看

    进入webapps文件夹查看自己的路径是否有文件。

     

    2.如何确定打包问题

    除了问题1外,打包问题都是缺少文件,直接解压缩war包,确定你所需要的文件都在war包中。尤其是配置文件,以及静态文件。

     

    3.如何确定docker网络问题

    可以通过docker exec -it 容器名 sh进入容器。

    然后通过ping ip,比如你数据库连接

    url: jdbc:mysql://host.docker.internal:3306/javaDemo?allowPublicKeyRetrieval=true

    可以在docker内部ping  host.docker.internal

    判断docker是否正常连接相应ip,

    如果 ip可以连,还需要确定是否能连接数据库。可以在其他任何计算机上

    mysql -h IP -u test -P

    来判断服务器数据库是否可以连接。

    最后附上本人的dockerfile:

    from tomcat:8.5
    copy test.war /usr/local/tomcat/webapps/
    expose 8080

    其中,war包名字叫做test.war.

    然后就可以使用IP:8080/test/来访问了。

    如果名字是Root.war,就可以通过IP:8080/来访问。



     

  • 相关阅读:
    音乐分类/生成杂记
    音视频编码笔记
    《The challenge of realistic music generation: modelling raw audio at scale》论文阅读笔记
    使用基于Caffe的MobileNet分类踩坑备忘录
    四大轻量化模型对比(转)
    WaveNet: 原始音频生成模型
    《SONG FROM PI: A MUSICALLY PLAUSIBLE NETWORK FOR POP MUSIC GENERATION》论文笔记
    上采样 及 Sub-pixel Convolution (子像素卷积)
    python之sys._getframe() 用于查看函数被什么函数调用以及被第几行调用及被调用函数所在文件
    11
  • 原文地址:https://www.cnblogs.com/pghcx/p/14200655.html
Copyright © 2011-2022 走看看