文章目录
- Springboot 使用 Maven 打包 Docker
- V1.0
- V1.1
- v1.2 springboot 连接数据库
- 错误集锦
- Exception caught: lstat test-docker-1.0.jar: no such file or directory
- 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
- Caused by: org.apache.http.conn.HttpHostConnectException: Connect to 192.168.56.100:2375 [/192.168.56.100] failed: Connection refused: connect
Springboot 使用 Maven 打包 Docker
本文主要是参考 Spring Boot 2 (四):使用 Docker 部署 Spring Boot–纯洁的微笑 动手进行测试的一个过程。
版本 | 开发环境系统 | docker 环境系统 | 开发环境 与 docker 是否在同一机器上 | 说明 |
---|---|---|---|---|
纯洁的微笑 | centos7 | centos7 | 是 | |
v1.0 | win10 | win10 | 是 | |
v1.1 | win10 | centos7 | 否(centos7是在win下的虚拟机上) | |
v1.2 | win10 | centos7 | 否(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 的端口
修改配置文件
修改/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端口