有没有办法以编程方式检测 Docker 容器是本机 运行 还是使用 Docker 机器?

Is there a way to detect programmatically whether a Docker container is running natively or using Docker Machine?

有没有办法从 Docker 容器内部找出该容器是 运行 在 Linux 主机上,还是在 Docker [=52] 中=]海因?

问题的背景是我想在基于 Tomcat 的容器中启用 JMX,但是为此,我需要知道主机的外部 IP 地址:

我有一个 Docker Tomcat 图像,我想在启用 JMX 的情况下推出,但我不知道人们会在本地使用它还是 运行 Docker-Machine,因此我不知道在启动时为java.rmi.server.hostname参数提供哪个IP地址Tomcat。

有没有办法

我想避免人们在启动容器(或 Docker Compose)时必须手动提供 IP 地址的情况。

以下是我使用 DOCKER_HOST 变量解决此问题的方法。我的假设是,如果设置了这个变量,它将包含主机的 IP 地址,格式为 tcp://192.168.99.100:2367.

在我的 docker-compose.yaml 文件中,我已将主机的 DOCKER_HOST 变量映射到容器中:

version: "2"

services:
  foo:
    environment:
      DOCKER_HOST: $DOCKER_HOST

然后在容器中,当容器启动时,我将此变量评估为脚本的一部分 运行,然后使用它来设置 Tomcat 的 JMX 属性:

# Allow to specify the JMX port from the outside. Use 10992 as a default if not provided
DOCKER_JMX_PORT=${DOCKER_JMX_PORT:-10992}

# Evaluate the $DOCKER_HOST variable
if [ -n "DOCKER_HOST" ]; then
  # DOCKER_HOST variable is set
  DOCKER_JMX_HOST=$(echo "$DOCKER_HOST" | sed -e "s|tcp://||g" -e "s/:.*//g")
else
  # DOCKER_HOST variable is not set
  DOCKER_JMX_HOST=$(hostname)
fi

# Set the JMX properties for Tomcat
export CATALINA_OPTS="-Dcom.sun.management.jmxremote=true \
  -Dcom.sun.management.jmxremote.port=$DOCKER_JMX_PORT \
  -Dcom.sun.management.jmxremote.rmi.port=$DOCKER_JMX_PORT \
  -Dcom.sun.management.jmxremote.authenticate=false \
  -Dcom.sun.management.jmxremote.ssl=false \
  -Djava.rmi.server.hostname=$DOCKER_JMX_HOST"

当未设置 DOCKER_HOST 环境变量时,我假设容器是 运行ning 原生的,例如在 Linux 上,我将主机名用于 JMX 属性。