{"id":20256367,"url":"https://github.com/k0sproject/bootloose","last_synced_at":"2026-01-22T14:55:33.384Z","repository":{"id":192027363,"uuid":"685907274","full_name":"k0sproject/bootloose","owner":"k0sproject","description":"Manage containers that look like virtual machines","archived":false,"fork":false,"pushed_at":"2025-04-10T07:46:02.000Z","size":874,"stargazers_count":44,"open_issues_count":8,"forks_count":4,"subscribers_count":7,"default_branch":"main","last_synced_at":"2025-04-10T08:31:03.855Z","etag":null,"topics":["command-line-tool","container-images","containers","go","golang","virtual-machine"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/k0sproject.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-09-01T09:30:44.000Z","updated_at":"2025-04-10T07:24:30.000Z","dependencies_parsed_at":"2023-10-02T12:08:11.875Z","dependency_job_id":"407e0602-ee76-4fae-8485-bd02b2573983","html_url":"https://github.com/k0sproject/bootloose","commit_stats":{"total_commits":519,"total_committers":43,"mean_commits":"12.069767441860465","dds":0.7032755298651252,"last_synced_commit":"124c22f5c2d32e26d91995579ca184876d5a9195"},"previous_names":["k0sproject/footloose"],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/k0sproject%2Fbootloose","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/k0sproject%2Fbootloose/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/k0sproject%2Fbootloose/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/k0sproject%2Fbootloose/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/k0sproject","download_url":"https://codeload.github.com/k0sproject/bootloose/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248318928,"owners_count":21083751,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["command-line-tool","container-images","containers","go","golang","virtual-machine"],"created_at":"2024-11-14T10:46:27.760Z","updated_at":"2026-01-22T14:55:33.371Z","avatar_url":"https://github.com/k0sproject.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!--\nSPDX-FileCopyrightText: 2019 Weaveworks Ltd.\nSPDX-FileCopyrightText: 2023 bootloose authors\nSPDX-License-Identifier: Apache-2.0\n--\u003e\n[![Go](https://github.com/k0sproject/bootloose/actions/workflows/go.yaml/badge.svg)](https://github.com/k0sproject/bootloose/actions/workflows/go.yaml)\n[![Go Report Card](https://goreportcard.com/badge/github.com/k0sproject/bootloose)](https://goreportcard.com/report/github.com/k0sproject/bootloose)\n[![GoDoc](https://godoc.org/github.com/k0sproject/bootloose?status.svg)](https://godoc.org/github.com/k0sproject/bootloose)\n[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fk0sproject%2Fbootloose.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fk0sproject%2Fbootloose?ref=badge_shield)\n\n# bootloose\n\n`bootloose` creates containers that look like virtual machines. Those\ncontainers run `systemd` as PID 1 and a ssh daemon that can be used to login\ninto the container. Such \"machines\" behave very much like a VM, it's even\npossible to run [`dockerd` in them](./examples/docker-in-docker/).\n\n`bootloose` can be used for a variety of tasks, wherever you'd like virtual\nmachines but want fast boot times or need many of them. An easy way to think\nabout it is: [Vagrant](https://www.vagrantup.com/), but with containers.\n\n`bootloose` in action:\n\n```console\n$ bootloose config create --replicas 3\n$ bootloose create\nINFO[0000] Pulling image: quay.io/k0sproject/bootloose-ubuntu20.04 ...\nINFO[0007] Creating machine: cluster-node0 ...\nINFO[0008] Creating machine: cluster-node1 ...\nINFO[0008] Creating machine: cluster-node2 ...\n$ docker ps\nCONTAINER ID    IMAGE                                     COMMAND         NAMES\n04c27967f76e    quay.io/k0sproject/bootloose-ubuntu20.04  \"/sbin/init\"    cluster-node2\n1665288855f6    quay.io/k0sproject/bootloose-ubuntu20.04  \"/sbin/init\"    cluster-node1\n5134f80b733e    quay.io/k0sproject/bootloose-ubuntu20.04  \"/sbin/init\"    cluster-node0\n$ bootloose ssh root@node1\n[root@1665288855f6 ~]# █\n```\n\n## Attribution\n\nThis project is a continuation of [Footloose](https://github.com/weaveworks/footloose) by Weaveworks.\nWe are grateful for their work and contributions from the community.\n\n## Install\n\n### Homebrew\n\nInstall using [Homebrew](https://brew.sh/) package manager:\n\n```console\nbrew install k0sproject/tap/bootloose\n```\n\n### From source\n\nBuild and install `bootloose` from source. It requires having\n`go \u003e= 1.21` installed:\n\n```console\ngo install github.com/k0sproject/bootloose@latest\n```\n\n[gh-release]: https://github.com/k0sproject/bootloose/releases\n\n## Usage\n\n`bootloose` reads a description of the *Cluster* of *Machines* to create from a\nfile, by default named `bootloose.yaml`. An alternate name can be specified on\nthe command line with the `--config` option or through the `BOOTLOOSE_CONFIG`\nenvironment variable.\n\nThe `config` command helps with creating the initial config file:\n\n```console\n# Create a bootloose.yaml config file. Instruct we want to create 3 machines.\nbootloose config create --replicas 3\n```\n\nStart the cluster:\n\n```console\n$ bootloose create\nINFO[0000] Pulling image: quay.io/k0sproject/bootloose-debian12 ...\nINFO[0007] Creating machine: cluster-node0 ...\nINFO[0008] Creating machine: cluster-node1 ...\nINFO[0008] Creating machine: cluster-node2 ...\n```\n\n\u003e It only takes a second to create those machines. The first time `create`\nruns, it will pull the docker image used by the `bootloose` containers so it\nwill take a tiny bit longer.\n\nSSH into a machine with:\n\n```console\n$ bootloose ssh root@node1\n[root@1665288855f6 ~]# ps fx\n  PID TTY      STAT   TIME COMMAND\n    1 ?        Ss     0:00 /sbin/init\n   23 ?        Ss     0:00 /usr/lib/systemd/systemd-journald\n   58 ?        Ss     0:00 /usr/sbin/sshd -D\n   59 ?        Ss     0:00  \\_ sshd: root@pts/1\n   63 pts/1    Ss     0:00      \\_ -bash\n   82 pts/1    R+     0:00          \\_ ps fx\n   62 ?        Ss     0:00 /usr/lib/systemd/systemd-logind\n```\n\n## Choosing the OS image to run\n\n`bootloose` will default to running an Ubuntu LTS container image. The `--image`\nargument of `config create` can be used to configure the OS image. OS\nimages provided by this repository are:\n\n- `quay.io/k0sproject/bootloose-alpine3.19`\n- `quay.io/k0sproject/bootloose-alpine3.22`\n- `quay.io/k0sproject/bootloose-amazonlinux2023`\n- `quay.io/k0sproject/bootloose-debian12`\n- `quay.io/k0sproject/bootloose-fedora42`\n- `quay.io/k0sproject/bootloose-rockylinux9`\n- `quay.io/k0sproject/bootloose-ubuntu22.04`\n- `quay.io/k0sproject/bootloose-ubuntu24.04`\n\n#### Retired OS images\n\nThese may still work but won't receive any more updates.\n\n- `quay.io/k0sproject/bootloose-alpine3.18` \n- `quay.io/k0sproject/bootloose-amazonlinux2` \n- `quay.io/k0sproject/bootloose-debian10` \n- `quay.io/k0sproject/bootloose-fedora38` \n- `quay.io/k0sproject/bootloose-ubuntu18.04` \n- `quay.io/k0sproject/bootloose-ubuntu20.04`\n\n#### Image tags\n\nThe tag `:latest` is updated when any of the images are changed in the repository.\nWhen bootloose CLI binary releases are published, images at that point are tagged\nwith a version that you can pin a config to, such as\n`quay.io/k0sproject/bootloose-ubuntu20.04:v0.7.0`.\n\nFor example:\n\n```console\nbootloose config create --replicas 3 --image quay.io/k0sproject/bootloose-debian12\n```\n\n```console\nbootloose config create --replicas 3 --image quay.io/k0sproject/bootloose-debian12:v0.7.0\n```\n\nSome images may need the `--privileged` flag.\n\n## `bootloose.yaml`\n\n`bootloose config create` creates a `bootloose.yaml` configuration file that is then\nused by subsequent commands such as `create`, `delete` or `ssh`. If desired,\nthe configuration file can be named differently and supplied with the\n`-c, --config` option.\n\n```console\n$ bootloose config create --replicas 3\n$ cat bootloose.yaml\ncluster:\n  name: cluster\n  privateKey: cluster-key\nmachines:\n- count: 3\n  spec:\n    image: quay.io/k0sproject/bootloose-debian12\n    name: node%d\n    portMappings:\n    - containerPort: 22\n```\n\n\nThis configuration can naturally be edited by hand. The full list of\navailable parameters are in [the reference documentation][pkg-config].\n\n[pkg-config]: https://godoc.org/github.com/k0sproject/bootloose/pkg/config\n\n## Examples\n\nInteresting things can be done with `bootloose`!\n\n- [Customize the OS image](./examples/fedora38-htop/README.md)\n- [Run Apache](./examples/apache/README.md)\n- [Specify which ports on the hosts should be bound to services](examples/simple-hostPort/README.md)\n- [Use Ansible to provision machines](./examples/ansible/README.md)\n- [Run Docker inside `bootloose` machines!](./examples/docker-in-docker/README.md)\n- [Isolation and DNS resolution with custom docker networks](./examples/user-defined-network/README.md)\n- [OpenShift with bootloose](https://github.com/carlosedp/openshift-on-bootloose)\n\n## Under the hood\n\nUnder the hood, *Container Machines* are just containers. They can be\ninspected with `docker`:\n\n```console\n$ docker ps\nCONTAINER ID    IMAGE                                  COMMAND         NAMES\n04c27967f76e    quay.io/k0sproject/bootloose-debian12  \"/sbin/init\"    cluster-node2\n1665288855f6    quay.io/k0sproject/bootloose-debian12  \"/sbin/init\"    cluster-node1\n5134f80b733e    quay.io/k0sproject/bootloose-debian12  \"/sbin/init\"    cluster-node0\n```\n\nThe container names are derived from `cluster.name` and\n`cluster.machines[].name`.\n\nThey run `systemd` as PID 1, it's even possible to inspect the boot messages:\n\n```console\n$ docker logs cluster-node1\nsystemd 219 running in system mode.\nDetected virtualization docker.\nDetected architecture x86-64.\n\nWelcome to CentOS Linux 7 (Core)!\n\nSet hostname to \u003c1665288855f6\u003e.\nInitializing machine ID from random generator.\nFailed to install release agent, ignoring: File exists\n[  OK  ] Created slice Root Slice.\n[  OK  ] Created slice System Slice.\n[  OK  ] Reached target Slices.\n[  OK  ] Listening on Journal Socket.\n[  OK  ] Reached target Local File Systems.\n         Starting Create Volatile Files and Directories...\n[  OK  ] Listening on Delayed Shutdown Socket.\n[  OK  ] Reached target Swap.\n[  OK  ] Reached target Paths.\n         Starting Journal Service...\n[  OK  ] Started Create Volatile Files and Directories.\n[  OK  ] Started Journal Service.\n[  OK  ] Reached target System Initialization.\n[  OK  ] Started Daily Cleanup of Temporary Directories.\n[  OK  ] Reached target Timers.\n[  OK  ] Listening on D-Bus System Message Bus Socket.\n[  OK  ] Reached target Sockets.\n[  OK  ] Reached target Basic System.\n         Starting OpenSSH Server Key Generation...\n         Starting Cleanup of Temporary Directories...\n[  OK  ] Started Cleanup of Temporary Directories.\n[  OK  ] Started OpenSSH Server Key Generation.\n         Starting OpenSSH server daemon...\n[  OK  ] Started OpenSSH server daemon.\n[  OK  ] Reached target Multi-User System.\n```\n\n## FAQ\n\n### Is `bootloose` just like LXD?\nIn principle yes, but it will also work with Docker container images and\non MacOS as well.\n\n## Help\n\nWe are a very friendly community and love questions, help and feedback.\n\nIf you have any questions, feedback, or problems with `bootloose`:\n\n- Check out the [examples](examples).\n- [File an issue](https://github.com/k0sproject/bootloose/issues/new).\n- [Contact us](https://k0sproject.io/contact-us.html) via the form on the k0sproject website.\n\nbootloose follows the [CNCF Code of\nConduct](https://github.com/cncf/foundation/blob/master/code-of-conduct.md).\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported by contacting a bootloose project maintainer.\n\n\n\n## License\n[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fk0sproject%2Fbootloose.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fk0sproject%2Fbootloose?ref=badge_large)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fk0sproject%2Fbootloose","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fk0sproject%2Fbootloose","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fk0sproject%2Fbootloose/lists"}