将自己的SpringBoot应用打包发布到Linux下Docker中
1. 环境介绍
- Java开发环境:Windows10 64位
maven3.6
jdk1.8
IDEA2018.3
- 服务器:Linux Centos7 64位
- Docker版本:Docker version 1.13.1, build b2f74b2/1.13.1
2. 开始前的准备
2.1 开启docker远程连接
-
搞定防火墙先
这里是将centos的防火墙关闭了,只是为了方便演示,如果要保障安全,可以在部署完后打开防火墙,并开启特定端口:
以80端口为例
添加
firewall-cmd --zone=public --add-port=80/tcp --permanent (--permanent永久生效,没有此参数重启后失效)
重新载入
firewall-cmd --reload
查看
firewall-cmd --zone= public --query-port=80/tcp
删除
firewall-cmd --zone= public --remove-port=80/tcp --permanent关闭防火墙
systemctl stop firewalld
开机禁用防火墙
systemctl disable firewalld -
开放docker远程访问
我在树莓派上这样配置并不行,暂时没找到解决方案
vi命令编辑docker启动:
vi /usr/lib/systemd/system/docker.service
修改ExecStart处的参数
-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock \
有些朋友可能需要追加这个参数(将上面那句话改成下面这句话):
/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock \
我的配置修改后是这样子的:
> <font color="red">注意这只是我截取的一小块,并不是全部,更不要把我的文件复制过去</font>
~~~bash
[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.com
After=network.target
Wants=docker-storage-setup.service
Requires=docker-cleanup.timer
[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 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock \
--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 \
~~~
3. 重启docker服务
```bash
systemctl daemon-reload
systemctl restart docker
-
验证是否可以访问
如果返回一个json字符串表示可以正常访问,不成功会报错
[root@bogon ~]# curl http://localhost:2375/info
{"ID":"SXMD:MGRC:RVMF:ZTRM:2QBG:RUG6:RG7Y:YARM:TL5I:GM.................... -
也可以在windows下通过浏览器访问IP+端口号
如果curl可以访问但是windows无法访问,检查一下防火墙关了没有
2.2 新建SpringBoot项目
- 如图所示
-
这里只用了一个web插件
-
项目路径为E:\IdeaProjects\Tea\docker-abc
-
新建kim.nzxy.dockerabc.controller.DemoController
package kim.nzxy.dockerabc.controller; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; /**
* @Author: Xiaoyan
* @Date: 2019/3/29 16:08
*/
@RestController
public class DemoController {
@RequestMapping("/")
public String abc() {
return "abc";
}
} -
SpringBoot运行结果如下:
3. 开始构建我们的Springboot应用
3.1 在pom.xml中添加Maven插件
第一个是用来创建docker容器用的
第二个如果不加上的话无法运行jar包
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- 添加docker-maven-plugin插件 -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.0</version>
<configuration>
<!-- 配置docker server 位置,否则默认127.0.0.1 -->
<dockerHost>http://192.168.0.169:2375</dockerHost>
<!-- imageName冒号前面为容器名,后面是容器版本号 -->
<imageName>${project.artifactId}:${project.version}</imageName>
<!-- Dockerfile 文件位置 -->
<dockerDirectory>${project.basedir}</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
3.2 新建Dockerfile文件
位置:
内容:(这里与图不符,图中少了个‘’-‘’)
FROM openjdk:8
VOLUME /tmp
# docker-abc-0.0.1-SNAPSHOT.jar为maven项目project.artifactId-project.version
ADD docker-abc-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 8761
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
如果新建的没错的话,IDEA是可以识别的
3.3 配置运行方式
4. 构建-运行
4.1 构建
这里就不文字解释了,点击运行等它完成就行了
4.2 运行我们的项目
以上如果报错了请检查步骤是否正确,或者Maven配置是否有问题
现在转移阵地到Centos上:
-
查看是否生成成功
呐,我们构建的就是那个叫docker-abc的东西啦
如果成功这里将会生成一个
[root@bogon ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker-abc 0.0.1-SNAPSHOT 44eb924f47a2 7 minutes ago 659 MB
docker.io/openjdk 8 b8d3f94869bb 33 hours ago 625 MB -
启动自己的项目
运行成功
[root@bogon ~]# docker run -d -p 8080:8080 44eb924f47a2
30317d2daaf2a76e9fc4cb9bf08a102ecd84db34f790f73d8e8cebb0c4bcfd0c -
测试成果: