├─java-api
│ └─apps
sample-api.java
compose.yaml
services:
java-api:
# Java 21 の実行環境(JRE)の公式イメージ
image: eclipse-temurin:21-jdk
container_name: my-java-api
ports:
- "9090:8080" # [手元のPCのポート] : [JAR内のアプリが待ち受けるポート]
volumes:
# 手元の apps フォルダを、コンテナ内の /app フォルダにマウント
- ./apps:/app
working_dir: /app
# コンテナが起動したときに実行するコマンド(JARを起動する)
#command: java -jar sample-api.jar
# Java21の機能で、ソースコードをダイレクトに実行!
command: java sample-api.java
restart: always
import com.sun.net.httpserver.HttpServer;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpExchange;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;
public class SampleApi {
public static void main(String[] args) throws IOException {
// すべてのIP(0.0.0.0)からのアクセスを8080ポートで待ち受け
HttpServer server = HttpServer.create(new InetSocketAddress("0.0.0.0", 8080), 0);
server.createContext("/sample-api", new HttpHandler() {
@Override
public void handle(HttpExchange exchange) throws IOException {
// 1. アクセスしてきた相手のIPアドレスを取得
String remoteAddress = exchange.getRemoteAddress().toString();
// 2. 現在時刻
String now = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
// 3. レスポンス文字列の組み立て(診断レポート風)
StringBuilder sb = new StringBuilder();
sb.append("=========================================\n");
sb.append(" CONNECTION TEST: SUCCESS !! \n");
sb.append("=========================================\n");
sb.append("Time: ").append(now).append("\n");
sb.append("Your Remote IP: ").append(remoteAddress).append("\n");
sb.append("Request Method: ").append(exchange.getRequestMethod()).append("\n");
sb.append("-----------------------------------------\n");
sb.append("Received HTTP Headers:\n");
// 4. 受け取ったリクエストヘッダーをすべて列挙
for (Map.Entry<String, List<String>> header : exchange.getRequestHeaders().entrySet()) {
sb.append(" ").append(header.getKey()).append(": ").append(header.getValue()).append("\n");
}
sb.append("=========================================\n");
String response = sb.toString();
byte[] bytes = response.getBytes(StandardCharsets.UTF_8);
// ヘッダー設定(テキスト形式、UTF-8)
exchange.getResponseHeaders().set("Content-Type", "text/plain; charset=UTF-8");
exchange.sendResponseHeaders(200, bytes.length);
try (OutputStream os = exchange.getResponseBody()) {
os.write(bytes);
}
}
});
server.setExecutor(null);
System.out.println("Enhanced Connectivity Test Server started on port 8080");
server.start();
}
}
docker inspect redmine-61-redmine-1 --format '{{ index .Config.Labels "com.docker.compose.project.working_dir" }}'
docker-compose ls
docker-compose up -d
docker-compose down
docker-compose ps