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,完成,希望对您有用,如果有啥问题留下评论我会第一时间回复
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
