Springboot 使用 Maven 打包 Docker

Springboot 使用 Maven 打包 Docker

本文主要是参考 Spring Boot 2 (四):使用 Docker 部署 Spring Boot–纯洁的微笑 动手进行测试的一个过程。

版本开发环境系统docker 环境系统开发环境 与 docker 是否在同一机器上说明
纯洁的微笑centos7centos7
v1.0win10win10
v1.1win10centos7否(centos7是在win下的虚拟机上)
v1.2win10centos7否(centos7是在win下的虚拟机上)在V1.1上增加了数据库连接配置

docker 版本为1.13.1

V1.0

按照 「纯洁的微笑」 版本进行,只不过我的项目名称是 test-docker

过程中出了一点问题:参考 错误集锦 第一个

V1.1

小插曲:在把 win10 下的 docker 环境变成虚拟机中的环境时,win10 下需要把 Hype-v 功能关掉,才可以安装VMware 或者 VBox 等虚拟机软件,因此我在关掉 Hype-v 后直接把 win10 下的 docker 卸载了(win10下的docker 依赖 Hype-v 的启动)

win10 地址是 192.168.56.1, centos7 的地址是 192.168.56.100

由于 docker 所在的 ip 变更,maven 打包 docker 时是默认使用的是 localhost:2375 端口。 此时打包会出现如下错误:

Caused by: org.apache.http.conn.HttpHostConnectException: Connect to localhost:2375 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect
at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:151)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:353)
at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:380)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:71)
at org.glassfish.jersey.apache.connector.ApacheConnector.apply(ApacheConnector.java:435)
… 21 more

这个时候就要在 maven 插件里面配置好 docker-Host

           <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.4.11</version>
                <configuration>
                    <imageName>${project.artifactId}</imageName>
                    <dockerDirectory>src/main/docker</dockerDirectory>
                    <!-- 添加远程docker主机,该主机必须开启了远程API,监听2375端口有两种方式添加docker主机 -->
                    <!-- 在系统环境变量中添加DOCKER_HOST系统变量,值为tcp://docker-host-ip:2375 -->
                    <dockerHost>http://192.168.56.100:2375</dockerHost>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>

此时 centos7 的 docker 已经运行,不过打包编译后却发现报了这个错

Caused by: org.apache.http.conn.HttpHostConnectException: Connect to 192.168.56.100:2375 [/192.168.56.100] failed: Connection refused: connect

这个是远端 docker 的2375端口没有开放。

开放远程 docker 的端口

参考Docker学习笔记 — 开启Docker远程访问

修改配置文件

修改/etc/sysconfig/docker文件,在最后增加一行DOCKER_OPTS

DOCKER_OPTS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"

改完如下

# To use docker-latest client, uncomment below lines
#DOCKERBINARY=/usr/bin/docker-latest
#DOCKERDBINARY=/usr/bin/dockerd-latest
#DOCKER_CONTAINERD_BINARY=/usr/bin/docker-containerd-latest
#DOCKER_CONTAINERD_SHIM_BINARY=/usr/bin/docker-containerd-shim-latest
DOCKER_OPTS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"

修改/usr/lib/systemd/system/docker.service,在[Service]的ExexStart=下面增加一行$DOCKER_OPTS

[Service]
Type=notify
NotifyAccess=main
EnvironmentFile=-/run/containers/registries.conf
EnvironmentFile=-/etc/sysconfig/docker
EnvironmentFile=-/etc/sysconfig/docker-storage
EnvironmentFile=-/etc/sysconfig/docker-network
Environment=GOTRACEBACK=crash
Environment=DOCKER_HTTP_HOST_COMPAT=1
Environment=PATH=/usr/libexec/docker:/usr/bin:/usr/sbin
ExecStart=/usr/bin/dockerd-current \
          --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current \
          --default-runtime=docker-runc \
          --exec-opt native.cgroupdriver=systemd \
          --userland-proxy-path=/usr/libexec/docker/docker-proxy-current \
          --init-path=/usr/libexec/docker/docker-init-current \
          --seccomp-profile=/etc/docker/seccomp.json \
          $DOCKER_OPTS \
          $OPTIONS \
          $DOCKER_STORAGE_OPTIONS \
          $DOCKER_NETWORK_OPTIONS \
          $ADD_REGISTRY \
          $BLOCK_REGISTRY \
          $INSECURE_REGISTRY \
          $REGISTRIES
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
TimeoutStartSec=0
Restart=on-abnormal
KillMode=process
[Install]
WantedBy=multi-user.target

docker重新读取配置文件,重新启动docker服务

 systemctl daemon-reload
 systemctl restart docker

查看端口

  ps -ef|grep docker

出现如下内容表示端口开放成功

root 928 1 0 09:34 ? 00:00:00 /usr/bin/dockerd-current -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock

打包

这时候回到 win10 下再次打包我们的 Springboot程序到 docker ,发现能够成功。
到 centos7 上运行 docker images 命令,看到镜像已经打包成功了

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test-docker         latest              332af44686d2        41 seconds ago      121 MB

运行镜像

docker run -p 8080:8080 -t test-docker

成功,访问 http://192.168.56.100:8080/

v1.2 springboot 连接数据库

在原来的项目上添加上下面的application.properties文件

spring.datasource.url=jdbc:mysql://192.168.56.1:3306/test
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.max-idle=10
spring.datasource.max-wait=1000
spring.datasource.min-idle=5
spring.datasource.initial-size=5
server.tomcat.uri-encoding=UTF-8
修改pom,修改Controller

pom添加依赖

        <!-- MYSQL -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!-- Spring Boot JDBC -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

Controller 修改

@RestController
public class DockerController {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @RequestMapping("/")
    public String index() {

        String sql = "select count(*) from test";
        int count = jdbcTemplate.queryForObject(sql, Integer.class);
        return String.valueOf(count);
    }
}

重新打包到 docker 中就好了, 再开启运行下就好了

错误集锦

Exception caught: lstat test-docker-1.0.jar: no such file or directory

  • 报错
    在编译的时报了下面的错误:

Exception caught: lstat test-docker-1.0.jar: no such file or directory

  • 原因:
    我在 pom.xml 文件中加入了项目的版本号 1.0-SNAPSHOT , 编译成的 jar 包文件名为test-docker-1.0-SNAPSHOT.jar ,与 Dockerfile 里面的指定的 jar 包名称不同,所以报了上面错误
  • 解决方案(二选一)
    1、去掉 pom.xml 中的 1.0-SNAPSHOT
    2、修改 Dockerfile 的 ADD 语句为 ADD test-docker-1.0.jar app.jar

Caused by: org.apache.http.conn.HttpHostConnectException: Connect to localhost:2375 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect

Caused by: java.util.concurrent.ExecutionException: com.spotify.docker.client.shaded.javax.ws.rs.ProcessingException: org.apache.http.conn.UnsupportedSchemeException: tcp protocol is not supported

解决方案:

  • dockerHost 的地址由 tcp 改成 http 协议

Caused by: org.apache.http.conn.HttpHostConnectException: Connect to 192.168.56.100:2375 [/192.168.56.100] failed: Connection refused: connect

解决方案:

  • docker 开放端口2375端口
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值