2016-02-17 32 views
5

ホストでDockerコンテナを直接実行しているときに問題なく接続できます。DockerマシンのホストからDockerコンテナへJMXを接続するにはどうすればいいですか?

私のホストにはネットワーク192.168.1.0/24があり、ホストのIPアドレスは192.168.1.20です。 My DockerコンテナのIPアドレスは172.17.0.2です。 jconsoleから172.17.0.2:1099に接続すると動作します。

このサービスをDockerマシンにインストールすると、接続できません。

My DockerマシンのIPアドレスは192.168.99.100で、コンテナのIPアドレスは172.17.0.2ですが、jconsoleを使用して192.168.99.100:1099に接続すると動作しません。

それを繰り返すには:

192.168.1.20は--- 172.17.0.2:1099

192.168.1.20 ---(192.168.99.100 --- 172.17.0.2:1099)とに接続する作品私のホストからの192.168.99.100:1099は動作しません。

Dockerマシンのコンテナ化されたサービスには、Dockerマシンの外部IPアドレスを使用してアクセスすることができます。 ---

192.168.99.100(192.168.99.100:8080 --- 172.17.0.2:8080)

をしかし、私はそれだけでは動作しませんJMXを使用する場合:これは動作します。

Tomcatサービスです。

CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n \ 
-Dcom.sun.management.jmxremote.port=1099 \ 
-Dcom.sun.management.jmxremote.rmi.port=1099 \ 
-Dcom.sun.management.jmxremote.authenticate=false \ 
-Dcom.sun.management.jmxremote.ssl=false \ 
-Djava.rmi.server.hostname=IP address of Docker container 
+0

ドッカー・ジャーナル・ライブラリによって開始されています...それはあまり重要ではありませんが、「ドッカー・マシンssh」を実行すると「ドッカーps -a」でコンテナにこのポートバインディング/露出:ad6be9184855 company/tomcat:8.0.30 0.0.0.0:1099-> 1099/tcp、0.0.0.0:8000-> 8000/tcp、0.0.0.0:8009-> 8009/tcp、0.0.0.0:8080-> 8080/tcp – stewenson

答えて

4

私は、問題はおそらくjava.rmi.server.hostnameプロパティの値だと思う:私は、Tomcatインスタンスを起動するスクリプトでこれを持っています。これは、JVMに接続するためにJMXクライアントが使用するホスト名またはIPアドレスである必要があります。つまり、172.17.0.2:1099を使用して直接コンテナに接続する最初のケースでは、この設定を172.17.0.2に設定する必要があります。後者の場合、ドッカーマシン192.168.99.100:1099でコンテナにアクセスする場合は、設定を192.168.99.100に設定する必要があります。

非常に似た質問(その間に削除された)に関する私の研究の最中に、私はブログエントリ(それもまた削除されました)を見つけました。それはそれは私にJMX接続がどのように動作するかのアイデアを与えたという古いですが:

  1. JMXレジストリを使用すると、JConsoleのでレジストリに接続した場合、レジストリがJMXサービスのURLを提供し、コンテナ
  2. のポート<com.sun.management.jmxremote.port>でリッスンクライアントに送信します。
  3. このURLは、JMXサービスURLこのservice:jmx:rmi:///jndi/rmi://<java.rmi.server.hostname>:<com.sun.management.jmxremote.rmi.port>/jmxrmiようになります

オブジェクトを取得するためにクライアントによって使用されます。あなたの場合はservice:jmx:rmi:///jndi/rmi://172.17.0.2:1099/jmxrmiです。このアドレスはドッカーのマシンからしか到達できないため、リモートからの接続は不可能です。私の質問では、私はRMIポートに関して同じ問題をカバーしています...

この問題の解決策はありません。ただし、コンテナの起動時に環境変数としてJMXポートと外部ホスト名(またはIP)の両方を指定できます(here)。

docker run -p 1099:1099 \ 
    -e "JMX_HOST=192.168.99.100" \ 
    -e "JMX_PORT=1099" \ 
    company/tomcat:8.0.30 

CATALINA_OPTS="... \ 
    -Dcom.sun.management.jmxremote=true \ 
    -Dcom.sun.management.jmxremote.port=$JMX_PORT \ 
    -Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT \ 
    -Dcom.sun.management.jmxremote.authenticate=false \ 
    -Dcom.sun.management.jmxremote.ssl=false \ 
    -Djava.rmi.server.hostname=$JMX_HOST" 

ない非常に素晴らしい、しかし、誰もがそれに問題がある場合、それは...

+0

はい、このアプローチはうまくいき、私はそれをあなたのように正確に理解しました。私はちょうど答えを書くのを忘れました:)ありがとう。 – stewenson

+1

BTW:これも私にとってはうまくいった(Java 7、Tomcat 7)が、動作させるために 'CATALINA_OPTS'に' -Dcom.sun.management.jmxremote = 'を追加しなければならなかった。個々の特性だけでは不十分です。 – nwinkler

+1

@nwinklerもちろんあなたは正しい。私は不足しているシステムプロパティ 'com.sun.management.jmxremote'を含めるように私の答えを更新しました – dpr

1

を動作するはずです:これらは、JMXの設定で使用することができます。

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=9876 
-Dcom.sun.management.jmxremote.rmi.port=9876 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false 
-Djava.rmi.server.hostname=<name of the docker container> 

重要な部分は、ドッキングウィンドウコンテナの名前を設定することです:私は、次のパラメータを使用してドッキングウィンドウコンテナでJavaプロセスを開始しました。コンテナ9876のポートを公開します。また、ssh接続をセットアップして、9876をlocalhostに転送しました。

次はあなたのSSHの設定に行く:

私はローカルマシンのセットアップの/ etc/hosts

127.0.0.1 <name of the docker container> 

今すぐ「ドッキングウィンドウコンテナの名前」にコンソールを接続する必要がありまた

LocalForward 127.0.0.1:9876 127.0.0.1:9876 

関連する問題