|  | ================================ | 
|  | All-In-One Single LXC Container | 
|  | ================================ | 
|  |  | 
|  | This guide walks you through the process of deploying OpenStack using devstack | 
|  | in an LXC container instead of a VM. | 
|  |  | 
|  | The primary benefits to running devstack inside a container instead of a VM is | 
|  | faster performance and lower memory overhead while still providing a suitable | 
|  | level of isolation. This can be particularly useful when you want to simulate | 
|  | running OpenStack on multiple nodes. | 
|  |  | 
|  | .. Warning:: Containers do not provide the same level of isolation as a virtual | 
|  | machine. | 
|  |  | 
|  | .. Note:: Not all OpenStack features support running inside of a container. See | 
|  | `Limitations`_ section below for details. :doc:`OpenStack in a VM <single-vm>` | 
|  | is recommended for beginners. | 
|  |  | 
|  | Prerequisites | 
|  | ============== | 
|  |  | 
|  | This guide is written for Ubuntu 14.04 but should be adaptable for any modern | 
|  | Linux distribution. | 
|  |  | 
|  | Install the LXC package:: | 
|  |  | 
|  | sudo apt-get install lxc | 
|  |  | 
|  | You can verify support for containerization features in your currently running | 
|  | kernel using the ``lxc-checkconfig`` command. | 
|  |  | 
|  | Container Setup | 
|  | =============== | 
|  |  | 
|  | Configuration | 
|  | --------------- | 
|  |  | 
|  | For a successful run of ``stack.sh`` and to permit use of KVM to run the VMs you | 
|  | launch inside your container, we need to use the following additional | 
|  | configuration options. Place the following in a file called | 
|  | ``devstack-lxc.conf``:: | 
|  |  | 
|  | # Permit access to /dev/loop* | 
|  | lxc.cgroup.devices.allow = b 7:* rwm | 
|  |  | 
|  | # Setup access to /dev/net/tun and /dev/kvm | 
|  | lxc.mount.entry = /dev/net/tun dev/net/tun none bind,create=file 0 0 | 
|  | lxc.mount.entry = /dev/kvm dev/kvm none bind,create=file 0 0 | 
|  |  | 
|  | # Networking | 
|  | lxc.network.type = veth | 
|  | lxc.network.flags = up | 
|  | lxc.network.link = lxcbr0 | 
|  |  | 
|  |  | 
|  | Create Container | 
|  | ------------------- | 
|  |  | 
|  | The configuration and rootfs for LXC containers are created using the | 
|  | ``lxc-create`` command. | 
|  |  | 
|  | We will name our container ``devstack`` and use the ``ubuntu`` template which | 
|  | will use ``debootstrap`` to build a Ubuntu rootfs. It will default to the same | 
|  | release and architecture as the host system. We also install the additional | 
|  | packages ``bsdmainutils`` and ``git`` as we'll need them to run devstack:: | 
|  |  | 
|  | sudo lxc-create -n devstack -t ubuntu -f devstack-lxc.conf -- --packages=bsdmainutils,git | 
|  |  | 
|  | The first time it builds the rootfs will take a few minutes to download, unpack, | 
|  | and configure all the necessary packages for a minimal installation of Ubuntu. | 
|  | LXC will cache this and subsequent containers will only take seconds to create. | 
|  |  | 
|  | .. Note:: To speed up the initial rootfs creation, you can specify a mirror to | 
|  | download the Ubuntu packages from by appending ``--mirror=`` and then the URL | 
|  | of a Ubuntu mirror. To see other other template options, you can run | 
|  | ``lxc-create -t ubuntu -h``. | 
|  |  | 
|  | Start Container | 
|  | ---------------- | 
|  |  | 
|  | To start the container, run:: | 
|  |  | 
|  | sudo lxc-start -n devstack | 
|  |  | 
|  | A moment later you should be presented with the login prompt for your container. | 
|  | You can login using the username ``ubuntu`` and password ``ubuntu``. | 
|  |  | 
|  | You can also ssh into your container. On your host, run | 
|  | ``sudo lxc-info -n devstack`` to get the IP address (e.g. | 
|  | ``ssh ubuntu@$(sudo lxc-info -n devstack | awk '/IP/ { print $2 }')``). | 
|  |  | 
|  | Run Devstack | 
|  | ------------- | 
|  |  | 
|  | You should now be logged into your container and almost ready to run devstack. | 
|  | The commands in this section should all be run inside your container. | 
|  |  | 
|  | .. Tip:: You can greatly reduce the runtime of your initial devstack setup by | 
|  | ensuring you have your apt sources.list configured to use a fast mirror. | 
|  | Check and update ``/etc/apt/sources.list`` if necessary and then run | 
|  | ``apt-get update``. | 
|  |  | 
|  | #. Download DevStack | 
|  |  | 
|  | :: | 
|  |  | 
|  | git clone https://git.openstack.org/openstack-dev/devstack | 
|  |  | 
|  | #. Configure | 
|  |  | 
|  | Refer to :ref:`minimal-configuration` if you wish to configure the behaviour | 
|  | of devstack. | 
|  |  | 
|  | #. Start the install | 
|  |  | 
|  | :: | 
|  |  | 
|  | cd devstack | 
|  | ./stack.sh | 
|  |  | 
|  | Cleanup | 
|  | ------- | 
|  |  | 
|  | To stop the container:: | 
|  |  | 
|  | lxc-stop -n devstack | 
|  |  | 
|  | To delete the container:: | 
|  |  | 
|  | lxc-destroy -n devstack | 
|  |  | 
|  | Limitations | 
|  | ============ | 
|  |  | 
|  | Not all OpenStack features may function correctly or at all when ran from within | 
|  | a container. | 
|  |  | 
|  | Cinder | 
|  | ------- | 
|  |  | 
|  | Unable to create LVM backed volume | 
|  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | 
|  |  | 
|  | In our configuration, we have not whitelisted access to device-mapper or LVM | 
|  | devices. Doing so will permit your container to have access and control of LVM | 
|  | on the host system. To enable, add the following to your | 
|  | ``devstack-lxc.conf`` before running ``lxc-create``:: | 
|  |  | 
|  | lxc.cgroup.devices.allow = c 10:236 rwm | 
|  | lxc.cgroup.devices.allow = b 252:* rwm | 
|  |  | 
|  | Additionally you'll need to set ``udev_rules = 0`` in the ``activation`` | 
|  | section of ``/etc/lvm/lvm.conf`` unless you mount devtmpfs in your container. | 
|  |  | 
|  | Unable to attach volume to instance | 
|  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | 
|  |  | 
|  | It is not possible to attach cinder volumes to nova instances due to parts of | 
|  | the Linux iSCSI implementation not being network namespace aware. This can be | 
|  | worked around by using network pass-through instead of a separate network | 
|  | namespace but such a setup significantly reduces the isolation of the | 
|  | container (e.g. a ``halt`` command issued in the container will cause the host | 
|  | system to shutdown). |