В восьмой статье познакомимся со вложенными контейнерами и создадим Матрицу.
В предыдущей статье было рассказано как использовать Docker внутри LXD. Данный способ позволяет получить вашим пользователям безопасную среду для приложений, развёрнутых через Докер. А что если пользователям хотелось бы развернуть другие Linux дистрибутивы или позволить другой группе людей получить доступ к Linux системам, запустив контейнер для них?
LXD делает это изящно через вложенные контейнеры.
Самый простой способ продемонстрировать вложенность, использовать Ubuntu 16.04. Облачный образ Ubuntu 16.04 идёт с установленным LXD, хотя демон не запущен, то есть не использует ресурсы, пока вы не начнёте взаимодействие с ним.
Давайте просто начнём с создания контейнера на базе Ubuntu 16.04 с включённой вложенностью: lxc launch ubuntu-daily:16.04 c1 -c security.nesting=true
Так же указать ключ вложенности можно и в уже существующий контейнер - lxc config set имя-контейнера security.nesting true
Или для всех контейнеров, использующих конкретный профиль - lxc profile set имя-профиля security.nesting true
С запущенным контейнером, вы можете запустить шелл, сконфигурировать внутри LXD и запустить контейнер.
lxc launch ubuntu-daily:16.04 c1 -c security.nesting=true
Creating c1 Starting c1
lxc exec c1 bash
root@c1:~# lxd init
Name of the storage backend to use (dir or zfs): dir We detected that you are running inside an unprivileged container. This means that unless you manually configured your host otherwise, you will not have enough uid and gid to allocate to your containers. LXD can re-use your container's own allocation to avoid the problem. Doing so makes your nested containers slightly less safe as they could in theory attack their parent container and gain more privileges than they otherwise would. Would you like to have your containers share their parent's allocation (yes/no)? yes Would you like LXD to be available over the network (yes/no)? no Do you want to configure the LXD bridge (yes/no)? yes Warning: Stopping lxd.service, but it can still be activated by: lxd.socket LXD has been successfully configured.
root@c1:~# lxc launch ubuntu:14.04 trusty
Generating a client certificate. This may take a minute... If this is your first time using LXD, you should also run: sudo lxd init Creating trusty Retrieving image: 100% Starting trusty
root@c1:~# lxc list
+--------+---------+-----------------------+----------------------------------------------+------------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +--------+---------+-----------------------+----------------------------------------------+------------+-----------+ | trusty | RUNNING | 10.153.141.124 (eth0) | fd7:f15d:d1d6:da14:216:3eff:fef1:4002 (eth0) | PERSISTENT | 0 | +--------+---------+-----------------------+----------------------------------------------+------------+-----------+
Так как статья получилась коротенькая, то добавлена информация об ознакомительном демо-сервере. Данный сервер использует LXD внутри виртуальной машины с небольшим демоном, реализующим REST API для использования сайтом. После принятия условия использования, вам создадут LXD контейнер с поддержкой вложенности.
Если вы хотите сделать свой веб-сервер, то берите код
git clone github.com/lxc/linuxcontainers.org
git clone github.com/lxc/lxd-demo-server
Оглавление цикла статей про LXD 2.0.
Предыдущая статья LXD 2.0: Docker в LXD [7/12].
Следующая статья LXD 2.0: Живая миграция [9/12].