Как создать шаблон LXD контейнера

На своём компьютере, где установлен контейнер, который Вы хотите использовать в качестве шаблона, выполняем следующие действия.

Выключаем контейнер:

lxc stop dponomar-dev

Делаем снапшот контейнера:

lxc snapshot dponomar-dev
lxc info dponomar-dev
###
Name: dponomar-dev
Location: none
Remote: unix://
Architecture: x86_64
Created: 2020/04/01 01:28 UTC
Status: Stopped
Type: container
Profiles: default
Snapshots:
  snap0 (taken at 2020/04/02 05:00 UTC) (stateless)
    ....
  snap3 (taken at 2020/08/09 10:58 UTC) (stateless)
###

Сразу же проверьте, что вам хватит места на сервере, чтобы скачать контейнер:

lxc storage info default
###
info:
  description: ""
  driver: btrfs
  name: default
  space used: 9.27GB
  total space: 21.00GB
###

lxc storage info default
###
info:
  description: ""
  driver: btrfs
  name: default
  space used: 17.40MB
  total space: 10.00GB
###

И что везде установлена одинаковая версия LXD:

# Компьютер, где находится контейнер
lxc --version
4.3

# Сервер, на который будет загружен контейнер
lxc --version
4.4

# Компьютер, где будет установлен новый контейнер используя тот, который будет
# загружен на сервер
lxc --version
4.4

После того как вы убедились, что места хватает и версии LXD везде совпадают, нам нужно настроить SSH туннель, чтобы мы могли скачать контейнер на свой сервер. Для этого нам понадобится, настроить обратный туннель к серверу со своего компьютера и локальный туннель на сервере для того, чтобы получилось достучаться до нашего компьютера.

# На своём компьютере
lxc config set core.https_address "127.0.0.1:8443"
lxc config set core.trust_password PASSWORDhere
ufw allow 8443

ssh -N -R 8442:localhost:22 root@dponomar.dev

# На сервере
ssh -N -L 8443:localhost:8443 dponomar@localhost -p 8442

# И теперь можно попробовать добавить наш компьютер, как сервер для скачивания образов
lxc remote add server1 127.0.0.1
lxc list server1:
###
+--------------+---------+------+------+-----------+-----------+
|     NAME     |  STATE  | IPV4 | IPV6 |   TYPE    | SNAPSHOTS |
+--------------+---------+------+------+-----------+-----------+
| dponomar-dev | STOPPED |      |      | CONTAINER | 5         |
+--------------+---------+------+------+-----------+-----------+
###

У нас получилось подключиться к компьютеру, где лежит контейнер, теперь осталось только скачать его на сервер, а дальше его можно будет установить на любой другой компьютер, просто скачав с вашего сервера.

# На сервере
lxc copy server1:dponomar-dev/snap2 dponomar-dev --verbose

# Нужно указать ip сервера вместо 100.200.50.150
lxc config set core.https_address "100.200.50.150:8443"
lxc config set core.trust_password PASSWORDhere
ufw allow 8443

Теперь можем зайти на тот, компьютер, куда нужно установить этот контейнер из шаблона и сделаем следующее:

lxc remote add server2 100.200.50.150
lxc list server2:
###
+--------------+---------+------+------+-----------+-----------+
|     NAME     |  STATE  | IPV4 | IPV6 |   TYPE    | SNAPSHOTS |
+--------------+---------+------+------+-----------+-----------+
| dponomar-dev | STOPPED |      |      | CONTAINER | 0         |
+--------------+---------+------+------+-----------+-----------+
###
lxc copy server2:dponomar-dev dponomar-dev

Готово. Теперь на этом компьютере установлен точно такое же контейнер, как был на первом.