DockerおよびJavaソケット:コンテナー間でデータを共有する
サーバーがクライアントにファイルを送信するクライアントサーバーサービスをコーディングしています。
次の例では、ファイル名のリストをクライアントに送信しようとしました。
サーバ
serverSocket = new ServerSocket(4000);
connsock = serverSocket.accept();
objectOutput = new ObjectOutputStream(connsock.getOutputStream());
List<String> file_names = new ArrayList<String>();
File[] files = new File("C:\\ServerMusicStorage").listFiles();
for (File file : files) {
if (file.isFile()) {
file_names.add(file.getName());
}
}
objectOutput.writeObject(file_names);
objectOutput.flush();
クライアント
newclientSocket = new Socket("localhost", 4000);
objectInput1 = new ObjectInputStream(newclientSocket.getInputStream());
System.out.println("<---Available files--->");
// get list of files from server
Object file_names = objectInput1.readObject();
file_list = (ArrayList<String>) file_names;
int count = 1;
for (int i = 0; i < file_list.size(); i++) {
System.out.println(count + ")" + file_list.get(i));
count++;
}
したがって、Java NetBeans IDEでプログラムを実行すると、希望どおりに動作します。ファイルを取得します
<---Available files--->
1)blank.wav
2)fuark.wav
Docker接続用に、次のネットワークを作成しました
docker network create client_server_network
私はサーバーを実行します
docker run --env SERVER_HOST_ENV=server --network-alias server --network client_server_network -it server
とクライアント
docker run --network client_server_network -it clientimage
Dockerコンテナーを介したクライアント/サーバー接続は成功しますが、両方のサービスを実行すると、出力が得られません。
<---Available files--->
私はこれで何日も立ち往生しています。何が悪いのでしょうか?その他の情報を提供する必要がある場合は、教えてください。
Dockerのサーバー側のPSサーバーイメージをホストとして設定しましたnewclientSocket = new Socket("server", 4000)
回答
コンテナには、ホストファイルシステムとは異なる独自のファイルシステムがあります。C:\ServerMusicStorage
このファイルがコンテナ内にないため、パスはコンテナ内で機能しません。
バインドまたはボリュームを確認する必要があります
または、イメージの作成時にファイルをコピーします。
また、パスはWindowsパスであるため、ほとんどのDockerイメージはLinuxシステムであるため、UNIXパス(/ yourdirectory)に変更する必要があります。
DockerFileでCOPYを使用する場合は、次を追加するだけです。
COPY ServerMusicStorage/ /ServerMusicStorage
しかし、私が間違っていない場合、srcファイルは相対パスである必要があります...に関連しているので、ビルドディレクトリの近くに/ ServerMusicStorageを配置する必要があります