[解決済み] Docker コンテナで動作するシンプルな Java プロセスに VisualVM をアタッチする方法
質問
実は、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で実行されているアプリケーションを管理することができます。
関連
-
Uncaught ReferenceError: は定義されていません。
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] Dockerコンテナの中から、マシンのローカルホストに接続するにはどうすればよいですか?
-
[解決済み] Docker Dockerコンテナからホストへのファイルコピー
-
[解決済み] ホストからDockerコンテナにファイルをコピーする方法は?
-
[解決済み] リポジトリを使用せずに、あるホストから別のホストにDockerイメージをコピーする方法
-
[解決済み】Dockerは仮想マシンとどう違うの?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Java の switch case 文で必要な定数式の問題の解決法
-
Solve モジュールのビルドに失敗しました。Error: ENOENT: no such file or directory エラー
-
ApplicationContextの起動エラーです。条件レポートを表示するには、アプリケーションを'de'で再実行します。
-
Jsoup-Crawlingの動作
-
Uncaught ReferenceError: は定義されていません。
-
java.sql.SQLException: 結果セットの開始前
-
JNIエンカウンターエラー:構造体またはユニオンではない何かでメンバー 'FindClass' のリクエスト
-
Java基礎 - マッピングとQ/A
-
java 365*1000*60*60*24 計算問題
-
CAS 5.1.8でhttpをサポートし、認証されていない認可サービスエラーのプロンプトが表示される問題を解決した。