有没有办法以编程方式检测 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-Machine 中时,这类似于 192.168.99.100.
- 运行 本机在 Linux,这是主机的 IP 地址。
- 运行 in Docker for Mac,这也是主机的IP地址
我有一个 Docker Tomcat 图像,我想在启用 JMX 的情况下推出,但我不知道人们会在本地使用它还是 运行 Docker-Machine,因此我不知道在启动时为java.rmi.server.hostname
参数提供哪个IP地址Tomcat。
有没有办法
- 从容器内部找到该 IP 地址(或找出它的位置 运行),或者
- 从外面找到它(例如在docker-compose)然后在启动时将它传递到容器中?
DOCKER_HOST
环境变量在这种情况下有帮助吗? 运行 Docker Machine时设置为tcp://192.168.99.100:2376
-不运行 Docker Machine时是否也使用此变量?
我想避免人们在启动容器(或 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 属性。
有没有办法从 Docker 容器内部找出该容器是 运行 在 Linux 主机上,还是在 Docker [=52] 中=]海因?
问题的背景是我想在基于 Tomcat 的容器中启用 JMX,但是为此,我需要知道主机的外部 IP 地址:
- 当 运行 在 Docker-Machine 中时,这类似于 192.168.99.100.
- 运行 本机在 Linux,这是主机的 IP 地址。
- 运行 in Docker for Mac,这也是主机的IP地址
我有一个 Docker Tomcat 图像,我想在启用 JMX 的情况下推出,但我不知道人们会在本地使用它还是 运行 Docker-Machine,因此我不知道在启动时为java.rmi.server.hostname
参数提供哪个IP地址Tomcat。
有没有办法
- 从容器内部找到该 IP 地址(或找出它的位置 运行),或者
- 从外面找到它(例如在docker-compose)然后在启动时将它传递到容器中?
DOCKER_HOST
环境变量在这种情况下有帮助吗? 运行 Docker Machine时设置为tcp://192.168.99.100:2376
-不运行 Docker Machine时是否也使用此变量?
我想避免人们在启动容器(或 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 属性。