软件版本:idea:2021.3,docker:19.03.9,服务器:centos7.8
1.centos7服务器配置
在服务器上编辑docker文件
vi /usr/lib/systemd/system/docker.service
修改以ExecStart开头的行
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
如果是centos7以下的直接添加-H tcp://0.0.0.0:2375
修改后保存文件,然后重启docker
systemctl daemon-reload
systemctl restart docker
curl http://localhost:2375/version
然后开端口或者关闭防火墙,二选其一即可
firewall-cmd --zone=public --add-port=2375/tcp --permanent
firewall-reload
关闭防火墙
chkconfig iptables off
2.idea 安装docker 插件
添加docker tcp socket 填写Engine API URL: tcp://ip:2375 其他的默认就可以
3.使用docker 部署springboot项目
在springboot项目的根目录下添加docker文件夹并创建Dockerfile文件
文件内容为:
# 基础镜像
FROM java:8
#维护者信息
MAINTAINER jinquan
# 挂载/home/file目录到主机
#VOLUME 指向了一个/tmp的目录,由于 Spring Boot 使用内置的Tomcat容器,Tomcat 默认使用/tmp作为工作目录。
#这个命令的效果是:在宿主机的/var/lib/docker目录下创建一个临时文件并把它链接到容器中的/tmp目录
VOLUME /home/file
# 复制打包完成后的jar文件到/home目录下
ADD target/docker-test-1.0-SNAPSHOT.jar /home/app.jar
# 设置时区
RUN echo "Asia/Shanghai" > /etc/timezone
#映射8888端口到本机的8099端口
EXPOSE 8888
# 启动容器时执行
#为了缩短 Tomcat 的启动时间,添加java.security.egd的系统属性指向/dev/urandom作为 ENTRYPOINT
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/home/app.jar"]
4.配置idea运行Dcokerfile
idea的server的docker部分会有日志
访问容器所在服务器ip:映射到服务器的端口/项目名 所以这个项目的访问地址为http://192.168.175.130:8099/xxxx
5.遇到的问题以及备注:
5.1 no main manitest attribute
原因是找不到主类。一般情况下,java 打包成 jar 包需要在 MANIFEST.MF 中指定 Main-Class项,以便运行 java -jar xxx.jar 时找到对应的主类。
一般java打包的jar文件通常会包含清单文件(META-INF/MANIFEST.MF)该文件可以包含主类以及加载类路径等信息。
MANIFEST.MF中应用相关属性中Main-Class定义jar文件的入口类,该类必须是一个可执行的类,一旦定义了该属性即可通过启动命令执行。
将docker-test-0.0.1-SNAPSHOT.jar解压后
查看META-INF下的MANIFEST.MF
而正常的MANIFEST.MF应该是这样的:
Manifest-Version: 1.0
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Archiver-Version: Plexus Archiver
Built-By: jquery
Spring-Boot-Layers-Index: BOOT-INF/layers.idx
Start-Class: cn.jingquan.Application
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Version: 2.6.6
Created-By: Apache Maven 3.6.3
Build-Jdk: 1.8.0_311
Main-Class: org.springframework.boot.loader.JarLauncher
解决方案:在pom.xml中加入
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!--加入-->
<version>2.6.6</version>
<!--加入下面两项配置-->
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
</plugins>
<!-- jar包名称 -->
<finalName>docker-test</finalName>
</build>
在sprinboot项目中pom.xml文件加true,代表maven打包时会将外部引入的jar包(比如在根目录下或resource文件下新加外部jar包)打包到项目jar,在服务器上项目才能运行,不加此配置,本地可以运行,因为本地可以再lib下找到外部包,但是服务器上jar中是没有的。
如果不加入 version
主要看以下信息,说是api不兼容导致的。因此必须要加上version
Caused by: java.lang.UnsupportedClassVersionError: org/springframework/boot/maven/RepackageMojo has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 52.0
5.2 Docker镜像列表中的none:none是什么
https://blog.csdn.net/boling_cavalry/article/details/90727359