Linux安装docker并运行jar包

1.docker介绍

docker意为码头工人的意思,小型的虚拟机,我的理解就是docker就像是一个工具箱,我们部署项目时需要的环境不用去下载安装,在docker上可以拿来即用,省去了一大部分操作,且不同的项目放在他们相对应的docker容器上互不干扰,通俗点就是,在自己电脑上安装了jdk,mysql,nginx。也就是所谓的环境,然后部署到服务器上,服务器也要安装相同的jdk,mysql,nginx,这样一来不就有点浪费时间嘛,而且有个问题,就是说我的项目做到后面需要添加新的东西,比如redis,那我又要去服务器上也安装一个redis,然后我可能要Kafka,又得去服务器上安装kafka,而且之间的安装方式还不太一样,且万一以后这个项目后面的编写改成c语言了呢,所以docker的存在就是解决了这些问题,在本地docker上将需要的环境写入镜像文件上传到服务器,服务器docker会根据镜像文件去仓库拉取

2.docker安装

在菜鸟上学习的

https://www.runoob.com/docker/centos-docker-install.html

笔者的是CentOS 8系统

3.安装jdk

docker pull openjdk:slim-buster

附:拉取镜像教程(镜像指的就是docker拉取或创建的对象,镜像可以自己创建也可以拉取docker仓库里面的,镜像用docker images查询)

docker仓库:https://hub.docker.com/

 4.运行jar包

在存放jar包的目录下面新建dockerfile文件,dockerfile是构建镜像的文件,里面包含了描述了构建镜像的指令和说明

我是在usr/local/java/下面存放的jar包

cd usr/local/java

touch dockerfile

vim dockerfile

dockerfile存放以下内容:

FROM openjdk:slim-buster
VOLUME /tmp
ADD article.jar app.jar
ENTRYPOINT ["java","-jar","-Dspring.profiles.active=pro","/app.jar"]

from :定制的镜像基于from指定的镜像,这里from指定了我们刚刚拉取的jdk镜像openjdk:slim-buster,所以jdk就相当于这个镜像(可以说是服务器了)的环境

volume:定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。

add:将左边的jar包放到docker里面并取名为app.jar article.jar 为运行的jar包路径即名称,因为我放在当前目录下的,所以直接写名字就行了,app.jar为将article.jar放在镜像里面的jar名称

entrypoint:运行的命令,一个命令占一个位置

编译:docker build -t article .

编译是将dockerfile编译成一个docker镜像,-t(镜像的名字和标签,可以是name,也可以是name:tag,可以指定多个标签),后面的article就是我为这个镜像取得一个名字

查看镜像列表

docker images

运行结果

 运行: docker run -d --restart=always --name article -v /usr/local/logs:/home/logs -p 9022:9022 article

此时运行这个镜像我们叫docker容器

指令描述:

-d:后台运行容器,并返回id

--restart:指定重启后自动运行容器

--name:指定容器名字

-v:绑定一个卷

-p:指定端口映射,格式为:主机(宿主)端口:容器端口(这里最好两个都写jar包中指定的一样的端口(前提是jar包是spring boot框架,且内嵌了tomcat))

后面这个article指的是容器依赖的镜像

回车运行后会返回一个容器id

查看容器列表

输入docker ps

返回:

 查看输出内容(日志)

输入 docker  logs 47e87a02057c (容器id)

返回

 输出的即是jar包运行的日志

5.访问

curl:http://120.77.183.71:9022/queryHotArticles (这个是在linux服务器上输入的命令)

输出:

 在postman测试也是没问题的

6.关闭容器

docker stop 47e87a02057c (容器id)

7.问题

总的来说没啥大问题,这里就记录以下我遇到的问题

 1.报了一个容器名已使用的错误

Error response from daemon: Conflict. 
The container name "/article" is already in use by container "8961a3ee723a66d08e5631f5d46fbc73f61fad2d5f2ea4095d0c8b6a20b723c0". 
You have to remove (or rename) that container to be able to reuse that name. 
See 'docker run --help'.

意思是说容器article已被容器id为8961a3ee723a66d08e5631f5d46fbc73f61fad2d5f2ea4095d0c8b6a20b723c0所使用

当时我在想我已经关闭了容器,怎么还告诉我名字被容器占用,后面才想到,关闭并不等于删除,也就是说容器里面还有这个容器id

查看容器列表

docker ps -a

删除容器

docker rm 47e87a02057c (容器id)

2.运行jar查看日志报:Error: Unable to access jarfile article.jar

这个乍一看是权限不足造成的,所以一开始就是往这个方向里面找问题的

然后在启动容器的命令上加了--privileged=true这么一段

即  docker run -d --restart=always --name article -v /usr/local/logs:/home/logs -p 9022:9022 article --privileged=true

但还是不行,于是往下一个方向思考,于是想到了会不会是selinux霸道安全机制造成的

输入命令:getenforce

输出:Disabled
表示selinux已被禁用,我当时就懵了,都被禁用了肯定不是这个问题,然后我就重新看了以下,发现了问题

问题在于dockerfile这个文件上

一开始我是这样写的:

FROM openjdk:slim-buster
VOLUME /tmp
ENTRYPOINT ["java","-jar","-Dspring.profiles.active=pro","article.jar"]

没有加add这个描述行,所以docker压根就找不到article.jar这个jar包

3.无法通过公网ip访问接口

这个一开始就想到的会不会是服务器没有开放这个端口,因为我是用的是阿里云的服务器,所以就去阿里云里面看看有没有设置,但一开始没看到,然后就想着要不手动关闭防火墙吧

Linux操作防火墙命令:https://zhuanlan.zhihu.com/p/161196711

输入:systemctl status firewalld

报:
firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)

防火墙压根就没开,就很懵逼,然后还是默默的去网上百度去了,然后发现果然还是要去阿里云控制台里面手动开启开放端口

阿里云服务器开启开放端口示例:https://developer.aliyun.com/article/350766

 

ok,完成,希望对您有用,如果有啥问题留下评论我会第一时间回复 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部