Spring Boot 2.0(四):使用 Docker 部署 Spring Boot
<p>Docker 技术发展为微服务落地提供了更加便利的环境,使用 Docker 部署 Spring Boot 其实非常简单,这篇文章我们就来简单学习下。</p><p>首先构建一个简单的 Spring Boot 项目,然后给项目添加 Docker 支持,最后对项目进行部署。</p>
<h2 id="一个简单-spring-boot-项目">一个简单 Spring Boot 项目</h2>
<p>在 <code>pom.xml</code> 中 ,使用 Spring Boot 2.0 相关依赖</p>
<pre><code class="language-xml"><parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
</code></pre>
<p>添加 web 和测试依赖</p>
<pre><code class="language-xml"><dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</code></pre>
<p>创建一个 DockerController,在其中有一个<code>index()</code>方法,访问时返回:<code>Hello Docker!</code></p>
<pre><code class="language-java">@RestController
public class DockerController {
@RequestMapping("/")
public String index() {
return "Hello Docker!";
}
}
</code></pre>
<p>启动类</p>
<pre><code class="language-java">@SpringBootApplication
public class DockerApplication {
public static void main(String[] args) {
SpringApplication.run(DockerApplication.class, args);
}
}
</code></pre>
<p>添加完毕后启动项目,启动成功后浏览器放问:<code>http://localhost:8080/</code>,页面返回:<code>Hello Docker!</code>,说明 Spring Boot 项目配置正常。</p>
<h2 id="spring-boot-项目添加-docker-支持">Spring Boot 项目添加 Docker 支持</h2>
<p>在 <code>pom.xml-properties </code>中添加 Docker 镜像名称</p>
<pre><code class="language-xml"><properties>
<docker.image.prefix>springboot</docker.image.prefix>
</properties>
</code></pre>
<p>plugins 中添加 Docker 构建插件:</p>
<pre><code class="language-xml"><build>
<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.0.0</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>
</code></pre>
<p>在目录<code>src/main/docker</code>下创建 Dockerfile 文件,Dockerfile 文件用来说明如何来构建镜像。</p>
<pre><code class="language-text">FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD spring-boot-docker-1.0.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
</code></pre>
<p>这个 Dockerfile 文件很简单,构建 Jdk 基础环境,添加 Spring Boot Jar 到镜像中,简单解释一下:</p>
<ul>
<li>FROM ,表示使用 Jdk8 环境 为基础镜像,如果镜像不是本地的会从 DockerHub 进行下载</li>
<li>VOLUME ,VOLUME 指向了一个<code>/tmp</code>的目录,由于 Spring Boot 使用内置的Tomcat容器,Tomcat 默认使用<code>/tmp</code>作为工作目录。这个命令的效果是:在宿主机的<code>/var/lib/docker</code>目录下创建一个临时文件并把它链接到容器中的<code>/tmp</code>目录</li>
<li>ADD ,拷贝文件并且重命名</li>
<li>ENTRYPOINT ,为了缩短 Tomcat 的启动时间,添加<code>java.security.egd</code>的系统属性指向<code>/dev/urandom</code>作为 ENTRYPOINT</li>
</ul>
<blockquote>
<p>这样 Spring Boot 项目添加 Docker 依赖就完成了。</p>
</blockquote>
<h2 id="构建打包环境">构建打包环境</h2>
<p>我们需要有一个 Docker 环境来打包 Spring Boot 项目,在 Windows 搭建 Docker 环境很麻烦,因此我这里以 Centos 7 为例。</p>
<h3 id="安装-docker-环境">安装 Docker 环境</h3>
<p>安装</p>
<pre><code class="language-sh">yum install docker
</code></pre>
<p>安装完成后,使用下面的命令来启动 docker 服务,并将其设置为开机启动:</p>
<pre><code class="language-sh">ervice docker start
chkconfig docker on
#LCTT 译注:此处采用了旧式的 sysv 语法,如采用CentOS 7中支持的新式 systemd 语法,如下:
systemctlstart docker.service
systemctlenable docker.service
</code></pre>
<p>使用Docker 中国加速器</p>
<pre><code class="language-sh">vi/etc/docker/daemon.json
#添加后:
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"live-restore": true
}
</code></pre>
<p>重新启动docker</p>
<pre><code class="language-sh">systemctl restart docker
</code></pre>
<p>输入<code>docker version</code> 返回版本信息则安装正常。</p>
<h3 id="安装jdk">安装JDK</h3>
<pre><code class="language-sh">yum -y install java-1.8.0-openjdk*
</code></pre>
<p>配置环境变量<br>
打开 <code>vim /etc/profile</code><br>
添加一下内容</p>
<pre><code class="language-sh">export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64
export PATH=$PATH:$JAVA_HOME/bin
</code></pre>
<p>修改完成之后,使其生效</p>
<pre><code class="language-sh">source /etc/profile
</code></pre>
<p>输入<code>java -version</code> 返回版本信息则安装正常。</p>
<h3 id="安装maven">安装MAVEN</h3>
<p>下载:<code>http://mirrors.shu.edu.cn/apache/maven/maven-3/3.5.2/binaries/apache-maven-3.5.2-bin.tar.gz</code></p>
<pre><code class="language-sh">## 解压
tar vxf apache-maven-3.5.2-bin.tar.gz
## 移动
mv apache-maven-3.5.2 /usr/local/maven3
</code></pre>
<p>修改环境变量, 在<code>/etc/profile</code>中添加以下几行</p>
<pre><code class="language-sh">MAVEN_HOME=/usr/local/maven3
export MAVEN_HOME
export PATH=${PATH}:${MAVEN_HOME}/bin
</code></pre>
<p>记得执行<code>source /etc/profile</code>使环境变量生效。</p>
<p>输入<code>mvn -version</code> 返回版本信息则安装正常。</p>
<blockquote>
<p>这样整个构建环境就配置完成了。</p>
</blockquote>
<h2 id="使用-docker-部署-spring-boot-项目">使用 Docker 部署 Spring Boot 项目</h2>
<p>将项目 <code>spring-boot-docker</code> 拷贝服务器中,进入项目路径下进行打包测试。</p>
<pre><code class="language-sh">#打包
mvn package
#启动
java -jar target/spring-boot-docker-1.0.jar
</code></pre>
<p>看到 Spring Boot 的启动日志后表明环境配置没有问题,接下来我们使用 DockerFile 构建镜像。</p>
<pre><code class="language-sh">mvn package docker:build
</code></pre>
<p>第一次构建可能有点慢,当看到以下内容的时候表明构建成功:</p>
<pre><code class="language-sh">...
Step 1 : FROM openjdk:8-jdk-alpine
---> 224765a6bdbe
Step 2 : VOLUME /tmp
---> Using cache
---> b4e86cc8654e
Step 3 : ADD spring-boot-docker-1.0.jar app.jar
---> a20fe75963ab
Removing intermediate container 593ee5e1ea51
Step 4 : ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -jar /app.jar
---> Running in 85d558a10cd4
---> 7102f08b5e95
Removing intermediate container 85d558a10cd4
Successfully built 7102f08b5e95
Built springboot/spring-boot-docker
------------------------------------------------------------------------
BUILD SUCCESS
------------------------------------------------------------------------
Total time: 54.346 s
Finished at: 2018-03-13T16:20:15+08:00
Final Memory: 42M/182M
------------------------------------------------------------------------
</code></pre>
<p>使用<code>docker images</code>命令查看构建好的镜像:</p>
<pre><code class="language-sh">docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
springboot/spring-boot-docker latest 99ce9468da74 6 seconds ago 117.5 MB
</code></pre>
<p><code>springboot/spring-boot-docker</code> 就是我们构建好的镜像,下一步就是运行该镜像</p>
<pre><code class="language-sh">docker run -p 8080:8080 -t springboot/spring-boot-docker
</code></pre>
<p>启动完成之后我们使用<code>docker ps</code>查看正在运行的镜像:</p>
<pre><code class="language-sh">docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
049570da86a9 springboot/spring-boot-docker "java -Djava.security" 30 seconds ago Up 27 seconds 0.0.0.0:8080->8080/tcp determined_mahavira
</code></pre>
<p>可以看到我们构建的容器正在在运行,访问浏览器:<code>http://192.168.0.x:8080/</code>,返回</p>
<pre><code class="language-sh">Hello Docker!
</code></pre>
<p>说明使用 Docker 部署 Spring Boot 项目成功!</p>
<p><strong>示例代码-github</strong></p>
<p><strong>示例代码-码云</strong></p>
<h2 id="参考">参考</h2>
<p>Spring Boot with Docker<br>
Docker:Spring Boot 应用发布到 Docker</p>
</div>
<div id="MySignature" role="contentinfo">
<div>
<p style="border-top: #e0e0e0 1px dashed; border-right: #e0e0e0 1px dashed; border-bottom: #e0e0e0 1px dashed; border-left: #e0e0e0 1px dashed; padding-top: 5px; padding-right: 10px; padding-bottom: 10px; padding-left: 150px; background: url("https://images.cnblogs.com/cnblogs_com/ityouknow/914073/o_keep.jpg") #e5f1f4 no-repeat 1% 50%; font-family: 微软雅黑; font-size: 11px" id="PSignature">
<br>
作者:<span style="font-weight: bold; font-size: large">纯洁的微笑</span>
<br>
出处:www.ityouknow.com
<br>
资源:微信搜<strong>【纯洁的微笑】</strong>关注我,回复 <strong>【程序员】【面试】【架构师】</strong>有我准备的一线程序必备计算机书籍、大厂面试资料和免费电子书。 <strong>一共1024G的资料,希望可以帮助大家提升技术和能力。</strong>
<br>
<br>
<span style="font-size: large; color: #F00; display: none">
本文如对您有帮助,还请多帮 【推荐】 下此文。
</span><br>
<span style="font-size: large; color: #F00">点我了解:Cxy521-程序员一站式导航网站
</span>
<br>
</p>
</div><br><br>
来源:https://www.cnblogs.com/ityouknow/p/8599093.html
頁:
[1]