runC and libcontainer on Fedora 23/24
In this post, I will post my notes on how I got runC and then using libcontainer on Fedora. The first step is to install golang:
$ sudo dnf -y install golang $ go version go version go1.6 linux/amd64
We will set GOPATH=~/golang/ and then do the following:
$ mkdir -p ~/golang/github.com/opencontainers $ cd ~/golang/github.com/opencontainers $ git clone https://github.com/opencontainers/runc.git $ cd runc $ sudo dnf -y install libseccomp-devel $ make $ sudo make install
At this stage, runc should be installed and ready to use:
$ runc --version runc version 0.0.9 commit: 89ab7f2ccc1e45ddf6485eaa802c35dcf321dfc8 spec: 0.5.0-dev
Now we need a rootfs that we will use for our container, we will use the "busybox" docker image - pull it and export a tar archive:
$ sudo dnf -y install docker $ sudo systemctl start docker $ docker pull busybox $ sudo docker export $(sudo docker create busybox) > busybox.tar $ mkdir ~/rootfs $ tar -C ~/rootfs -xf busybox.tar
Now that we have a rootfs, we have one final step - generate the spec for our container:
$ runc spec
This will generate a config.json (config) file and then we can start a container using the rootfs above: (runC expects to find config.json and rootfs in the same directory as you are going to start the container from)
# for some reason, i have to pass the absolute path to runc when using sudo # UPDATE: (Thanks to Dharmit for pointingme to: http://unix.stackexchange.com/questions/91541/why-is-path-reset-in-a-sudo-command/91556#91556) $ sudo /usr/local/bin/runc start test # test is the "container-id" / # ps PID USER TIME COMMAND 1 root 0:00 sh 8 root 0:00 ps /# exit
Getting started with libcontainer
runC is built upon libcontainer. This means that wcan write our own Golang programs which will start a container and do stuff in it. An example program is available here (thanks to the fine folks on #opencontainers on Freenode for helpful pointers). It starts a container using the above rootfs, runs ps in it and exits.
Once you have saved it somewhere on your go path, we will first need to get all the dependent packages:
$ # My program is in the below directory $ cd ~/golang/src/github.com/amitsaha/libcontainer_examples $ go get $ sudo GOPATH=/home/asaha/golang go run example1.go /home/asaha/rootfs/ [sudo] password for asaha: PID USER TIME COMMAND 1 root 0:00 ps
(Thanks Dharmit for all the suggestions)