1. ホーム
  2. java

[解決済み] Docker コンテナで動作するシンプルな Java プロセスに VisualVM をアタッチする方法

2023-05-21 10:12:37

質問

実は、JEE コンテナ、特に Glassfish 用に動作するソリューションが欲しかったのですが、設定の多くの組み合わせを試しても成功しなかったので、設定を最も単純なケースに減らしました。

Dockerコンテナで起動したHello Worldデーモンがこれです。私は jconsole または VisulaVM を付けてください。全ては同じマシンにあります。

public class Main {
  public static void main(String[] args) {
    while (true) {
      try {
        Thread.sleep(3000);
        System.out.println("Hello, World");
      } catch (InterruptedException e) {
        break;
      }
    }
  }
}

Dockerfile

FROM java:8
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp
RUN javac Main.java
CMD ["java", "Main"]

建物 docker build -t hello-world-daemon .

走っている docker run -it --rm --name hwd hello-world-daemon

質問です。

  • にどのようなJVMパラメータを追加すべきでしょうか? CMD コマンドラインに追加する必要がありますか?
  • どのようなポートを公開し、パブリッシュする必要がありますか?
  • Dockerコンテナは、どのようなネットワークモードを使用すべきでしょうか?

正解が偏らないように、ここでは私の失敗した試みは示していません。これはかなり一般的な問題であるはずですが、動作する解決策を見つけることができませんでした。

更新しました。動作する解決策

このDockerfileは動作します

FROM java:8
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp
RUN javac Main.java
CMD ["java", \
"-Dcom.sun.management.jmxremote", \
"-Dcom.sun.management.jmxremote.port=9010", \
"-Dcom.sun.management.jmxremote.local.only=false", \
"-Dcom.sun.management.jmxremote.authenticate=false", \
"-Dcom.sun.management.jmxremote.ssl=false", "Main"]
EXPOSE 9010

docker runコマンドと組み合わせて

docker run -it --rm --name hwd -p 9010:9010 hello-world-daemon

VisualVM 右クリックで接続 ローカル->JMX接続の追加 と入力し localhost:9010 を入力するか、リモートホストを追加してください。

JConsole を選択することで接続します。 リモートプロセス localhost:9010 .

接続をリモートとして定義する場合、以下のように ifconfig で指定された任意のインターフェースを使用することができます。例えば docker0 というアドレスのインタフェースは 172.17.0.1 が動作します。コンテナのアドレス 172.17.0.2 も動作します。

どのように解決するのですか?

まず、これらのJVMパラメータでアプリケーションを実行する必要があります。

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9010
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

次に、Docker用にポートを公開します。

EXPOSE 9010

docker runコマンドでポートバインディングも指定します。

docker run -p 9010:9010 -it --rm --name hwd hello-world-daemon

この後、Jconsoleでローカルの9010ポートに接続し、Dockerで実行されているアプリケーションを管理することができます。