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

时间:2016-12-07 08:51:42

标签: docker docker-compose jmx docker-machine

有没有办法从Docker容器内部找出该容器是在Linux主机上还是在Docker Machine中本机运行的?

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

  • 在Docker-Machine中运行时,这类似于192.168.99.100。
  • 在Linux上本机运行,这是主机的IP地址。
  • 在Docker for Mac中运行,这也是主机的IP地址。

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

有没有办法

  • 从容器内部找到该IP地址(或找出它正在运行的位置)或
  • 从外面找到它(例如在docker-compose中)然后在启动时将它传递到容器中?在这种情况下DOCKER_HOST环境变量可以帮助吗?运行Docker Machine时,它设置为tcp://192.168.99.100:2376 - 这个变量是否也在未运行Docker Machine时使用?

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

1 个答案:

答案 0 :(得分:0)

以下是我使用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环境变量,我假设容器本机运行,例如在Linux上,我使用主机名作为JMX属性。