2016-12-07 12 views
0

Dockerコンテナの内部から、そのコンテナがLinuxホスト上で、またはDocker Machine上でネイティブに実行されているかどうかを調べる方法はありますか?Dockerコンテナがネイティブに動作しているのか、Docker Machineを使用しているのかをプログラムで検出する方法はありますか?

質問の背景には、私は私のTomcatベースのコンテナでJMXを有効にしたいということですが、そのために、私はホストの外部IPアドレスを知っている必要があります:

  • Docker-で実行している場合マシン、これは192.168.99.100のようなものです。
  • Linux上でネイティブに実行されている、これはホストのIPアドレスです。
  • Mac用Dockerで実行している場合、これもホストのIPアドレスです。

私はJMXを有効にしてロールアウトしたいDocker Tomcatイメージを持っていますが、人々がそれをネイティブに使用するのかDocker-Machineで実行するのかは分かりませんIPアドレスは、Tomcatを起動するときにjava.rmi.server.hostnameパラメータを指定します。

(それが実行しているどこかを見つける)のいずれか

  • は、容器の内側からそのIPアドレスを見つける方法はありますか
  • が外からそれを見つける(例えばドッカ-コンで)、それをコンテナに入れてから始めるのですか?この場合、DOCKER_HOST環境変数は役に立ちますか? Docker Machineを実行しているときはtcp://192.168.99.100:2376に設定されています - この変数はDocker Machineを実行していないときにも使用されますか?

コンテナ(またはDocker Compose)の起動時に手動でIPアドレスを入力する必要がないようにしたいと考えています。

+1

については、[docker api](https://docs.docker.com/engine/reference/api/docker_remote_api/)を使用してコンテナに関する情報を入手することができます。 –

+0

@ Mohsen89zあなたが実行しているホストのタイプを見つけるために、ドッカーで何を照会しますか? – Matt

+1

私はそれを実行しているホストから実行時に環境変数を注入しなければ、やりにくいと思います。おそらく、人々のために情報を収集するコンテナを実行するためのスクリプトを設定することができます。ドッカーで動作するような[jolokia](https://jolokia.org)を試してみてください。 – Matt

答えて

0

ここでは、DOCKER_HOST変数を使用してこれを解決しました。私の前提は、この変数が設定されている場合、ホストのIPアドレスがtcp://192.168.99.100:2367の形式で格納されることです。私docker-compose.yamlファイルで

が、私は容器の中に、ホストのDOCKER_HOST変数をマッピングしています

version: "2" 

services: 
    foo: 
    environment: 
     DOCKER_HOST: $DOCKER_HOST 

次に容器に、私はコンテナの起動時に実行されるスクリプトの一部として、この変数を評価し、 DOCKER_HOST環境変数が設定されていない場合、私はコンテナは例えば、ネイティブに実行されていることを前提とし

# 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" 

:その後、TomcatのJMXプロパティを設定するためにそれを使用しますLinuxでは、JMXプロパティのホスト名を使用します。

関連する問題