Springboot(四)Docket部署(本地/远程)

Springboot(四)Docket部署(本地/远程)

五月 23, 2019

Docker简介

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

Docker的优点

更快速的交付和部署

对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。

更高效的虚拟化

  Docker 容器的运行不需要额外的 hypervisor(虚拟化管理程序)支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。

更轻松的迁移和扩展

  Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。

特性 容器(Docker) 虚拟机(VM)
启动 秒级 分钟级
硬盘使用 MB级 GB级
性能 接近原生 弱于原生
系统支持量 单机支持上千容器 单机支持十几个

Docker的局限

  1. Docker是基于Linux 64bit的,无法在windows/unix或32bit的linux环境下使用
  2. LXC是基于linux kernel的,因此container的guest系统只能是linux base的
  3. 隔离性比KVM虚拟化方案还是有些欠缺,所有container公用一部分的运行库
  4. 网络管理相对简单,主要是基于namespace隔离
  5. cgroup的cpu功能相比KVM的等虚拟化方案相比难以度量
  6. docker对disk的管理比较有限
  7. container随着用户进程的停止而销毁,container中的log等用户数据不便收集
    1-2 有windows base应用的是不能使用Docker的
    3-5 用户的需求,到底是需要一个container还是一个VM,同时也决定docker作为IaaS不太可行
    6-7 虽然是docker本身不支持的功能,但是可以通过其他手段解决(disk quota, mount –bind)。总之,选用container还是vm, 就是在隔离性和资源复用性上做权衡

Springboot集成Docker

先准备一个Spirngboot项目
在项目根目录的pom.xml文件下添加一条properties

1
<docker.image.prefix>springboot</docker.image.prefix>

plugins 中添加 Docker 构建插件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<build>
<plugins>
<!-- Docker maven plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.0.1-SNAPSHOT</version>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
<!-- Docker maven plugin -->
</plugins>
</build>

在目录src/main/docker下创建 Dockerfile 文件,Dockerfile 文件用来说明如何来构建镜像。

1
2
3
4
5
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD cxy-mybatis.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

这个 Dockerfile 文件很简单,构建 Jdk 基础环境,添加 Spring Boot Jar 到镜像中,简单解释一下:

  • FROM ,表示使用 Jdk8 环境 为基础镜像,如果镜像不是本地的会从 DockerHub 进行下载
  • VOLUME ,VOLUME 指向了一个/tmp的目录,由于 Spring Boot 使用内置的Tomcat容器,Tomcat 默认使用/tmp作为工作目录。这个命令的效果是:在宿主机的/var/lib/docker目录下创建一个临时文件并把它链接到容器中的/tmp目录
  • ADD ,拷贝文件并且重命名
  • ENTRYPOINT ,为了缩短 Tomcat 的启动时间,添加java.security.egd的系统属性指向/dev/urandom作为 ENTRYPOINT

这样 Spring Boot 项目添加 Docker 依赖就完成了。

安装 Docker 环境

1
yum install docker

安装完成后,使用下面的命令来启动 docker 服务,并将其设置为开机启动:

1
2
3
4
5
service docker start
chkconfig docker on
#LCTT 译注:此处采用了旧式的 sysv 语法,如采用CentOS 7中支持的新式 systemd 语法,如下:
systemctl start docker.service
systemctl enable docker.service

如果启动出现问题

参考
Centos7上安装docker

使用Docker 中国加速器

1
2
3
4
5
6
vi  /etc/docker/daemon.json
#添加后:
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"live-restore": true
}

重新启动docker

1
systemctl restart docker

输入docker version 返回版本信息则安装正常。

安装JDK

1
yum -y install java-1.8.0-openjdk*

配置环境变量
打开 vim /etc/profile
添加一下内容

1
2
export JAVA_HOME=/usr/lib/jvm/java-1.8.0 
export PATH=$PATH:${JAVA_HOME}/bin

修改完成之后,使其生效

1
source /etc/profile

输入java -version 返回版本信息则安装正常。

参考文献
CentOS7下安装JDK详细过程

安装MAVEN

下载:http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz

1
2
3
4
## 解压
tar zxvf apache-maven-3.3.9-bin.tar.gz
## 移动
mv apache-maven-3.3.9 /usr/local/maven3

修改环境变量
打开 vim /etc/profile

1
2
3
export JAVA_HOME=/usr/lib/jvm/java-1.8.0
export MAVEN_HOME=/usr/local/maven3
export PATH=$PATH:${JAVA_HOME}/bin:${MAVEN_HOME}/bin

修改完成之后,使其生效

1
source /etc/profile

输入mvn -version 返回版本信息则安装正常。
这样整个构建环境就配置完成了。
参考文献
CentOS安装Maven

使用Docker部署Springboot项目

将项目 cxy-mybatis 拷贝服务器中,进入项目路径下进行打包测试。

1
2
3
4
#打包
mvn package
#启动
java -jar springboot-mybatis-0.0.1-SNAPSHOT.jar

看到 Spring Boot 的启动日志后表明环境配置没有问题,接下来我们使用 DockerFile 构建镜像。

方法一

在我们之前配置docker的机器上 创建一个文件夹docker,放置上面的Dockerfile和springboot打包的项目

在改目录下执行指令

1
docker build -t docker .

docker就会根据Dockerfile里你定义好的命令进行构建新的镜像。
-t代表要构建的镜像的tag .代表当前目录,也就是Dockerfile所在的目录。

在该docker文件下使用 指令:

1
docker run -d -p 8080:8080 docker

运行该springBoot项目,可以看到构建完毕的景象docker了
最后访问浏览器,成功

关闭运行中的容器

远程windows打包

开启Docker远程API

修改docker配置文件
vi /usr/lib/systemd/system/docker.service

保存后退出,重载

1
2
systemctl daemon-reload 
systemctl restart docker.service

执行

1
netstat -anp|grep 2375


如果设置防火墙,或者限制ip的还需要放行2375端口

1
iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 2375 -j ACCEPT

本地windows打包

在项目pom.xml下添加远程地址dockHost和修改dockerDirectory

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!-- Docker maven plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<dockerHost> http://192.168.1.69:2375</dockerHost>
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
<!-- Docker maven plugin -->

远程服务器上查看

搞定,启动服务

1
docker run -d -p 8080:8080 springboot/springboot-mybatis

打包Error参考

Maven 不识别 docker:build

1
[ERROR] No plugin found for prefix 'docker' in the current project and in the plugin groups...

解决办法是修改maven的配置文件,settings.xml。(pluginGroups在settings.xml中的位置很靠上)

1
2
3
<pluginGroups>
<pluginGroup>com.spotify</pluginGroup>
</pluginGroups>

docker Error
docker指令
示例代码-github