This example uses Rocket
, a popular Rust web framework.
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-rocket0.5/
directory:
git clone https://github.com/kraftcloud/examples
cd examples/http-rust1.75-rocket0.5
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-rocket05-tuwq3
β ββββββββββ uuid : b6fe13e4-93b7-402b-bdec-1bc4d81bc275
β βββββββββ state : running
β βββββββββββ url : https://empty-bobo-n3htmpye.fra0.kraft.host
β βββββββββ image : http-rust175-rocket05@sha256:23a7a6e155758e6e8f75e9570f0aec5fb744f08c1bad2454d7386367c5ea45d6
β βββββ boot time : 17.41 ms
β ββββββββ memory : 128 MiB
β βββββββ service : empty-bobo-n3htmpye
β ββ private fqdn : http-rust175-rocket05-tuwq3.internal
β ββββ private ip : 172.16.6.6
β ββββββββββ args : /server
In this case, the instance name is http-rust175-rocket05-tuwq3
and the URL is https://empty-bobo-n3htmpye.fra0.kraft.host
.
They are different for each run.
Use curl
to query any of the Rocket serverβs paths, for example:
curl https://empty-bobo-n3htmpye.fra0.kraft.host/wave/Rocketeer/100
π Hello, 100 year old named Rocketeer!
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-rocket05-tuwq3 empty-bobo-n3htmpye.fra0.k... running 1 minute ago http-rust175-rocket05@sha256:23a7a6e155758e6e8f75e9570f0aec5fb744... 128 MiB /server 17412us
When done, you can remove the instance:
kraft cloud instance remove http-rust175-rocket05-tuwq3
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
#[macro_use] extern crate rocket;
// http://127.0.0.1:8000/hello/world
fn world () -> & 'static str {
// http://127.0.0.1:8000/hello/ΠΌΠΈΡ
fn mir () -> & 'static str {
// http://127.0.0.1:8000/wave/Rocketeer/100
fn wave ( name : & str, age : u8) -> String {
format! ( " π Hello, {} year old named {}! " , age , name )
// Note: without the `..` in `opt..`, we'd need to pass `opt.emoji`, `opt.name`.
// http://127.0.0.1:8000/?emoji
// http://127.0.0.1:8000/?name=Rocketeer
// http://127.0.0.1:8000/?lang=ΡΡ
// http://127.0.0.1:8000/?lang=ΡΡ&emoji
// http://127.0.0.1:8000/?emoji&lang=en
// http://127.0.0.1:8000/?name=Rocketeer&lang=en
// http://127.0.0.1:8000/?emoji&name=Rocketeer
// http://127.0.0.1:8000/?name=Rocketeer&lang=en&emoji
// http://127.0.0.1:8000/?lang=ru&emoji&name=Rocketeer
#[get( " /?<lang>&<opt..> " )]
fn hello ( lang : Option<Lang>, opt : Options<'_>) -> String {
let mut greeting = String :: new ();
greeting . push_str ( " π " );
Some(Lang :: Russian) => greeting . push_str ( " ΠΡΠΈΠ²Π΅Ρ " ),
Some(Lang :: English) => greeting . push_str ( " Hello " ),
None => greeting . push_str ( " Hi " ),
if let Some( name ) = opt . name {
. mount ( " / " , routes! [ hello ])
. mount ( " /hello " , routes! [ world , mir ])
. mount ( " /wave " , routes! [ wave ])
FROM rust:1.75.0-bookworm AS build
RUN cargo build --release
COPY ./Rocket.toml /Rocket.toml
COPY --from=build /app/target/release/hello /server
COPY --from=build /lib/x86_64-linux-gnu/libc.so.6 /lib/x86_64-linux-gnu/
COPY --from=build /lib/x86_64-linux-gnu/libm.so.6 /lib/x86_64-linux-gnu/
COPY --from=build /lib/x86_64-linux-gnu/libgcc_s.so.1 /lib/x86_64-linux-gnu/
COPY --from=build /lib64/ld-linux-x86-64.so.2 /lib64/
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 .