私はいくつかのJavaデスクトップアプリケーションを作成し、Dockerを使用してコンテナを実行するとコンテナについて学ぶことができると思いました。
Ubuntuイメージを持つDockerコンテナにJavaアプリケーションを配置しました。その後、GUIが自分のコンピュータのI / Oを操作/アクセスするには、Dockerに私のDISPLAY変数へのアクセスを許可する必要があることに気づきました。接続すると、Dockerコンテナを実行し、コンピュータ画面にGUIポップアップが表示されます。
これが私が混乱し始めるところです。 VirtualBoxでデスクトップGUIを実行すると、仮想マシンのGUIを表示できます。その後、仮想マシンのI / OをローカルコンピュータのI / Oに接続するスマートデバイスがあります。これは私にとって意味があります。
しかし、DockerはどのようにGUIを物理コンピュータに戻すのですか?コンテナを実行すると(仮想ボックスなどの仮想マシンではなく)、物理コンピュータでGUIを表示できます。しかし、GUI自体はホスト上でどのようにレンダリングされますか?ホストとI / Oを共有するとき、DockerにGUIファイルをホストに再送信してGUIを表示する権限がありますか?それとも、Ubuntuイメージを使用してコンテナを作成するときに基本的に仮想マシンを作成しますか?
答え1
Linuxを使用している場合は、dockerに/ tmp / .X11-unixをマウントすると(起動コマンドのオプション:-v / tmp / .X11-unix:/ tmp / .X11-unix)、すべてのGUIタイプを表示できます。 、他のオプションはありません。このファイルをdockerと共有すると、あらゆる種類のGUIが許可されます。
これを回避するには、通常のLinuxユーザーとしてxhost +コマンドを入力してからDockerからエクスポートDISPLAY = IP:0.0を使用できます(または必要なものはすべてありますが、ローカルでもIPは127.0.0.1にはできません)。 。
xhost +では、すべてのホストを許可し、DISPLAYをエクスポートして、「リモート」システムでディスプレイを共有できます。
Windowsローカルホストでdockerを実行すると、デフォルトですべてのポートが開いていますが、WindowsデスクトップにUbuntuを表示するには特定のXserverが必要です(VcXsrvはVisual C ++ 2012でコンパイルされた特定のX Serverなので友達です)。エクスポートはGUIを起動する前にDISPLAY = IP:0.0を発行する必要があります。