资讯专栏INFORMATION COLUMN

Docker极简入门:使用Docker运行Java程序

番茄西红柿 / 3263人阅读

摘要:完成之后运行命令你的输出可能会像这样和都为,这是因为刚刚在编写时没有指定它们。多阶段构建镜像多阶段构建镜像其实运行程序只需要就行,我们没有必要使用作为基础镜像。但把程序打包成包,然后再交给的方式太麻烦了。

运行简单的Java程序

先在当前目录创建App.java文件

public class App{    public static void main(String[] args){        String os = System.getProperty("os.name");        String osArch = System.getProperty("os.arch");        String osVersion = System.getProperty("os.version");        System.out.println(os);        System.out.println(osArch);        System.out.println(osVersion);    }}

然后创建Dockerfile

## 设置基础镜像FROM openjdk:8## 设置进入容器时的工作目录WORKDIR /root/app## 将本地目录复制进容器目录中COPY App.java /root/app## 镜像制作时执行的命令RUN javac App.java## 容器启动时执行的命令ENTRYPOINT java App

准备工作做好之后在当前目录输入命令

docker build .

.是指明Dockerfile文件在哪个路径之下,因为我们是在当前路径下创建的,所以只需要填写.就好。

build完成之后运行命令:

docker images## 你的输出可能会像这样REPOSITORY   TAG       IMAGE ID       CREATED       SIZE           2045f43c5e88   6 hours ago   526MB

REPOSITORYTAG都为,这是因为刚刚在编写Dockerfile时没有指定它们。

之后的段落里会解决这个问题,对于这个简单的项目,我们只需要IMAGE ID就够了。

现在根据镜像启动容器,运行命令:

## 偷懒的话可以只打IMAGE ID的前三位## 这个IMAGE ID要根据你实际build出来的镜像进行修改## 请务必运行前一条命令docker images, 找到对应的IDdocker run 2045f43c5e88

输出如下:

Linuxamd645.4.72-microsoft-standard-WSL2

这段Java程序的作用就是输出当前操作系统的环境,根据输出可以知道博主是在WSL2上运行docker的。

FROM alpineWORKDIR /root/appCOPY App.java /root/appRUN apk add openjdk8## 设置环境变量ENV JAVA_HOME /usr/lib/jvm/java-1.8-openjdkENV PATH $PATH:$JAVA_HOME/binRUN javac App.javaENTRYPOINT java App

为了便于区别两次构建出的不同镜像,我们给之前的镜像打上tag

使用命令:

docker tag 2045 myapp:1.0

build时可以使用-t来为镜像打tag

docker build . -t myapp:2.0

再次运行命令

docker images
REPOSITORY   TAG            IMAGE ID       CREATED        SIZEmyapp        1.0            2045f43c5e88   12 hours ago   526MBmyapp        2.0            0545999c0fc0   25 hours ago   131MB

可以看到两个镜像已经被分别打上了tag,不过值得注意的是tag为1.0的镜像体积要比2.0的大,这是为什么?

直接将openjdk作为基础镜像会包含所有的Java语言编译工具和库。

多阶段构建镜像

其实运行Java程序只需要jre就行,我们没有必要使用jdk作为基础镜像。但把程序打包成jar包,然后再交给docker的方式太麻烦了。

有没有办法实现编译、打包、运行一体化呢?

当然是有的,简单修改一下Dockerfile就可以了

先基于Maven镜像生成jar包,最后运行在jre镜像中,同时删除已经用不到的Maven镜像

首先创建一个maven项目

这是我的pom.xml文件

  4.0.0    org.example  demoapp  app  demoapp    http://www.example.com      UTF-8    1.8    1.8              junit      junit      4.11      test                                            maven-clean-plugin          3.1.0                                  maven-resources-plugin          3.0.2                          maven-compiler-plugin          3.8.0                          maven-surefire-plugin          2.22.1                          maven-jar-plugin          3.0.2                        			                                true                false                lib/                org.example.App                                                              maven-install-plugin          2.5.2                          maven-deploy-plugin          2.8.2                                  maven-site-plugin          3.7.1                          maven-project-info-reports-plugin          3.0.0                    

