Skip to content

快速参考

支持的标签及各自的 Dockerfile 链接

快速参考(续)

概述

此存储库中的所有图像均使用 Ubuntu 作为操作系统。有关使用通用基础映像的变体,请参阅此存储库。

欲了解更多关于这些图像的信息,请查看我们的 GitHub 仓库。

图像用户

此图像默认以 USER 1001 (非 root)运行,作为 0 组的一部分。请确保您阅读以下内容以设置适当的文件夹和文件权限。

更新文件夹权限

Open Liberty 访问的所有文件夹都已被授予适当的权限,但如果您扩展的 Dockerfile 需要对另一个位置的权限,您可以简单地临时切换到 root 并提供所需的权限,例如:

USER root
RUN mkdir -p /myFolder && chown -R 1001:0 /myFolder
USER 1001

更新文件权限

您必须确保您正在复制到映像(通过 COPYADD )中的所有工件具有正确的权限,以便用户 1001 或组 0 可以对其进行 readexecuted ,因为在将文件传输到 Docker 映像中时,文件的所有权会更改为 root:0

您有几个这样做的选项:在复制文件之前、复制期间或复制之后。

在复制前更新权限

由于文件的所有权将变更为 root:0 ,您可以简单地为所有者组设置权限,使其能够读取/执行工件(即 chmod 命令的中间数字)。例如,您可以执行 chmod g+rx server.xml ,以确保您的 server.xml 可以被组 0 readexecuted ,以及任何工件,如应用程序的 EARWAR 文件、JDBC 驱动程序,或通过 COPYADD 放置在映像上的其他文件。

在复制期间更新权限

如果您正在使用 Docker v17.09.0-ce 及更高版本,您可以在 ADDCOPY 期间利用标志 --chown=<user>:<group> 。例如: COPY --chown=1001:0 jvm.options /config/jvm.options 。这是首选方法,因为在调用 docker build 之前您无需担心更改权限,并且您也不会在生成的映像中重复层。

复制后更新权限

如果您需要您的 Dockerfile 与较旧版本的 Docker CE 兼容,并且不想预处理文件的权限,则可以临时切换到 root 用户以更改所需文件的权限。例如:

USER root
RUN chown 1001:0 /config/jvm.options
RUN chown 1001:0 /output/resources/security/ltpa.keys
USER 1001

请注意,此模式将为那些工件复制 Docker 层,这可能会使生成的 Docker 映像严重膨胀(取决于工件的大小)。因此,建议在复制之前或期间设置权限。

标签

在这个存储库中有多个标签可用。

kernel-slim 映像仅包含 Liberty 内核,不包含其他运行时功能。此映像是自定义构建映像的推荐基础,以便它们仅包含特定应用程序所需的功能。例如,以下 Dockerfile 以此映像为起点,复制列出应用程序所需功能的 server.xml ,然后使用 features.sh 脚本从在线存储库下载这些功能。

FROM open-liberty:kernel-slim

# Add server configuration
COPY --chown=1001:0  server.xml /config/
# This script will add the requested XML snippets to enable Liberty features and grow image to be fit-for-purpose using featureUtility.
# Only available in 'kernel-slim'. The 'full' tag already includes all features for convenience.
RUN features.sh

# Add the application
COPY --chown=1001:0  Sample1.war /config/dropins/
# This script will add the requested server configurations, apply any interim fixes and populate caches to optimize runtime.
RUN configure.sh

完整的图像列表可在上述 Supported tags and respective Dockerfile links 部分中找到。

使用情况

图像旨在支持多种不同的使用模式。以下示例基于 Java EE8 Liberty 应用程序部署示例,并假定已将 DefaultServletEngine.zip 解压到 /tmp ,且通过在 server 节内添加以下元素(如果未使用带有我们标签的预打包 server.xml 文件之一)将 server.xml 更新为接受来自容器外部的 HTTP 连接:

<httpEndpoint host="*" httpPort="9080" httpsPort="-1"/>

应用程序映像

创建一个扩展的 Docker 映像,我们称之为 application image ,它封装了应用程序及其配置,这是一个非常强大的最佳实践。这样创建了一个强大、自包含且可预测的 Docker 映像,可根据需要跨越新容器,而不依赖于卷或其他可能随时间表现不同的外部运行时构件。

如果您想构建尽可能小的 Open Liberty 应用程序映像,您可以从我们的 kernel 标签开始,添加您的构件,并运行 configure.sh 以扩展功能集以满足特定目的。有关更多详细信息,请参阅我们的 GitHub 页面。

