【编者的话】Arun Gupta是 《Docker for Java Developers》 一书的作者,本文介绍了构建Java镜像的五个小窍门,从而以超越基本概念和框架的方式开启Docker容器之旅。
如果你是一个热切期待在你的组织内部迁移到容器技术的企业级软件开发人员,那么你会有更多的兴趣来学习Docker背后的基础概念以及围绕Docker的常用的编排框架。在本文中,我将就这些基本概念进行扩展并提供一些简单而使用的小窍门来构建你的第一个使用Java编程语言的Docker镜像。
Docker镜像是通过从Dockerfile读取指令来构建的,在这里你可以发现构建你的第一个镜像的基础指令。
在应用程序中一个常见的包含了JDK的基础镜像是默认的openjdk:latest镜像,这是基于Debian操作系统构建的。该镜像的大小是640.9MB,可以通过运行镜像看到JDK版本:
docker run -it openjdk java -version
如果你想使用Oracle JDK,那么 正常理由 Docker Hub上是没有可用的官方Docker镜像的,所以,你需要下载 Oracle JDK 并打包到镜像里。在 https://github.com/arun-gupta/ ... e-jdk 上有一个可用的简单的展示如何打包Oracle JDK的Dockerfile,以这种方式构建的镜像是536.3MB。
Alpine Linux 是基于 musl libc 和 BusyBox 构建的精简的Linux发行版,Docker Hub上有基于Alpine的OpenJDK镜像,可以以openjdk:alpine下载,这个镜像的大小是144.9MB,这是不到默认的openjdk:latest镜像大小的25%。
为什么说更小的镜像体积很重要呢?这与磁盘空间没有关系,而是一旦容器在不同的宿主机上启动并且镜像需要通过网络下载,那么镜像大小就变得至关重要了。一个更大的镜像也就意味着需要更高的延迟来启动镜像。
同样的,openjdk:8-jre是309MB,而openjdk:8-jre-alpine是107.8MB。
这里我还想提供一些建议。确保选择JDK或者JRE哪一个是合适的基础镜像,这会让你的镜像变小。为了进一步减少体积,你也许可以考虑使用基于Alpine的镜像而不是默认的基于Debian的镜像。如果你想要一个商业版本支持的JDK,那么你也许需要构建你自己的镜像。下面会讨论该镜像需要的底层操作系统。
通常是从一个底层的操作系统来开始构建一个Docker镜像的,也就是Dockerfile的FROM指令提及的。在某些情况下,你也许会从一个已有的基础镜像开始,这时你已经选择了底层操作系统镜像。但是如果你需要选择一个底层操作系统镜像,那么常用的镜像和对应的大小如下所示:
仔细选择你的底层操作系统,因为它将添加到您的镜像里,确保将操作系统更新到发行包的最新版本,同样也包括依赖项。
在某些情况下,您可能需要选择一个商业支持的操作系统。比如Red Hat Enterprise Linux或者Windows Server 2016。这些通常是由供应商提供的。
Docker CLI是由给定一个目录或者URL作为构建上下文的,在镜像构建之前会将该上下文发送到Docker Daemon。建议在一个新的目录里创建Dockerfile,然后在该目录里只添加镜像包含的文件。这为docker build命令提供了一个更加清洁的上下文并且允许更快地构建镜像。否则,扫描带有多个文件的目录将不必要地减慢构建速度。
如果无法创建一个新目录或者执行命令的目录里存在着其他文件,那么可以考虑.dockerignore文件,该文件的语法类似于.gitignore文件,允许您从构建中排除一些文件和目录。举例来说,如果Dockerfile放在了Maven工程的根目录里,那么该文件是需要的。然后这个文件可以用来从target目录里指定生成的特定组件。
你经常需要创建一个镜像,在这里基础镜像会启动一个组件然后你的镜像将对其作配置。举例来说,jboss/wildfly基础镜像将会启动WildFly应用服务器,然后你的镜像会在其中创建一些JDBC资源。另外一个例子就是couchbase镜像启动了Couchbase服务器,在这种情况下,数据库需要对于内存配额、管理凭证和其它选项进行手动配置。一个新的提供了预配置的Couchbase服务器的Docker镜像是非常实用的,这个已经在couchbase/server:sandbox镜像里实现了,该镜像使用了couchbase作为基础镜像,它使用了Couchbase Restful API来配置数据库,正如在Dockerfile中说明的。
你可能还需要查看容器内的文件系统是如何陈列的,这将主要用于调试目的。
如果容器正在运行,那么你可以使用如下命令来attach到镜像文件系统:
docker exec -it {cid} bash
如果容器没有运行,那么可以使用下面的命令:
docker run -it <image> bash
在这两种情况下,将会使用镜像的文件系统来打开一个Bash Shell,如果需要的话,这会允许你深入容器/镜像文件系统并进行必要的更新。
你是否已经准备好容器化你的第一个Java应用了呢?我的新书 《Docker for Java Developer》 ,解释了如何使用Docker打包、部署和扩展应用,此外,Github上的Docker for Java Developers教程提供了一个自学及动手实验来构建你的第一个Java应用程序。
原文链接: 5 simple tips for building your first Docker image with Java (翻译:胡震)