1
0
Fork 0
mirror of https://github.com/containers/youki synced 2024-05-20 14:36:17 +02:00
youki/README.md

131 lines
5.1 KiB
Markdown
Raw Normal View History

2021-05-16 09:47:06 +02:00
# youki: A container runtime in Rust
2021-03-27 12:08:13 +01:00
2021-05-24 06:40:50 +02:00
<img src="docs/youki.png" width="230" height="230">
2021-03-27 12:08:13 +01:00
youki is an implementation of [runtime-spec](https://github.com/opencontainers/runtime-spec) in Rust, referring to [runc](https://github.com/opencontainers/runc).
2021-05-22 10:47:21 +02:00
# About the name
youki is pronounced as /joʊki/ or yoh-key.
2021-05-22 10:20:22 +02:00
youki is named after a Japanese word 'youki', which means 'a container'. In Japanese language, youki also means 'cheerful', 'merry', or 'hilarious'.
2021-03-27 12:08:13 +01:00
2021-05-16 11:24:30 +02:00
# Motivation
2021-05-18 16:30:11 +02:00
Here is why I am rewriting a new container runtime in Rust.
- Rust is one of the best languages to implement oci-runtime. Many container tools are written in Go. It's all very nice products. However, the container runtime requires the use of system calls, which requires a bit of special handling when implemented in Go. This is too tricky(e.g. _namespaces(7)_, _fork(2)_); with Rust, it's not that tricky and you can use system calls. Also, unlike C, Rust provides the benefit of memory management. Rust is not yet a major player in the container field, and Rust has the potential to contribute more to this field. I hope to be one of the examples of how Rust can be used in this field.
- youki has the potential to be faster and use less memory than runc. This means that it can work in environments with tight memory usage. I don't have any benchmarks, etc., as it is not yet fully operational, but I expect that it will probably perform better when implemented in Rust. In fact, [crun](https://github.com/containers/crun#performance), a container runtime implemented in C, is quite high performance. For example, it may be possible to experiment with asynchronous processing using async/await in some parts.
2021-05-16 11:24:30 +02:00
- The development of [railcar](https://github.com/oracle/railcar) has been suspended. This project was very nice but is no longer being developed. This project is inspired by it.
2021-05-18 16:30:11 +02:00
- I have fun implementing this. In fact, this may be the most important.
2021-05-16 11:24:30 +02:00
2021-05-16 12:38:33 +02:00
# Status of youki
2021-05-18 16:30:11 +02:00
youki is not at the practical stage yet. However, it is getting closer to practical use, running with docker and passing all the default tests provided by [opencontainers/runtime-tools](https://github.com/opencontainers/runtime-tools).
2021-05-16 12:38:33 +02:00
![youki demo](docs/demo.gif)
2021-03-29 17:23:45 +02:00
2021-05-16 12:38:33 +02:00
# Getting Started
2021-05-18 16:30:11 +02:00
2021-05-16 12:38:33 +02:00
Local build is only supported on linux.
For other platforms, please use the devcontainer that we prepared.
2021-05-18 16:30:11 +02:00
2021-05-16 12:38:33 +02:00
## Requires
2021-05-18 16:30:11 +02:00
2021-03-29 17:23:45 +02:00
- Rust(See [here](https://www.rust-lang.org/tools/install))
- Docker(See [here](https://docs.docker.com/engine/install))
2021-03-29 17:23:45 +02:00
2021-05-16 12:38:33 +02:00
## Building
```sh
$ cargo install cargo-when # installs prerequisite for building youki
```
2021-03-29 17:23:45 +02:00
```sh
$ git clone git@github.com:containers/youki.git
2021-05-16 12:38:33 +02:00
$ cd youki
2021-05-30 11:30:40 +02:00
$ ./build.sh
$ ./youki -h # you can get information about youki command
2021-05-30 11:30:40 +02:00
```
## Tutorial
Let's try to run a container that executes `sleep 5` using youki.
Maybe this tutorial is need permission as root.
```sh
$ git clone git@github.com:containers/youki.git
2021-05-30 11:30:40 +02:00
$ cd youki
$ ./build.sh
$ mkdir tutorial
$ cd tutorial
$ mkdir rootfs
$ docker export $(docker create busybox) | tar -C rootfs -xvf -
```
Prepare a configuration file for the container that will run `sleep 5`.
```sh
2021-05-30 11:30:40 +02:00
$ curl https://gist.githubusercontent.com/utam0k/8ab419996633066eaf53ac9c66d962e7/raw/e81548f591f26ec03d85ce38b0443144573b4cf6/config.json -o config.json
$ cd ../
$ ./youki create -b tutorial tutorial_container
$ ./youki state tutorial_container # You can see the state the container is in as it is being generate.
2021-05-30 11:30:40 +02:00
$ ./youki start tutorial_container
$ ./youki state tutorial_container # Run it within 5 seconds to see the running container.
$ ./youki delete tutorial_container # Run it after the container is finished running.
2021-03-29 17:23:45 +02:00
```
2021-05-30 12:36:38 +02:00
Change the command to be executed in config.json and try something other than `sleep 5`.
2021-05-16 12:38:33 +02:00
## Usage
2021-05-18 16:30:11 +02:00
2021-05-16 12:38:33 +02:00
Starting the docker daemon.
2021-05-18 16:30:11 +02:00
2021-03-28 12:31:01 +02:00
```
2021-05-16 12:38:33 +02:00
$ dockerd --experimental --add-runtime="youki=$(pwd)/target/x86_64-unknown-linux-gnu/debug/youki"
2021-03-27 12:08:13 +01:00
```
2021-05-16 12:38:33 +02:00
You can use youki in a different terminal to start the container.
2021-05-18 16:30:11 +02:00
2021-03-27 12:08:13 +01:00
```
2021-05-16 12:38:33 +02:00
$ docker run -it --rm --runtime youki busybox
2021-03-27 12:08:13 +01:00
```
2021-05-16 12:38:33 +02:00
### Integration test
2021-05-18 16:30:11 +02:00
Go and node-tap are required to run integration test. See the [opencontainers/runtime-tools]((https://github.com/opencontainers/runtime-tools) README for details.
```
$ git submodule update --init --recursive
$ ./integration_test.sh
```
2021-03-27 12:08:13 +01:00
2021-06-03 12:28:31 +02:00
# Community
We also have an active [Discord](https://discord.gg/h7R3HgWUct) if you'd like to come and chat with us.
2021-05-16 12:38:33 +02:00
# Design and implementation of youki
2021-05-18 16:30:11 +02:00
TBD(WIP on [#14](https://github.com/containers/youki/issues/14))
2021-03-27 12:08:13 +01:00
2021-03-29 17:23:45 +02:00
# Features
2021-05-18 16:30:11 +02:00
2021-03-27 12:08:13 +01:00
- [x] run with docker
- [ ] run with podman
2021-05-16 12:38:33 +02:00
- [x] pivot root
- [x] mount devices
- [x] namespaces
2021-04-18 12:43:07 +02:00
- [x] capabilities
2021-05-16 12:38:33 +02:00
- [x] rlimits
- [ ] cgroups v1(WIP on [#9](https://github.com/containers/youki/issues/9))
- [ ] cgroups v2
- [ ] seccomp
- [ ] hooks(WIP on [#13](https://github.com/containers/youki/issues/13))
- [ ] rootless
2021-03-27 12:08:13 +01:00
2021-03-29 17:23:45 +02:00
# Contribution
2021-05-18 16:30:11 +02:00
2021-03-27 12:08:13 +01:00
This project welcomes your PR and issues.
For example, refactoring, adding features, correcting English, etc.
2021-03-28 14:14:12 +02:00
If you need any help, you can contact me on [Twitter](https://twitter.com/utam0k).
2021-05-30 12:36:38 +02:00
Thanks to all the people who already contributed!
<a href="https://github.com/containers/youki/graphs/contributors">
<img src="https://contributors-img.web.app/image?repo=containers/youki" />
</a>