实现企业功能

Open Liberty 镜像具有一组内置的 XML 代码片段,可启用和配置企业功能,例如会话缓存和监控。这些功能可通过应用程序镜像 Dockerfile 中的特定 ARG 进行切换,并通过 configure.sh 脚本进行配置。有关更多信息,请参阅我们 GitHub 页面上的说明。

使用卷进行配置

这种模式对于快速实验/早期开发(例如 I just want to run the application as I iterate over it )可能有用,但不应用于涉及不同团队和环境的开发场景 - 对于这些情况,上述的 Application Image 模式才是可行的方法。

使用 volumes 时,应用程序文件可安装在该服务器的 dropins 目录中并运行。以下示例在后台启动一个容器,从主机文件系统运行一个.WAR 文件,将 HTTP 和 HTTPS 端口分别映射到 80 和 443。

$ docker run -d -p 80:9080 -p 443:9443 \
        -v /tmp/DefaultServletEngine/dropins/Sample1.war:/config/dropins/Sample1.war \
        open-liberty:full

当服务器启动后,您可以在 Docker 主机上浏览到 http://localhost/Sample1/SimpleServlet 。

注意:如果您在 OS X 或 Windows 上使用 boot2docker 虚拟机,则需要使用命令 boot2docker ip 来获取虚拟主机的 IP,而不是使用 localhost。

为了在配置方面具有更大的灵活性,可以从主机挂载整个服务器配置目录,然后将服务器名称指定为运行命令的参数。注意:此特定示例服务器配置仅提供 HTTP 访问。

$ docker run -d -p 80:9080 \
  -v /tmp/DefaultServletEngine:/config \
  open-liberty:full

使用 Spring Boot 与 Open Liberty

full 图像引入了特定于支持所有 Liberty 功能(包括 Spring Boot 应用程序)的功能。因此,此图像包括用于将 Spring Boot 应用程序分离为瘦应用程序和依赖库缓存的 springBootUtility 。为了在不包含您未使用的功能的情况下获得相同的功能,请在 kernel 图像的基础上进行构建,并为您的 server.xml 运行 configure.sh,确保它启用了 springBoot-1.5springBoot-2.0 功能。

为详细阐述这些功能,本节假定在 /tmp 目录中存在独立的 Spring Boot 2.0.x 应用程序 hellospringboot.jar

  1. 在默认服务器配置中,Spring Boot 应用程序 JAR 部署到 dropins/spring 目录,而不是 dropins 目录。Liberty 允许每个服务器配置一个 Spring Boot 应用程序。您可以通过将应用程序 JAR 添加到 dropins/spring 目录,在此映像上创建一个 Spring Boot 应用程序层。在本示例中,我们将 hellospringboot.jar/tmp 复制到包含以下 Dockerfile 的同一目录中。

    FROM open-liberty:kernel
    
    COPY --chown=1001:0 hellospringboot.jar /config/dropins/spring/
    COPY --chown=1001:0 server.xml /config/
    
    RUN configure.sh
    

    自定义映像可以按如下方式构建和运行。

    $ docker build -t app .
    $ docker run -d -p 8080:9080 app
    
  2. full 图像提供库缓存目录 lib.index.cache ,其中包含由 springBootUtility 命令创建的索引库缓存。使用 lib.index.cache 为瘦应用程序提供库缓存。

    您可以使用 springBootUtility 命令在 full 映像上创建薄应用程序和库缓存层。以下示例使用 docker 暂存来有效地构建一个映像,该映像将一个胖 Spring Boot 应用程序作为包含薄应用程序和库缓存的两层进行部署。

    FROM open-liberty:kernel as staging
    COPY --chown=1001:0 hellospringboot.jar /staging/myFatApp.jar
    COPY --chown=1001:0 server.xml /config/
    RUN springBootUtility thin \
       --sourceAppPath=/staging/myFatApp.jar \
       --targetThinAppPath=/staging/myThinApp.jar \
       --targetLibCachePath=/staging/lib.index.cache
    FROM open-liberty:kernel
    COPY --chown=1001:0 server.xml /config
    COPY --from=staging /staging/lib.index.cache /lib.index.cache
    COPY --from=staging /staging/myThinApp.jar /config/dropins/spring/myThinApp.jar
    RUN configure.sh
    

    对于在连续的应用程序更新中很少更改其库依赖项的 Spring Boot 应用程序,您可以使用上述功能在容器之间共享库缓存,并创建更高效的利用 Docker 构建缓存的 Docker 层。

