runc/nsinit
Mrunal Patel ec4b6e0bc3 nsinit: Add a flag to enable system support for cgroups
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
2015-04-13 15:01:48 -04:00
..
Makefile nsinit: Add Makefile 2014-12-16 09:18:48 +03:00
README.md Add documentation for nsinit 2015-04-08 09:27:26 +08:00
config.go mount: Take out the base mounts and move them to the config. 2015-03-17 14:03:28 -04:00
exec.go nsinit: Add a flag to enable system support for cgroups 2015-04-13 15:01:48 -04:00
init.go Move childPipe to the end of FD set 2015-04-08 14:14:51 -07:00
main.go Change nsinit root to /var/run/nsinit 2015-04-03 10:45:01 -07:00
oom.go Fix compilation with golang 1.3(uid/gid mappings is unsupported) 2015-02-12 13:28:07 -08:00
pause.go Refactory container interface 2015-01-31 20:51:12 -08:00
state.go Implement nsinit state command 2015-02-11 18:49:28 -08:00
stats.go Implement nsinit state command 2015-02-11 18:49:28 -08:00
tty.go Move tty configuration to Process 2015-02-25 15:04:43 -08:00
utils.go nsinit: Add a flag to enable system support for cgroups 2015-04-13 15:01:48 -04:00

README.md

nsinit

nsinit is a cli application which demonstrates the use of libcontainer.
It is able to spawn new containers or join existing containers.

How to build?

First add the libcontainer/vendor into your GOPATH. It's because libcontainer vendors all its dependencies, so it can be built predictably.

export GOPATH=$GOPATH:/your/path/to/libcontainer/vendor

Then get into the nsinit folder and get the imported file. Use make command to make the nsinit binary.

cd libcontainer/nsinit
go get
make

We have finished compiling the nsinit package, but a root filesystem must be provided for use along with a container configuration file.

Choose a proper place to run your container. For example we use /busybox.

mkdir /busybox 
curl -sSL 'https://github.com/jpetazzo/docker-busybox/raw/buildroot-2014.11/rootfs.tar' | tar -xC /busybox

Then you may need to write a configuration file named container.json in the /busybox folder. Environment, networking, and different capabilities for the container are specified in this file. The configuration is used for each process executed inside the container.

See the sample_configs folder for examples of what the container configuration should look like.

cp libcontainer/sample_configs/minimal.json /busybox/container.json
cd /busybox

You can customize container.json per your needs. After that, nsinit is ready to work.

To execute /bin/bash in the current directory as a container just run the following as root:

nsinit exec --tty --config container.json /bin/bash

If you wish to spawn another process inside the container while your current bash session is running, run the same command again to get another bash shell (or change the command). If the original process (PID 1) dies, all other processes spawned inside the container will be killed and the namespace will be removed.

You can identify if a process is running in a container by looking to see if state.json is in the root of the directory.

You may also specify an alternate root directory from where the container.json file is read and where the state.json file will be saved.

How to use?

Currently nsinit has 9 commands. Type nsinit -h to list all of them. And for every alternative command, you can also use --help to get more detailed help documents. For example, nsinit config --help.

nsinit cli application is implemented using cli.go. Lots of details are handled in cli.go, so the implementation of nsinit itself is very clean and clear.

  • config It will generate a standard configuration file for a container. By default, it will generate as the template file in config.go. It will modify the template if you have specified some configuration by options.
  • exec Starts a container and execute a new command inside it. Besides common options, it has some special options as below.
    • --tty,-t: allocate a TTY to the container.
    • --config: you can specify a configuration file. By default, it will use template configuration.
    • --id: specify the ID for a container. By default, the id is "nsinit".
    • --user,-u: set the user, uid, and/or gid for the process. By default the value is "root".
    • --cwd: set the current working dir.
    • --env: set environment variables for the process.
  • init It's an internal command that is called inside the container's namespaces to initialize the namespace and exec the user's process. It should not be called externally.
  • oom Display oom notifications for a container, you should specify container id.
  • pause Pause the container's processes, you should specify container id. It will use cgroup freeze subsystem to help.
  • unpause Unpause the container's processes. Same with pause.
  • stats Display statistics for the container, it will mainly show cgroup and network statistics.
  • state Get the container's current state. You can also read the state from state.json in your container_id folder.
  • help, h Shows a list of commands or help for one command.