【Docker】6.web项目打包成docker镜像

919 阅读3分钟

web项目生成docker镜像

1.利用maven插件

1.1.关闭防火墙

#查看linux版本
cat /etc/redhat-release
#查看状态
systemctl status firewalld
#关闭
systemctl stop firewalld

1.2修改docker配置,使其能够被远程访问

1.修改配置

vi /lib/systemd/system/docker.service
# 在ExecStart=后添加配置 
‐H tcp://0.0.0.0:2375 ‐H unix:///var/run/docker.sock

image-20220216162204378

unix://var/run/docker.sock:unix socket,本地客户端将通过这个来连接 Docker Daemon
tcp://0.0.0.0:2375:tcp socket,表示允许任何远程客户端通过 2375 端口连接 Docker Daemon

2.修改后重启docker

systemctl daemon-reload
systemctl restart docker

3.重启后,输入curl -X GET http://192.168.232.128:2375/info访问,看看是否能访问docker api了

image-20220216162520704

也可以在浏览器里输入看看是否能访问到信息,如图:

image-20220217115227877

1.3 检查是否有jdk8镜像

1.查看镜像docker images

image-20220216162819372

2.如上,没有jdk8,因为后续我们web项目是java项目,所以需要拉去jdk8镜像下来

docker pull kdvolder/jdk8

image-20220216165019822

1.4 pom增加maven插件

java代码:

package com.zy.control;

@RestController
@RequestMapping("/person")
@Slf4j
public class PersonController {

    @GetMapping("/{id}")
    public Person person(@PathVariable Integer id) {
        return Person.builder().pid(id).pName("测试").build();
    }

}

application.properties:

server.port=9999

pom如下:

    <build>
        <plugins>

            <!--防止打包后文件依赖文件没有一起打包,然后镜像内没有可以运行的程序文件-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                        <!--绑定package生命阶段-->
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <!--在原始Maven打包形成的jar包基础上,进行重新打包,新形成的jar包不但包含应用类文件和配置文件,-->
                    <!--而且还会包含应用所依赖的jar包以及Springboot启动相关类(loader等)-->
                    <includeSystemScope>true</includeSystemScope>
                </configuration>
            </plugin>

            <!--docker插件打包-->
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.1.0</version>
                <configuration>
                    <!--不能存在大小写名字,一律只能小写,否则打包不通过-->
                    <imageName>${project.artifactId}:${project.version}</imageName>
                    <!-- 基础镜像 相当于Dockerfile里的from  使用了jdk8,那么docker里必须要有镜像jdk8,下面这个是网上下载的 -->
                    <baseImage>kdvolder/jdk8</baseImage>
                    <!--相当于启动容器后,会自动执行java -jar webapi.jar-->
                    <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
                    <!--是否推送到docker私有仓库-->
<!--                    <pushImage>true</pushImage>-->
<!--                    <registryUrl>192.168.232.128:5000</registryUrl>-->
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <!--当前项目编译生成目录,比如target目录-->
                            <directory>${project.build.directory}</directory>
                            <!--需要上传的jar名称-->
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                    <dockerHost>http://192.168.232.128:2375</dockerHost>
                    <imageTags>
                        <imageTag>1.0.5</imageTag>
                    </imageTags>
                </configuration>
            </plugin>
        </plugins>
    </build>


设置环境变量,插件执行的时候,会去访问DOCKER_HOST,不添加的话,就默认localhost去了

DOCKER_HOST = tcp://192.168.232.128:2375

image-20220216170558512

1.5 执行插件

mvn clean package docker:build

clean:清空之前的打包
package:打包程序
docker:build:调用maven docker插件

image-20220217115003362

或者通过IDEA启动

image-20220217172132636

image-20220217171745781

1.6 查看镜像

image-20220217115039046

1.7 启动镜像应用

1.启动

[root@localhost docker]# docker run -d -p 8085:9999 webapi:1.0-SNAPSHOT
-d参数是让容器后台运行 
-p 是做端口映射,此时将服务器中的8085端口映射到容器中的9999(项目中端口配置的是8085)端口

2.可以输入docker run -it webapi:1.0-SNAPSHOT /bin/bash,查看日志

image-20220217162326406

或者输入docker logs --tail="10" webapi:1.0-SNAPSHOT

image-20220217162515405

3.访问指定端口,查看应用是否正常

image-20220217162553070

2.IDEA 连接docker

1.在设置里,添加远程IP和端口即可(前提:docker开启远程访问)

image-20220217164955527

2.连接

image-20220217165113271

3.dockerfile插件

后续再更...

问题解决

1.IDEA里 mvn不是内部命令


1.系统环境里添加maven环境变量:
变量名:MAVEN_HOME
变量值:E:\apache-maven-3.2.3
变量名:Path
变量值:;%MAVEN_HOME%\bin

2.重启IDEA,执行mvn -version 查看

注意:若还提示不存在内部命令,那么用管理员重启再试试,若还是不行,就需要再重启电脑试试看


2.MVN执行报错

No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?

这是因为本机没有配置jdk8,而maven执行需要jdk,配置jdk8即可。参考

新建系统变量,变量名:JAVA_HOME,变量值:C:\Program Files\Java\jdk1.8.0_202(jdk 安装位置)
双击原本有的系统变量 Path,在里面添加 %JAVA_HOME%\bin,以及 %JAVA_HOME%\jre\bin,然后确定即可
新建系统变量,变量名:CLASSPATH,变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar

3.docker插件执行报Could not acquire image ID or digest following build

之前用最新版插件1.2.2这个,会报这个错,后面降低版本用1.1.0就不会了

4.no main manifest attribute问题

参考

spring-boot-maven插件repackage(goal)的那些事

参考

1.docker-maven-plugin详细使用方法

2.docker-maven-plugin官网

3.Maven插件之spotify的docker-maven-plugin和dockerfile-maven-plugin,docker部署

4.Maven一键部署Springboot到Docker仓库,为自动化做准备

5.docker-maven-plugin打包docker镜像