提供您自己的密钥库/信任库

open-liberty 图像启动时,它可以在 /config/configDropins/defaults/keystore.xml 中生成一个 Liberty 服务器 XML 代码片段,该片段指定一个带有生成密码的 keyStore 节。这会导致 Open Liberty 在启动时使用自签名证书生成默认的密钥库和信任库。图像可以通过设置以下内容来请求此操作:

ENV KEYSTORE_REQUIRED "true"

在提供您自己的密钥库/信任库时,可通过添加以下内容来禁用此默认行为:

ENV KEYSTORE_REQUIRED "false"

即使未生成,将密钥库自定义放置在 /config/configDropins/defaults/keystore.xml 中也是一个好的做法,因为这样更容易找到,并且使迁移到 websphere-liberty docker 映像变得更简单。

使用 IBM JRE 类数据共享

IBM JRE 提供了一个功能“类数据共享”,它通过使用由文件支持的共享内存,在同一主机上运行的多个 Java 虚拟机之间提供透明和动态的数据共享。当运行 Liberty Docker 镜像时,它会在 /opt/ol/wlp//output/.classCache 处查找该文件。要从类数据共享中受益,此位置需要通过主机或数据卷容器在容器之间共享。

以上述示例 3 中的应用程序映像为例,容器可以按如下方式共享主机文件位置(包含共享缓存) /tmp/open-liberty/classCache

docker run -d -p 80:9080 -p 443:9443 \
    -v /tmp/open-liberty/classCache:/opt/ol/wlp/output/.classCache app

或者,创建一个命名的数据卷容器,在共享文件的位置公开一个卷:

docker run -v /opt/ol/wlp//output/.classCache \
    --name classcache open-liberty true

然后,按照如下方式运行带有从数据卷容器 classcache 挂载的卷的 Open Liberty 镜像:

docker run -d -p 80:9080 -p 443:9443 --volumes-from classcache app

在只读模式下运行 Open Liberty

Liberty 在运行时会写入两个不同的目录: /opt/ol/wlp//output/logs 。为了以只读模式运行 Liberty 镜像,这些目录可以作为临时文件系统挂载。如果使用所提供的镜像,密钥库将在服务器配置的初始启动时生成。这意味着服务器配置目录要么需要是可读写的,要么密钥库需要构建到镜像中。在示例命令中, /config 被挂载为可读写卷。

docker run -d -p 80:9080 -p 443:9443 \
    --tmpfs /opt/ol/wlp//output --tmpfs /logs -v /config --read-only \
    open-liberty:webProfile8

开放自由(Open Liberty)与 WebSphere Liberty 之间的关系

WebSphere Liberty 是 Open Liberty 的商业发行版。有一个官方的 WebSphere Liberty Docker 镜像。WebSphere Liberty Docker 镜像比 Open Liberty 镜像出现得早,因此为了更简单地从 Open Liberty 迁移到 WebSphere Liberty(反之亦然),这些镜像在很大程度上是兼容的。通过简单地更改 FROM 子句,应该可以从一个迁移到另一个。在它们之间进行迁移的一些注意事项:

  • Open Liberty 安装到 /opt/ol 而非 /opt/ibm
  • 使用 /config 文件夹来访问服务器配置。
  • 使用 /output 文件夹来访问服务器输出。
  • 当添加您自己的 SSL 配置时,使用 /config/configDropins/defaults/keystore.xml

图像变体

open-liberty 图像有多种类型,每种都针对特定的用例而设计。

open-liberty:<version>

这是事实上的映像。如果您不确定自己的需求是什么,您可能想要使用这个。它被设计为既可以用作一次性容器(挂载您的源代码并启动容器以启动您的应用程序),也可以作为构建其他映像的基础。

open-liberty:<version>-slim

此图像不包含默认标签中包含的常见软件包,仅包含运行 open-liberty 所需的最小软件包。除非您在仅会部署 open-liberty 图像且存在空间限制的环境中工作,否则我们强烈建议使用此存储库的默认图像。

许可证

查看此映像中所包含软件的许可证信息。

与所有 Docker 镜像一样,这些镜像可能还包含其他可能受其他许可证约束的软件(例如来自基础发行版的 Bash 等,以及所包含的主要软件的任何直接或间接依赖项)。

一些能够自动检测到的额外许可信息可能会在 repo-info 存储库的 open-liberty/ 目录中找到。

对于任何预构建图像的使用,图像用户有责任确保对此图像的任何使用都符合其中包含的所有软件的任何相关许可。