Содержание

LXD

# Информация о контейнере и список снапшотов:
lxc info <containername>
 
# Сделать снапшот контейнера:
lxc snapshot <containername> <snapshotname>
 
# Стартовать контейнер:
lxc start <containername>

Монтирование директорий по NFS

С этим сложности. В непривилегированных контейнерах не получится монтировать что-то по NFS.

Решение: примонтировать по NFS в на LXD-хосте, а затем подключить примонтированную директорию к контейнеру в качестве диска.

:!: В LXD обнаружился занятный баг: если подключенную диреткорию не удается примонтировать по NFS, то контейнер не сможет стартовать. Установка опции required диска в false не поможет. Чтобы контейнер смог стартовать, директория должна либо отсутствовать, либо быть примонтирована без ошибок.

Поэтому automount работать не будет, и вместо него нужно использовать autofs:

/etc/auto.nfsmounts
daqserv1        -fstype=nfs4,soft,rsize=131072,wsize=32768      daqserv1:/data
lxc profile edit bind-data-dirs
devices:
  daqserv1:
    path: /daqserv1/
    required: "false"
    source: /nfsmounts/daqserv1/
    type: disk

Проблемы с Docker

Docker перезаписывает правила фаервола (баг https://github.com/docker/for-linux/issues/103, который разработчики пока не починили). После перезагрузки новые правила фаервола заблокировали связь контейнеров LXD.

Решение — самостоятельно добавить правила фаервола, разрешающие общение контейнеров LXD:

  sudo iptables -I DOCKER-USER -i lxdbr0 -j ACCEPT -m comment --comment "generated for LXD network lxdbr0"
  sudo iptables -I DOCKER-USER -o lxdbr0 -j ACCEPT -m comment --comment "generated for LXD network lxdbr0"

Автоматическое добавление правил в хуке на ifup может не работать, поскольку чейны DOCKER могут еще не быть созданы к этому моменту.

Поэтому создаем свой сервис, который будет стартовать после docker и добавлять нужные правила:

/usr/local/bin/post-docker.sh
#!/usr/bin/env bash
 
date > /var/log/post-docker-timestamp
iptables -I DOCKER-USER -i lxdbr0 -j ACCEPT -m comment --comment "generated for LXD network lxdbr0"
iptables -I DOCKER-USER -o lxdbr0 -j ACCEPT -m comment --comment "generated for LXD network lxdbr0"
/etc/systemd/system/postdocker.service
[Unit]
Description=Post Docker
After=docker.service
BindsTo=docker.service
ReloadPropagatedFrom=docker.service
 
[Service]
Type=oneshot
ExecStart=/usr/local/bin/post-docker.sh
ExecReload=/usr/local/bin/post-docker.sh
RemainAfterExit=yes
 
[Install]
WantedBy=multi-user.target
  chmod +x /usr/local/bin/post-docker.sh
  systemctl daemon-reload
  systemctl enable postdocker.service