阳光玫瑰 發表於 2019-3-13 09:48:00

Docker最全教程之使用Docker搭建Java开发环境(十七)

<blockquote>
<h1><strong>前言</strong></h1>
<p>&nbsp;</p>
<p>Java是一门面向对象的优秀编程语言,市场占有率极高,但是在容器化实践过程中,发现官方支持并不友好,同时与其他编程语言的基础镜像相比(具体见各语言镜像比较),确实是非常臃肿。</p>
<p>&nbsp;</p>
<p>本篇仅作探索,希望对大家有所帮助。</p>
<p>&nbsp;</p>
</blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h1>目录</h1>
<p>&nbsp;</p>
<ul class="list-paddingleft-2">
<li>
<p>Java</p>
</li>
<li>
<p>官方镜像</p>
</li>
<li>
<p>各语言镜像比较</p>
</li>
<li>
<p>使用Docker搭建Java开发环境</p>
</li>
<li>
<p>编写Hello&nbsp;world!</p>
</li>
<li>
<p>编写Dockerfile</p>
</li>
<li>
<p>构建镜像并执行</p>
</li>
</ul>
<p>&nbsp;</p>
<h1>Java&nbsp;</h1>
<p>Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。</p>
<p>Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。</p>
<p>目前最新的版本为Java&nbsp;9,以下为官方文档地址:</p>
<p>https://docs.oracle.com/javase/9/</p>
<p><span style="color: rgba(51, 102, 255, 1)">注意:<em>值得注意的是,</em><em>Oracle (甲骨文)公司宣布,“2019年1月之后”,如果没有获得Oracel公司的商业许可证,Java SE 8</em><em>(注:</em><em>Java SE为Java平台</em><em>标准版</em><em>的</em><em>简称)</em><em>将不会再收到公开更新,也将无法用于“商业或生产用途”。</em><em>目前收费标准为,对于</em><em>&nbsp;PC,每用户每月是 2.5 美元,对于服务器/云部署,每个</em><em>处理器</em><em>每月是&nbsp;25 美元</em><em>。</em></span></p>
<p><span style="color: rgba(51, 102, 255, 1)">&nbsp;</span></p>
<h1>官方镜像</h1>
<p>Java官网镜像地址为:</p>
<p>https://hub.docker.com/_/java</p>
<p>官方介绍无。在Java社区,对Docker的拥抱粒度相对其他语言不是很大,不仅教程相对缺失,而且官方支持力度不大。这一点,大家可以通过搜索引擎进一步了解。不过,还是有许多Java开发者也在拥抱Docker。</p>
<p>&nbsp;</p>
<h1>各语言镜像比较</h1>
<p>写到这里,笔者突发奇想,相对主流的镜像做一个体积比较。</p>
<p>我们可以通过docker images命令来列出本地镜像,同时可以使用参数来进行筛选。</p>
<ul>
<li>Java</li>
</ul>
<p>我们可以使用以下命令来查看Java相关镜像的大小:</p>
<p><img class="img_loading" src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==" alt="" data-copyright="0" data-ratio="0.22783083219645292" data-s="300,640" data-src="https://mmbiz.qpic.cn/mmbiz_png/Mt5QjqkFG0rXBPHLej7ej6aEVXY3QOUgKRRv19ABcIY0A45dyulibCYpoWE4vgicgYLJv4SgUer2ChrmMvJkrCYw/640?wx_fmt=png" data-type="png" data-w="733"></p>
<p><img src="https://img2018.cnblogs.com/blog/70544/201903/70544-20190313094103003-717134067.png" alt="">&nbsp;</p>
<p>600M左右的体积,相对来说,还是臃肿。我们可以和其他镜像做一些对比:</p>
<ul>
<li>NET Core</li>
</ul>
<p>docker images microsoft/dotnet</p>
<p><img src="https://img2018.cnblogs.com/blog/70544/201903/70544-20190313094121495-378426506.png" alt=""><img class="img_loading" src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==" alt="" data-copyright="0" data-ratio="0.20045300113250283" data-s="300,640" data-src="https://mmbiz.qpic.cn/mmbiz_png/Mt5QjqkFG0rXBPHLej7ej6aEVXY3QOUgb38p0ZOqmobQTicViaLRS5Qc0JkvVAlOtLGphnvPhOwTcKqYJFv3XnUw/640?wx_fmt=png" data-type="png" data-w="883"></p>
<p>&nbsp;</p>
<p>运行时镜像200M左右,而且高版本镜像越来越轻量。</p>
<ul>
<li>Python</li>
</ul>
<p>docker images python</p>
<p><img src="https://img2018.cnblogs.com/blog/70544/201903/70544-20190313094139043-83096018.jpg" alt=""><img class="img_loading" src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==" alt="" data-copyright="0" data-ratio="0.15661103979460847" data-s="300,640" data-src="https://mmbiz.qpic.cn/mmbiz_png/Mt5QjqkFG0rXBPHLej7ej6aEVXY3QOUg6y6xvdlpeFeOk8YLljWg1yiaaic1QRVbu2fSiaJ2bm1tRvHTvH3qeibU1Q/640?wx_fmt=png" data-type="png" data-w="779"></p>
<p>&nbsp;</p>
<ul>
<li>Php</li>
</ul>
<p>docker images php&nbsp;</p>
<p><img src="https://img2018.cnblogs.com/blog/70544/201903/70544-20190313094158683-1916867605.png" alt=""><img class="img_loading" src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==" alt="" data-copyright="0" data-ratio="0.16046213093709885" data-s="300,640" data-src="https://mmbiz.qpic.cn/mmbiz_png/Mt5QjqkFG0rXBPHLej7ej6aEVXY3QOUgQsQ7aQbq4pOG5SfXEDwTuulsicU4vHzo857YtzPJzel8wBAQT6OlZKA/640?wx_fmt=png" data-type="png" data-w="779"></p>
<h4>&nbsp;</h4>
<h1>使用Docker搭建Java开发环境</h1>
<p>本篇仅做探索,主要解决以下问题:</p>
<ul>
<li>无需搭建Java开发环境</li>
<li>开发环境变化只需更新镜像即可(比如从Java8改为Java9)</li>
<li>无需安装IDE(比如eclipse)</li>
<li>提供一个极简Demo</li>
</ul>
<h5>&nbsp;&nbsp;</h5>
<h1>编写Hello&nbsp;world!</h1>
<p>按照码农协会行业定律,初学必写Hello&nbsp;World,以表达对编程世界的敬仰之情。如下面代码所示:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">引入命名空间</span>
<span style="color: rgba(0, 0, 0, 1)">
import java.util.</span>*<span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">类</span>

