新手第一次使用docker运行java程序的那些坑(附流程及解决方法)

第一次在Linux上使用运行docker来运行javaweb程序,遇到了不少的问题,在此我把运行的流程和解决方法贴出来以供大家操作时避免。

  1. 首先我们要有一个能运行的java程序将其打成war包,
    打成war包方法:idea-右边maven-选中一个项目-lifecyle-先clean-再package
  2. 有了war包后,由于是在windows端,就需要把war上传到linux,这里有很多种方法,我使用的是在xshell端命令的方式:
    坑: 正常使用rz直接跳转到选择文件的窗口,选择文件上传即可,我这里上传后直接卡死,终端出现大量乱码,无奈只能重启系统。
    解决: 使用rz -be完美解决!
  3. 之后使用dockerfile的方式来构建镜像,
    首先创建一个文件夹mkdir myjava
    进入该文件夹中cd myjava
    在创建vim Dockerfile,在里面写文件
    贴士: 这里vimtouch都可以创建文件,vim直接可以进入文件中,touch则是创建一个空文件,后续可以自己编辑。
  4. 下面是文件内容
    #基础镜像 tomcat:7.0.88-jre
    FROM tomcat:7.0.88-jre8
    
    #作者
    MAINTAINER benxin.guo
    
    #定义环境变量
    ENV TOMCAT_BASE /usr/local/tomcat
    
    #复制war包
    COPY ./session-web.war $TOMCAT_BASE/webapps/
    
    1. 基础镜像tomcat可以自己选择特定的版本号,也可以在docker hub上进行查找版本号,查找命令docker search tomcat
    2. 可以写上作者,可写可不写
    3. 定义tomcat环境变量
    4. 将名称为session-web.war的war包复制到tomcat的webapps目录中去
  5. 编写完Dockerfile文件后就可以构建镜像了,
    命令为docker build -t session-web:latest .
    注意: 这里最后有一个 不要忘记了,代表指定镜像构建过程中的上下文环境的目录,-t后面是取名。
  6. 构建后使用命令
    docker run --name session-web -d -p 8888:8080 session-web:latest来运行容器。
    --name后面跟的是给容器起的别名 -d 表示在后台运行,不加上它,运行后会有tomcat的日志控制台 -p指定宿主机的端口号8888是自定义的,8080是本身的端口映射到8888上 ,最后则是构建镜像的名称。
  7. 正常到这里已经结束了,打开windows的浏览器输入javaweb程序网址,就已经出现页面了。
写在最后:
  1. 个人操作时,遇到的问题,我打开网页后,发现浏览器500的错误了。problem with class file or dependent class; nested exception is java.lang.UnsupportedClassVersionError: (主要报错日志)分析原因:

1)以为是linux中没有安装jdk,java -version 显示安装了jdk1.8

2)可能是docker运行的镜像中没有安装jdk,可是我又没办法看,也不知道安装完tomcat镜像后,需不需要再次安装jdk,只能运行后,查看一下容器中有没有jdk。通过搜索知道进入容器的命令为docker attach 镜像id或者名字,结果运行后,又卡死了,无奈继续查找,最后使用docker exec -it 名字 /bin/bash(/bin/bash必须加) 成功进入到容器中,使用java -version,显示jdk版本1.7,就证明已经有jdk了,所以还是没解决浏览器500的问题。
附: docker attach 和 docker exec的区别,前者退出容器后,容器停止运行,后者还是在执行,退出代码exit crtl+d

3)最后的原因是由于linux的jdk版本是1.8,docker镜像jdk是1.7,不兼容产生的原因,重新构建dockerfile换成tomcat8就好了。
4)还有在运行中如果已经run 运行一遍了,再次执行代码会报错
docker: Error response from daemon: Conflict. The container name "/xx" is already in use,这是由于容器container已经有了一个一样名字,解决方法:

  1. 在run时候,重命名
  2. 删除container容器 docker container rm 镜像id
    附: docker对于运行过的image都保留一个状态(container),可以使用命令docker ps来查看正在运行的container,对于已经退出的container,则可以使用docker ps -a来查看。 如果你退出了一个container而忘记保存其中的数据,你可以使用docker ps -a来找到对应的运行过的container使用docker commit命令将其保存为image然后运行。
    其中docker container ls -all docker ps -a 效果一样
    docker container ls docker ps 效果一样。
    停止容器docker container stop 镜像id
    开始容器docker statrt 镜像id

很多东西就是眼高手低,仅一个实例就用了快一天的时间去解决,不自己运行一遍真不知道会有这么多错误,也仅仅通过一个简单的java运行实例,拓展了docker的知识面。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值