In this guide we create and deploy a simple Java-based HTTP web server.
To run this example, follow these steps:
Install the kraft
CLI tool and a container runtime engine, e.g. Docker.
Clone the examples
repository and cd
into the examples/http-java17/
directory:
git clone https://github.com/kraftcloud/examples
Make sure to log into Unikraft Cloud by setting your token and a metro close to you.
We use fra0
(Frankfurt, 🇩🇪) in this guide:
# Set Unikraft Cloud access token
# Set metro to Frankfurt, DE
When done, invoke the following command to deploy this application on Unikraft Cloud:
kraft cloud deploy -p 443:8080 -M 512 .
The output shows the instance URL and other details:
[ ● ] Deployed successfully!
├ ────────── name : http-java17-xx739
├ ────────── uuid : 15346dbe-6c6e-461a-a998-e6fc9bfa6d89
├ ───────── state : running
├ ─────────── url : https://bold-voice-irwjijr5.fra0.kraft.host
├ ───────── image : http-java17@sha256:554deac043859fc0eb4f8aeebe2daeb76c5d30960157a00746b9fb7b177ef0ca
├ ───── boot time : 157.15 ms
├ ──────── memory : 1024 MiB
├ ─────── service : bold-voice-irwjijr5
├ ── private fqdn : http-java17-xx739.internal
├ ──── private ip : 172.16.28.2
└ ────────── args : /usr/lib/jvm/java-17-openjdk-amd64/bin/java -classpath /usr/src/ SimpleHttpServer
In this case, the instance name is http-java17-xx739
and the URL is https://bold-voice-irwjijr5.fra0.kraft.host
.
They are different for each run.
Use curl
to query the Unikraft Cloud instance of the Java-based HTTP web server:
curl https://bold-voice-irwjijr5.fra0.kraft.host
At any point in time, you can list information about the instance:
kraft cloud instance list
NAME FQDN STATE CREATED AT IMAGE MEMORY ARGS BOOT TIME
http-java17-k7eca holy-waterfall-p6yu0q7s.fra0.kraft.host running 1 minute ago http-java17@sha256:6f4cb7632ecbab952feb072e37a1a9... 1.0 GiB /usr/lib/jvm/java-17-openjdk... 157154us
When done, you can remove the instance:
kraft cloud instance remove http-java17-xx739
Customize your Application
To customize the application, update the files in the repository, listed below:
SimpleHttpServer.java
: the actual Java HTTP server
Kraftfile
: the Unikraft Cloud specification
Dockerfile
: the Docker-specified application filesystem
import com.sun.net.httpserver.HttpContext ;
import com.sun.net.httpserver.HttpExchange ;
import com.sun.net.httpserver.HttpServer ;
import java.io.IOException ;
import java.io.OutputStream ;
import java.net.InetSocketAddress ;
public class SimpleHttpServer {
private static final int listenPort = 8080 ;
public static void main ( String [] args ) throws IOException {
HttpServer server = HttpServer . create ( new InetSocketAddress ( listenPort ) , 0 ) ;
HttpContext context = server . createContext ( " / " ) ;
context . setHandler ( SimpleHttpServer :: handleRequest ) ;
System . out . println ( " Waiting for HTTP connections on port " + listenPort + " ... " ) ;
private static void handleRequest ( HttpExchange exchange ) throws IOException {
String response = " Hello, World! \n " ;
exchange . sendResponseHeaders ( 200 , response . getBytes () . length ) ; // response code and length
OutputStream os = exchange . getResponseBody () ;
os . write ( response . getBytes ()) ;
cmd : [ " /usr/lib/jvm/java-17-openjdk-amd64/bin/java " , " -classpath " , " /usr/src/ " , " SimpleHttpServer " ]
FROM --platform=linux/x86_64 debian:bookworm AS build
apt -yqq install default-jre ; \
apt -yqq install default-jdk \
RUN ldconfig /usr/lib/jvm/java-17-openjdk-amd64/lib/
COPY ./SimpleHttpServer.java /src/SimpleHttpServer.java
RUN javac SimpleHttpServer.java
COPY --from=build /lib/x86_64-linux-gnu/libc.so.6 /lib/x86_64-linux-gnu/libc.so.6
COPY --from=build /lib/x86_64-linux-gnu/libstdc++.so.6 /lib/x86_64-linux-gnu/libstdc++.so.6
COPY --from=build /lib/x86_64-linux-gnu/libm.so.6 /lib/x86_64-linux-gnu/libm.so.6
COPY --from=build /usr/lib/x86_64-linux-gnu/libz.so.1 /usr/lib/x86_64-linux-gnu/libz.so.1
COPY --from=build /lib/x86_64-linux-gnu/libgcc_s.so.1 /lib/x86_64-linux-gnu/libgcc_s.so.1
COPY --from=build /lib64/ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.2
COPY --from=build /etc/ld.so.cache /etc/ld.so.cache
COPY --from=build /usr/lib/jvm/java-17-openjdk-amd64/ /usr/lib/jvm/java-17-openjdk-amd64/
COPY --from=build /etc/java-17-openjdk/security/ /etc/java-17-openjdk/security/
COPY --from=build /src/SimpleHttpServer.class /usr/src/SimpleHttpServer.class
Lines in the Kraftfile
have the following roles:
spec: v0.6
: The current Kraftfile
specification version is 0.6
.
runtime: java:latest
: The Unikraft runtime kernel to use is Java.
rootfs: ./Dockerfile
: Build the application root filesystem using the Dockerfile
.
cmd:
: Use as the starting command of the instance.
Lines in the Dockerfile
have the following roles:
FROM scratch
: Build the filesystem from the scratch
container image , to create a base image .
COPY ./SimpleHttpServer.java /src/SimpleHttpServer.java
: Copy the server implementation file in the Docker filesystem.
RUN javac SimpleHttpServer.java
: Compifile the Java source file.
The following options are available for customizing the application:
If only updating the implementation in the SimpleHttpServer.java
source file, no other change is required.
If new files are added, these have to be copied in the application filesystem, using the COPY
command in the Dockerfile
.
If a new Java source files is added, update the cmd
line in the Kraftfile
and replace SimpleHttpServer.java
to run that file when creating the instance.
More extensive changes may require expanding the Dockerfile
with additional Dockerfile
commands .
Learn More
Use the --help
option for detailed information on using Unikraft Cloud:
Or visit the CLI Reference .