短线骑牛 發表於 2018-3-19 08:56:00

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">&lt;parent&gt;
        &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
        &lt;artifactId&gt;spring-boot-starter-parent&lt;/artifactId&gt;
        &lt;version&gt;2.0.0.RELEASE&lt;/version&gt;
&lt;/parent&gt;
</code></pre>
<p>添加 web 和测试依赖</p>
<pre><code class="language-xml">&lt;dependencies&gt;
   &lt;dependency&gt;
        &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
        &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt;
    &lt;/dependency&gt;
        &lt;dependency&gt;
                &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
                &lt;artifactId&gt;spring-boot-starter-test&lt;/artifactId&gt;
                &lt;scope&gt;test&lt;/scope&gt;
        &lt;/dependency&gt;
&lt;/dependencies&gt;
</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">&lt;properties&gt;
        &lt;docker.image.prefix&gt;springboot&lt;/docker.image.prefix&gt;
&lt;/properties&gt;
</code></pre>
<p>plugins 中添加 Docker 构建插件:</p>
<pre><code class="language-xml">&lt;build&gt;
        &lt;plugins&gt;
                &lt;plugin&gt;
                        &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
                        &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;
                &lt;/plugin&gt;
                &lt;!-- Docker maven plugin --&gt;
                &lt;plugin&gt;
                        &lt;groupId&gt;com.spotify&lt;/groupId&gt;
                        &lt;artifactId&gt;docker-maven-plugin&lt;/artifactId&gt;
                        &lt;version&gt;1.0.0&lt;/version&gt;
                        &lt;configuration&gt;
                                &lt;imageName&gt;${docker.image.prefix}/${project.artifactId}&lt;/imageName&gt;
                                &lt;dockerDirectory&gt;src/main/docker&lt;/dockerDirectory&gt;
                                &lt;resources&gt;
                                        &lt;resource&gt;
                                                &lt;targetPath&gt;/&lt;/targetPath&gt;
                                                &lt;directory&gt;${project.build.directory}&lt;/directory&gt;
                                                &lt;include&gt;${project.build.finalName}.jar&lt;/include&gt;
                                        &lt;/resource&gt;
                                &lt;/resources&gt;
                        &lt;/configuration&gt;
                &lt;/plugin&gt;
                &lt;!-- Docker maven plugin --&gt;
        &lt;/plugins&gt;
&lt;/build&gt;
</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
---&gt; 224765a6bdbe
Step 2 : VOLUME /tmp
---&gt; Using cache
---&gt; b4e86cc8654e
Step 3 : ADD spring-boot-docker-1.0.jar app.jar
---&gt; a20fe75963ab
Removing intermediate container 593ee5e1ea51
Step 4 : ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -jar /app.jar
---&gt; Running in 85d558a10cd4
---&gt; 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-&gt;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(&quot;https://images.cnblogs.com/cnblogs_com/ityouknow/914073/o_keep.jpg&quot;) #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]
查看完整版本: Spring Boot 2.0(四):使用 Docker 部署 Spring Boot