footloose is a developer tool creating containers that look like virtual
machines. Those containers run systemd as PID 1 and a ssh daemon that can
be used to login into the container. Such "machines" behave very much like a
VM, it's even possible to run dockerd in them :)
footloose can be used for a variety of tasks, wherever you'd like virtual
machines but don't want to wait for them to boot or need many of them. An
easy way to think about it is: Vagrant, but
with containers.
footloose in action:
footloose binaries can be downloaded from the release page:
# For Linux
curl -Lo footloose https://github.com/weaveworks/footloose/releases/download/0.2.0/footloose-0.2.0-linux-x86_64
chmod +x footloose
sudo mv footloose /usr/local/bin/
# For macOS
curl -Lo footloose https://github.com/weaveworks/footloose/releases/download/0.2.0/footloose-0.2.0-darwin-x86_64
chmod +x footloose
sudo mv footloose /usr/local/bin/Alternatively, build and install footloose from sources. It requires having
go >= 1.11 installed:
GO111MODULE=on go get github.com/weaveworks/footloosefootloose reads a description of the Cluster of Machines to create from a
file, by default named Footloose. The config command helps with creating the
initial config file:
# Create a Footloose config file. Instruct we want to create 3 machines instead
# of the default, 1.
footloose config create --replicas 3Start the cluster of 3 machines:
$ footloose create
INFO[0000] Pulling image: quay.io/footloose/centos7 ...
INFO[0007] Creating machine: cluster-node0 ...
INFO[0008] Creating machine: cluster-node1 ...
INFO[0008] Creating machine: cluster-node2 ...It only takes a second to create those machines. The first time
createruns, it will pull the docker image used by thefootloosecontainers so it will take a tiny bit longer.
SSH into a machine with:
$ footloose ssh root@node1
[root@1665288855f6 ~]# ps fx
PID TTY STAT TIME COMMAND
1 ? Ss 0:00 /sbin/init
23 ? Ss 0:00 /usr/lib/systemd/systemd-journald
58 ? Ss 0:00 /usr/sbin/sshd -D
59 ? Ss 0:00 \_ sshd: root@pts/1
63 pts/1 Ss 0:00 \_ -bash
82 pts/1 R+ 0:00 \_ ps fx
62 ? Ss 0:00 /usr/lib/systemd/systemd-logindfootloose will default to running a centos 7 container image. The --image
argument of config create can be used to configure the OS image. Valid OS
images are:
quay.io/footloose/centos7quay.io/footloose/fedora29quay.io/footloose/ubuntu18.04quay.io/footloose/amazonlinux2
For example:
footloose config create --replicas 3 --image quay.io/footloose/fedora29footloose config create creates a footloose.yaml configuration file that is then
used by subsequent commands such as create, delete or ssh. If desired,
the configuration file can be named differently and supplied with the
-c, --config option.
$ footloose config create --replicas 3
$ cat footloose.yaml
cluster:
name: cluster
privateKey: cluster-key
machines:
- count: 3
spec:
image: quay.io/footloose/centos7
name: node%d
portMappings:
- containerPort: 22This configuration can naturally be edited by hand. The full list of available parameters are in the reference documentation.
Interesting things can be done with footloose!
It is possible to create docker images that specialize a footloose base
image to
suit your needs.
For instance, if we want the created machines to run fedora29 with the
htop package already pre-installed:
FROM quay.io/footloose/fedora29
# Pre-seed the htop package
RUN dnf -y install htop && dnf clean all
Build that image:
docker build -t fedora29-htop .Configure footloose.yaml to use that image by either editing the file or running:
footloose config create --image fedora29-htophtop will be available on the newly created machines!
$ footloose create
$ footloose ssh root@node0
# htopTo run dockerd inside a docker container, two things are needed:
- Run the container as privileged (we could probably do better! expose capabilities instead!).
- Mount
/var/lib/dockeras volume, here an anonymous volume. This is because of a limitations of what you can do with the overlay systems docker is setup to use.
cluster:
name: cluster
privateKey: cluster-key
machines:
- count: 1
spec:
image: quay.io/footloose/centos7
name: node%d
portMappings:
- containerPort: 22
privileged: true
volumes:
- type: volume
destination: /var/lib/dockerYou can then install and run docker on the machine:
$ footloose create
$ footloose ssh root@node0
# yum install -y docker iptables
[...]
# systemctl start docker
# docker run busybox echo 'Hello, World!'
Hello, World!Under the hood, Container Machines are just containers. They can be
inspected with docker:
$ docker ps
CONTAINER ID IMAGE COMMAND NAMES
04c27967f76e quay.io/footloose/centos7 "/sbin/init" cluster-node2
1665288855f6 quay.io/footloose/centos7 "/sbin/init" cluster-node1
5134f80b733e quay.io/footloose/centos7 "/sbin/init" cluster-node0The container names are derived from cluster.name and
cluster.machines[].name.
They run systemd as PID 1, it's even possible to inspect the boot messages:
$ docker logs cluster-node1
systemd 219 running in system mode.
Detected virtualization docker.
Detected architecture x86-64.
Welcome to CentOS Linux 7 (Core)!
Set hostname to <1665288855f6>.
Initializing machine ID from random generator.
Failed to install release agent, ignoring: File exists
[ OK ] Created slice Root Slice.
[ OK ] Created slice System Slice.
[ OK ] Reached target Slices.
[ OK ] Listening on Journal Socket.
[ OK ] Reached target Local File Systems.
Starting Create Volatile Files and Directories...
[ OK ] Listening on Delayed Shutdown Socket.
[ OK ] Reached target Swap.
[ OK ] Reached target Paths.
Starting Journal Service...
[ OK ] Started Create Volatile Files and Directories.
[ OK ] Started Journal Service.
[ OK ] Reached target System Initialization.
[ OK ] Started Daily Cleanup of Temporary Directories.
[ OK ] Reached target Timers.
[ OK ] Listening on D-Bus System Message Bus Socket.
[ OK ] Reached target Sockets.
[ OK ] Reached target Basic System.
Starting OpenSSH Server Key Generation...
Starting Cleanup of Temporary Directories...
[ OK ] Started Cleanup of Temporary Directories.
[ OK ] Started OpenSSH Server Key Generation.
Starting OpenSSH server daemon...
[ OK ] Started OpenSSH server daemon.
[ OK ] Reached target Multi-User System.