然后在项目的根目录下创建Dockerfile文件

## build stageFROM maven:3.8.3-jdk-8 AS MAVEN_BUILDWORKDIR /build/# 把本地的pom.xml和src目录复制到镜像的/build目录下COPY pom.xml /build/COPY src /build/src/# 执行打包命令RUN mvn package## run sFROM openjdk:8-jre-alpine# 设置工作目录在镜像的 /app 目录下WORKDIR /app# 将第一阶段生成的jar包添加到第二阶段的容器中COPY --from=MAVEN_BUILD /build/target/demoapp-app.jar /app/# 运行jar包ENTRYPOINT java -jar demoapp-app.jar
REPOSITORY   TAG            IMAGE ID       CREATED             SIZE                770d75ab38d7   7 seconds ago    84.9MB

最后生成的镜像大小要比之前的500MB小了很多

Dockerfile常用命令

命令描述
FROM基础镜像
MAINTAINER维护者信息
ADD添加文件到镜像(自动解压)
COPY添加文件到镜像(不解压)
USER设置运行RUN指令的用户
ENV设置环境变量
RUN镜像制作时执行的命令
ENTRYPOINT容器启动时执行的命令(无法被覆盖)
CMD容器启动时执行的命令(多条CMD只执行最后一条)
EXPOSE声明要打开的端口(实际还是要docker run -p port1:port2 才行)
VOLUME目录映射
ONBUILD构建时自动执行的命令

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/125095.html

相关文章

  • Spring Boot 应用 Docker 化 《Spring Boot 2.0极简教程》(陈光剑)

    摘要:应用化极简教程陈光剑基于的企业级应用开发最佳实践前面的章节中,我们都是在环境中开发运行测试应用程序。关键字是分布式应用微服务容器虚拟化。通常,在企业项目实践中,会实现一套应用部署发布的自动化运维平台工具。 Spring Boot 应用 Docker 化 《Spring Boot 2.0极简教程》(陈光剑)—— 基于 Gradle + Kotlin的企业级应用开发最佳实践 前面的章节中,...

    Donne 评论0 收藏0
  • Spring Boot 应用 Docker 化 《Spring Boot 2.0极简教程》(陈光剑)

    摘要:应用化极简教程陈光剑基于的企业级应用开发最佳实践前面的章节中,我们都是在环境中开发运行测试应用程序。关键字是分布式应用微服务容器虚拟化。通常,在企业项目实践中,会实现一套应用部署发布的自动化运维平台工具。 Spring Boot 应用 Docker 化 《Spring Boot 2.0极简教程》(陈光剑)—— 基于 Gradle + Kotlin的企业级应用开发最佳实践 前面的章节中,...

    rose 评论0 收藏0
  • Docker 极简印象

    摘要:通过指令可以将可修改层提交到镜像中,从而生成一个新的镜像。仓库有了镜像之后,可以很方便的在不同的机器上运行一致的环境。数据卷是独立于容器存在的,容器销毁后数据卷仍然存在。 Docker是一款比传统虚拟机软件更先进的虚拟化工具,可以快速的在不同机器上搭建出一致的开发、调试、运行环境。它的核心概念有镜像、容器和仓库。 镜像(Image) 类似于ISO文件,是一个打包好的运行环境。一个镜像可...

    GraphQuery 评论0 收藏0
  • Docker 与 Mesos 的前生今世 | 数人云CTO肖德时@KVM分享实录

    摘要:今天小数给大家带来一篇技术正能量满满的分享来自社区线上群分享的实录,分享嘉宾是数人云肖德时。第二级调度由被称作的组件组成。它们是最小的部署单元,由统一创建调度管理。 今天小数给大家带来一篇技术正能量满满的分享——来自KVM社区线上群分享的实录,分享嘉宾是数人云CTO肖德时。 嘉宾介绍: 肖德时,数人云CTO 十五年计算机行业从业经验,曾为红帽 Engineering Service ...

    0x584a 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<