Skip to content

快速参考

  • 由……维护: (注:原文中“Maintained by:”后面应该会有具体的维护者信息,若有完整内容,翻译会更加准确。这里仅根据给定的部分进行了翻译。)
    IBM WASdev 社区

  • 哪里可以获得帮助:
    WASdev 社区

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

快速参考(续)

概述

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

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

图像用户

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

更新文件夹权限

WebSphere 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 映像严重膨胀(取决于工件的大小)。因此,建议在复制之前或期间设置权限。

标签

在此存储库中有多个标签可用。带有标签 beta 的图像包含最新每月测试版的安装存档内容。其他图像均基于最新的普遍可用的修复包。

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

FROM websphere-liberty:kernel
COPY --chown=1001:0  Sample1.war /config/dropins/
COPY --chown=1001:0  server.xml /config/
RUN configure.sh

使用情况

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

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

应用程序映像

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

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

实现企业功能

WebSphere 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 \
        websphere-liberty:webProfile8

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

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

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

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

使用 Spring Boot 与 WebSphere 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 websphere-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 websphere-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 websphere-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 层。

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

默认情况下,当 websphere-liberty 图像启动时,会在 /config/configDropins/defaults/keystore.xml 中生成一个 Liberty 服务器 XML 片段,该片段指定一个带有生成密码的 keyStore 节。这会导致 Liberty 在启动时使用自签名证书生成默认的密钥库和信任库(更多信息请参阅知识中心)。当提供您自己的密钥库/信任库时,可以通过确保在 /config/configDropins/defaults/keystore.xml 处已经存在一个文件(例如,作为您的 Docker 构建的一部分添加)来禁用此默认行为。该文件可以包含您的密钥库配置,或者只包含一个空的 <server></server> 节。

使用 IBM JRE 类数据共享

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

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

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

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

docker run -e LICENSE=accept -v /opt/ibm/wlp/output/.classCache \
    --name classcache websphere-liberty true

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

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

在只读模式下运行 WebSphere Liberty

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

docker run -d -p 80:9080 -p 443:9443 \
    --tmpfs /opt/ibm/wlp/output --tmpfs /logs -v /config --read-only \
    websphere-liberty:javaee8

更改区域设置

基础的 Ubuntu 映像不包含额外的语言包。要使用其他区域设置,构建自己的映像,安装所需的语言包,然后设置 LANG 环境变量。例如,以下 Dockerfile 从 websphere-liberty:full 映像开始,安装葡萄牙语语言包,并将巴西葡萄牙语设置为默认区域设置:

FROM websphere-liberty:full
RUN apt-get update \
  && apt-get install -y language-pack-pt-base \
  && rm -rf /var/lib/apt/lists/*
ENV LANG pt_BR.UTF-8

许可证

Dockerfile 文件和相关脚本根据 Apache 许可证 2.0 进行授权。

从 WebSphere Liberty 18.0.0.3 开始,在 Docker Hub 中找到的 WebSphere Liberty Docker 镜像包含一份针对非担保程序的国际许可协议(ILAN)许可,该许可允许有资格的 WebSphere Liberty 客户根据国际程序许可协议(IPLA)条款使用这些相同的镜像。

对于仍希望将 WebSphere Application Server 许可证应用于其 Docker 映像的客户,可以按照以下说明进行操作。

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

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

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