<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Hello{

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">程序入口</span>

    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> main(String[] args){

      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">打印字符串(控制台)</span>
<span style="color: rgba(0, 0, 0, 1)">
      System.</span><span style="color: rgba(0, 0, 255, 1)">out</span>.println(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Hello World!</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);

      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">打印当前时间</span>
<span style="color: rgba(0, 0, 0, 1)">
      System.</span><span style="color: rgba(0, 0, 255, 1)">out</span>.println(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Date());



    }

}</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>这里顺便说下,我们使用万能编辑器VisualStudio&nbsp;Code来编辑上述代码,支持代码高亮,同时还会自动推荐相关扩展,如下所示:</p>
<p>&nbsp;<img src="https://img2018.cnblogs.com/blog/70544/201903/70544-20190313094316099-730191896.png" alt=""></p>
<p>并且还提供完善的文档教程:</p>
<p>&nbsp;<img src="https://img2018.cnblogs.com/blog/70544/201903/70544-20190313094337408-396588552.jpg" alt=""></p>
<h1>&nbsp;</h1>
<h1>编写Dockerfile</h1>
<p>如下所示,示例Dockerfile文件如下:</p>
<div class="cnblogs_code">
<pre># 基于Java <span style="color: rgba(128, 0, 128, 1)">9</span><span style="color: rgba(0, 0, 0, 1)">

FROM java:</span><span style="color: rgba(128, 0, 128, 1)">9</span><span style="color: rgba(0, 0, 0, 1)">



# 设置工作目录

WORKDIR </span>/<span style="color: rgba(0, 0, 0, 1)">app



# 复制文件到工作目录

COPY . </span>/<span style="color: rgba(0, 0, 0, 1)">app



# 设置Java环境变量

ENV PATH</span>=$PATH:$JAVA_HOME/<span style="color: rgba(0, 0, 0, 1)">bin

ENV JRE_HOME</span>=${JAVA_HOME}/<span style="color: rgba(0, 0, 0, 1)">jre

ENV CLASSPATH</span>=.:${JAVA_HOME}/lib:${JRE_HOME}/<span style="color: rgba(0, 0, 0, 1)">lib



# 编译

RUN [</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/usr/lib/jvm/java-9-openjdk-amd64/bin/javac</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Hello.java</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">]



# 运行

ENTRYPOINT [</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/usr/lib/jvm/java-9-openjdk-amd64/bin/java</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Hello</span><span style="color: rgba(128, 0, 0, 1)">"</span>]</pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h1>构建镜像并执行</h1>
<p>接下来,我们可以执行以下命令以构建Docker镜像:</p>
<p>docker build --rm -f "Dockerfile" -t java-hello:latest .</p>
<p><img src="https://img2018.cnblogs.com/blog/70544/201903/70544-20190313094518540-374901610.jpg" alt="">&nbsp;</p>
<p><img class="img_loading" src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==" alt="" data-copyright="0" data-ratio="0.9612027158098934" data-s="300,640" data-src="https://mmbiz.qpic.cn/mmbiz_png/Mt5QjqkFG0rXBPHLej7ej6aEVXY3QOUgUBHmbHBNbQDhO8KndzYXWTZ7hXDHhvWWIOPict6YIlNNbasAbjZF40Q/640?wx_fmt=png" data-type="png" data-w="1031"></p>
<p>构建成功后,我们跑起来看效果:</p>
<p>docker run java-hello:latest</p>
<p><img src="https://img2018.cnblogs.com/blog/70544/201903/70544-20190313094531560-1821934566.png" alt="">&nbsp;</p>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    作者:雪雁<br>出处:http://www.cnblogs.com/codelove/
<br>如果喜欢作者的文章,请关注【CodeSpirit-码灵】公众号以便第一时间获得最新内容。本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。<br><b>静听鸟语花香,漫赏云卷云舒。</b>
<br>
<img src="https://images.cnblogs.com/cnblogs_com/codelove/315887/o_251224070213_%E5%85%AC%E4%BC%97%E5%8F%B7.jpg" width="100" height="100"><br><br>
来源:https://www.cnblogs.com/codelove/p/10521104.html
頁: [1]
查看完整版本: Docker最全教程之使用Docker搭建Java开发环境(十七)