This example uses Tokio
, a popular Rust asynchronous runtime.
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-rust1.75-tokio/
directory:
git clone https://github.com/kraftcloud/examples
cd examples/http-rust1.75-tokio/
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 .
The output shows the instance URL and other details:
[ ● ] Deployed successfully!
├ ────────── name : http-rust175-tokio-6gxsp
├ ────────── uuid : d5719f64-0653-42d7-b2de-aa6dee0ce467
├ ───────── state : running
├ ─────────── url : https://empty-dawn-3coedrce.fra0.kraft.host
├ ───────── image : http-rust175-tokio@sha256:0ce75912711aa2329232a2ca6c3ccb7a244b6d546fafc081f815c2fde8224856
├ ───── boot time : 21.41 ms
├ ─────── service : empty-dawn-3coedrce
├ ── private fqdn : http-rust175-tokio-6gxsp.internal
├ ──── private ip : 172.16.6.3
└ ────────── args : /server
In this case, the instance name is http-rust175-tokio-6gxsp
and the URL is `https://empty-dawn-3coedrce.fra0.kraft.host .
They are different for each run.
Use curl
to query the Unikraft Cloud instance of the Tokio-based HTTP web server:
curl https://empty-dawn-3coedrce.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-rust175-tokio-6gxsp empty-dawn-3coedrce.fra0... running 1 minute ago http-rust175-tokio@sha256:0ce75912711aa2329232a2ca6c3ccb7a244b6d546fafc08... 128 MiB /server 21412us
When done, you can remove the instance:
kraft cloud instance remove http-rust175-tokio-6gxsp
Customize your Application
To customize the application, update the files in the repository, listed below:
src/main.rs
: the actual server
Cargo.toml
: the Cargo package manager configuration file
Kraftfile
: the Unikraft Cloud specification
Dockerfile
: the Docker-specified application filesystem
use std :: net :: SocketAddr;
use tokio :: net :: TcpListener;
use tokio :: io :: {AsyncReadExt, AsyncWriteExt};
async fn main () -> Result<(), Box< dyn std :: error :: Error>> {
let addr = SocketAddr :: from (([ 0 , 0 , 0 , 0 ], 8080 ));
let listener = TcpListener :: bind ( & addr ) . await ? ;
println! ( " Listening on: http://{} " , addr );
let ( mut stream , _ ) = listener . accept () . await ? ;
tokio :: spawn ( async move {
let mut buffer = [ 0 ; 1024 ];
let _ = stream . read ( & mut buffer ) . await ;
let contents = " Hello, World! \r\n " ;
let content_length = contents . len ();
let response = format! ( " HTTP/1.1 200 OK \r\n Content-Length: {content_length} \r\n\r\n {contents} " );
let _ = stream . write_all ( response . as_bytes ()) . await ;
tokio = { version = " 1 " , features = [ " rt-multi-thread " , " net " , " time " , " macros " , " io-util " ] }
FROM rust:1.75.0-bookworm AS build
COPY ./Cargo.toml /src/Cargo.toml
COPY --from=build src/target/debug/http-tokio /server
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/libm.so.6 /lib/x86_64-linux-gnu/libm.so.6
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
The following options are available for customizing the application:
If only updating the implementation in the src/main.rs
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 new Rust source code files are added, be sure to configure required dependencies in the Cargo.toml
file.
If a new executable is built, update the cmd
line in the Kraftfile
and replace /server
with the path to the new executable.
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 .