Docker в LXC

Thank you for reading this post, don't forget to subscribe!

Запуск Docker в LXC

Ино­гда тре­бу­ет­ся запу­стить docker в lxc, напри­мер, для уста­нов­ки Docker Swarm на локаль­ную маши­ну, или для уста­нов­ки Kubernetos.

LXC поз­во­ля­ет запус­кать Docker внут­ри контейнера.

Реко­мен­ду­ет­ся исполь­зо­вать хост маши­ну Ubuntu 18.04 и LXC кон­тей­нер с вер­си­ей Centos 7.

Преж­де чем начать, уста­но­ви­те LXC на Ubuntu по инструкции.

Для того, что­бы запу­стить Docker в LXC нуж­но выпол­нить сле­ду­ю­щие действия:

  1. запу­стить кон­тей­нер в privileged mode
  2. вклю­чить мод lxc nested containers

Запуск контейнера в privileged mode

Privileged mode — это при­ве­ли­ги­ро­ван­ный режим, запуск кон­тей­не­ра от рута.

Перед уста­нов­кой кон­тей­не­ра, нуж­но зако­мен­ти­ро­вать стро­ки в фай­ле /etc/lxc/default.conf

Это поз­во­лит уста­но­вить кон­тей­нер под рутом.

Выпол­ни­те коман­ду уста­нов­ки контейнера:

Затем нуж­но обя­за­тель­но рас­ко­мен­ти­ро­вать эти стро­ки обрат­но. Ком­мен­ти­ро­вать стро­ки, нуж­но толь­ко при уста­нов­ке кон­тей­не­ра, кото­рый вы хоти­те, что­бы он рабо­тал в при­ве­ли­ги­ро­ван­ном режиме.

LXC nested containers

Nested кон­тей­нер — это воз­мож­ность запу­стить кон­тей­нер в кон­тей­не­ре (вло­жен­ные кон­тей­не­ры). Что­бы вклю­чить дан­ную опцию, нуж­но вне­сти изме­не­ния в кон­фиг LXC контейнера.

Опция вклю­ча­ет­ся в фай­ле кон­фи­га кон­тей­не­ра /var/lib/lxc/<название контейнера>/config

Рас­ко­мен­ти­руй­те строчку:

Так­же вам пона­до­бит­ся про­пи­сать пара­мет­ры для мон­ти­ро­ва­ния фай­ло­вой систе­мы cgroup и отклю­че­ния AppArmor в контейнере

Про­пи­ши­те пара­мет­ры сети:

А так­же в фай­ле /var/lib/lxc/docker0/rootfs/etc/sysconfig/network-scripts/ifcfg-eth0 укажите:

Установка Docker

Запу­сти­те кон­тей­нер и вой­ди­те в него:

Уста­но­ви­те docker и вклю­чи­те автозапуск:

После уста­нов­ки, ска­чай­те тесто­вый кон­тей­нер и убе­ди­тесь что он работает:

Выпол­ни­те коман­ду docker ps, долж­но вам выдать:

Про­верь­те рабо­ту контейнера:

Возникаемые ошибки

Если воз­ни­ка­ют ошибки:

То это ско­рее все­го свя­за­но с AppArmor. Сде­лай­те tail -n 20 /var/log/syslog. Если в логе при­сут­сву­ют сле­ду­ю­щие строки:

То, да при­чи­на в AppArmor. Обыч­но в кон­фиг LXC lxc.apparmor.profile, lxc.mount.auto, lxc.cgroup.devices.allow помо­га­ет. Но если не помог­ло, то выпол­ни­те сле­ду­ю­щие команды:

Вклю­чи­те обу­че­ние AppArmor

Запу­сти­те LXC кон­тей­не­ры, и попро­буй­те зано­во запу­стить docker. Затем, после выда­чи ошиб­ки, перей­ди­те на хост маши­ну и выпол­ни­те коман­ду aa-logprof. Дан­ная ком­ман­да ана­ли­зи­ру­ет лог /var/log/syslog и пред­ла­га­ет вам вари­ан­ты пат­чин­га пра­вил AppArmor.

Про­пат­чи­те кон­фиг AppArmor и затем выклю­чи­те обучение: