记一次idea+Dockerfile+docker部署

软件版本: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项目

记一次idea+Dockerfile+docker部署_第1张图片

在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+Dockerfile+docker部署_第2张图片
记一次idea+Dockerfile+docker部署_第3张图片
记一次idea+Dockerfile+docker部署_第4张图片
在这里插入图片描述

idea的server的docker部分会有日志
记一次idea+Dockerfile+docker部署_第5张图片

访问容器所在服务器ip:映射到服务器的端口/项目名 所以这个项目的访问地址为http://192.168.175.130:8099/xxxx
记一次idea+Dockerfile+docker部署_第6张图片

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文件的入口类,该类必须是一个可执行的类,一旦定义了该属性即可通过启动命令执行。

记一次idea+Dockerfile+docker部署_第7张图片
将docker-test-0.0.1-SNAPSHOT.jar解压后

查看META-INF下的MANIFEST.MF
记一次idea+Dockerfile+docker部署_第8张图片
而正常的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.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
                 
                <version>2.6.6version>
                
                <executions>
                    <execution>
                        <goals>
                            <goal>repackagegoal>
                        goals>
                    execution>
                executions>
                <configuration>
                    <includeSystemScope>trueincludeSystemScope>
                configuration>
            plugin>

        plugins>
        
        <finalName>docker-testfinalName>
    build>

在sprinboot项目中pom.xml文件加true,代表maven打包时会将外部引入的jar包(比如在根目录下或resource文件下新加外部jar包)打包到项目jar,在服务器上项目才能运行,不加此配置,本地可以运行,因为本地可以再lib下找到外部包,但是服务器上jar中是没有的。

如果不加入 version

记一次idea+Dockerfile+docker部署_第9张图片

主要看以下信息,说是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

你可能感兴趣的:(服务器端程序设计,intellij-idea,docker,java)