Контейнерите за Linux (LXC) са лека технология за виртуализация и имат различни приложения. Той е част от ядрото на Linux и може да ви позволи да емулирате един или няколко дистрибуции на Linux на един хост на Linux. Помислете за това като за средно положение между chroot и пълни технологии за виртуализация като VirtualBox, KVM или Xen. Подобна технология, присъстваща в света на BSD, е FreeBSD Jails.
Например, машината, върху която пиша, е лаптоп с операционна система Linux Mint 18, задвижван от процесор Intel Atom, и има оскъдни 2 GB оперативна памет. И все пак, аз използвам три Linux контейнера, всеки с екземпляр на уеб сървъра на Apache, без голям хит на производителността. Това би било немислимо с традиционната виртуална машина като VirtualBox. Така че, ако сте искали да стартирате множество дистрибуции на вашата Linux система, контейнерите на Linux трябва да свършат работата точно за вас.
Инсталиране и конфигуриране на контейнери за Linux
Ние създаваме LXC на Linux Mint 18 64-bit. Инструкциите за инсталиране, предоставени тук, също ще работят непроменени на Ubuntu 16.04 и по-горе. Ако използвате друга дистрибуция, моля, обърнете се към официалната документация на вашия дистрибутор, ако нещо не работи според очакванията. Предполага се и познаване на командния ред и общо отстраняване на неизправности.
Предварителни
Ето няколко неща, които трябва да настроите, за да започнете да използвате няколко дистрибуции:
1. Инсталирайте LXC и друг необходим софтуер, като използвате:
sudo apt install lxc lxc-templates uidmap [/ sourcecode]
2. Сега трябва да конфигурирате профила си . Въведете следните команди, за да го настроите:
[sourcecode] mkdir -p ~ / .config / lxc
echo "lxc.id_map = u 0 100000 65536" & amp; gt; ~ / .Config / lxc / default.conf
ехо "lxc.id_map = g 0 100000 65536" & amp; gt; & amp; gt; ~ / .Config / lxc / default.conf
ехо "lxc.network.type = veth" & amp; gt; & amp; gt; ~ / .Config / lxc / default.conf
ехо "lxc.network.link = lxcbr0" & amp; gt; & amp; gt; ~ / .Config / lxc / default.conf
echo "$ USER veth lxcbr0 2" | sudo tee -a / etc / lxc / lxc-usernet [/ sourcecode]
3. След това трябва да настроите потребителските разрешения, както следва:
[sourcecode] sudo usermod -add-subuids 100000-165536 $ USER
sudo usermod -add-subgids 100000-165536 $ USER
sudo cgm създава всички потребители
sudo cgm chown всички потребителски $ (id -u) $ (id -g)
cgm movepid всички потребители $$ [/ sourcecode]
Настройка на контейнера
Сега, когато LXC контейнер е инсталиран заедно с друг необходим софтуер, ето стъпките за конфигуриране на контейнера:
1. В този пример ще създадем контейнер на Ubuntu, наречен ubu1
. За да го направите, изпълнете следната команда:
[sourcecode] lxc-create - шаблон за изтегляне - име ubu1 [/ sourcecode]
2. Тук параметърът -template указва на lxc да изтегли предварително конфигурирано изображение от интернет, докато параметърът - име указва името на контейнера - ubu1
в този случай. Можете да използвате желаното от вас име.
3. Сега ще видите списък на поддържаните дистрибутивни изображения :
4. Въведете спецификата на дистрибуцията, която искате да инсталирате. Ще инсталирам 64-битовата версия на Ubuntu 16.04 (кодово име xenial) тук:
5. Ако искате да инсталирате изображението неинтерактивно, следната команда постига същия резултат, както по-горе:
[sourcecode] lxc-create -t изтегляне -n ubu1 - –dist ubuntu - освобождаване xenial –arch amd64 [/ sourcecode]
6. LXC ще изтегли и инсталира минимално Ubuntu xenial изображение на вашата хост система. Изтеглянето и инсталирането може да отнеме малко време в зависимост от вашата интернет връзка и скоростта на вашия компютър. След инсталацията ще видите екран като този:
Вече сте готови да използвате новосъздадения контейнер на Ubuntu.
Използване на множество дистрибуции с контейнери за Linux
Стартиране на контейнера
Стартирайте контейнера, като използвате командата lxc-start
:
[sourcecode] lxc-start -n ubu1 -d [/ sourcecode]
Тук параметърът -n
указва името на контейнера, който искате да стартирате ( ubu1
в този случай), а параметърът -d
го прави да се изпълнява във фонов режим .
Можете да проверите дали контейнерът е стартиран с помощта на lxc-ls
:
[sourcecode] lxc-ls -f [/ sourcecode]
Параметърът -f
позволява фантастично отчитане. Тук можете да видите, че имам два контейнера - един Debian (спрян) и един Ubuntu (работещ).
Достъп и използване на контейнера
Можете да получите достъп до конзолата на контейнера, като използвате командата lxc-attach
:
[sourcecode] lxc-attach -n ubu1 [/ sourcecode]
Сега ще имате коренова обвивка на контейнера. Препоръчително е да зададете парола за главния потребител и да създадете редовен потребителски акаунт :
[Изходния код] ако съществува
adduser beebom [/ sourcecode]
Разбира се, заменете beebom с желаното потребителско име. След това можете да инсталирате софтуер и да конфигурирате контейнера, както бихте направили в обикновена система. Например в контейнер на Debian или Ubuntu:
[sourcecode] apt инсталиране wget openssh-сървър htop tmux nano iptables [/ sourcecode]
Спиране на контейнера
След като приключите да играете с контейнера, използвайте командата exit
да се върнете в хост системата . Сега използвайте командата lxc-stop
да спрете контейнера :
[sourcecode] lxc-stop -n ubu1 [/ sourcecode]
Това ще направи контейнера изключен чисто и няма да консумира повече ресурси на вашата система, с изключение на дисковото пространство.
Клониране и снимки
Клонираните
След като сте инсталирали програми в контейнер и сте ги конфигурирали по ваш вкус, може да искате да създадете една или няколко копия от него за лесно предоставяне. Можете да направите това, като създадете клонинг, който е точно копие на контейнер.
Например, за да създадете клонинг на контейнера ubu1
(нека го наречем ubu2
), първо спрете контейнера с помощта на lxc-stop
, след това използвайте командата lxc-copy
:
[sourcecode] lxc-stop -n ubu
lxc-copy -n ubu1-ubu2 [/ sourcecode]
Тук опцията -n указва контейнера-източник и опцията -N указва името на клонинга . За да проверите дали контейнерът е клониран, използвайте lxc-ls
:
Моменти
Да предположим, че сте на път да направите някои потенциално опасни или трудни за възстановяване от промени в контейнер, като например повторно конфигуриране на уеб сървър. За да намалите щетите, можете да създадете моментна снимка на контейнера, преди да направите такава промяна. В случай, че нещо се обърка по време на конфигурацията, можете просто да спрете контейнера и да го възстановите до предишното му работно състояние, като възстановите моментната снимка.
За да създадете моментната снимка, първо спрете контейнера :
[sourcecode] lxc-stop -n ubu1 [/ sourcecode]
След това създайте моментна снимка, като използвате командата lxc-snapshot
:
[sourcecode] lxc-snapshot -n ubu1 [/ sourcecode]
Това създава моментна снимка, наречена snap0
. Всички следващи снимки, които създавате с помощта на тази команда, ще се наричат snap1, snap2 и т.н.
След това можете да стартирате контейнера и да направите необходимите промени. Ако по всяко време искате да се върнете към създадена снимка, спрете контейнера и използвайте командата lxc-snapshot
с параметъра -r
, за да възстановите моментната снимка :
[sourcecode] lxc-snapshot -r snap0 -n ubu1 [/ sourcecode]
Това ще възстанови моментната снимка в контейнера ubu1
.
Автоматично стартиране на контейнери при зареждане
Можете да направите контейнер, например контейнер на уеб сървър, да се стартира автоматично, когато стартирате системата. За да направите това, отидете в конфигурационния файл на контейнера, намиращ се в конфигурацията $HOME/.local/share/lxc//config
и добавете следните редове :
[sourcecode] lxc.start.auto = 1
lxc.start.delay = 5 [/ sourcecode]
Първият ред указва, че контейнерът трябва да се стартира при зареждане. Вторият казва на системата да изчака 5 секунди преди да стартира следващия контейнер, ако има такъв.
Отстраняване на проблеми
Ако имате проблеми със стартирането на контейнери, първото нещо, което трябва да опитате, е да lxc-start
командата lxc-start
в режим Преден план . Например:
[sourcecode] lxc-start -n ubu1 -F [/ sourcecode]
Това ще ви покаже грешките на текущата конзола, което е много полезно при идентифицирането на естеството на проблема.
Проблеми със стартирането на множество контейнери едновременно
Ако се опитате да стартирате няколко контейнера наведнъж, може да видите грешки като „Достигната квота“ или „неуспешно създаване на конфигурирана мрежа“. Това е така, защото използвате повече мрежови интерфейси, отколкото ви е предоставено. Можете да увеличите броя на мрежовите мостове, които потребителят може да изпълни, като промените /etc/lxc/lxc-usernet
като root . Може да изглежда така:
[sourcecode] # USERNAME TYPE BRIDGE COUNT
beebom veth lxcbr0 5 [/ sourcecode]
Можете да промените номера в края (5 в този пример), на по-голям брой, например 10. Това ще ви позволи да стартирате до 10 контейнера наведнъж.
Други употреби на контейнери за Linux
Контейнерите на Linux имат различни приложения. Можете да ги използвате като леки тестови кутии, например, за да тествате различни конфигурации на уеб или сървър на база данни, преди да ги направите на производствен сървър. Друг случай на използване е да се тества как дадено приложение работи на различни версии на различни дистрибуции.
Можете също така да ги използвате, за да изолирате приложения, на които не се доверявате - всяка повреда, която такова приложение прави, ще бъде ограничена до неговия собствен контейнер и няма да засегне хост системата. Моля, имайте предвид, че докато е възможно да се изпълняват GUI приложения в контейнер, това отнема значително време и усилия и следователно не се препоръчва. Ако искате да изпълнявате приложения с графичен потребителски интерфейс в пясъчник, обърнете се към нашата статия за това как да използвате приложенията в пясъчника в Linux.
Изпълнявайте множество дистрибути едновременно с контейнерите на Linux
По този начин завършва нашия How-To за стартиране на множество дистрибуции на Linux на един компютър, без натоварване на пълноразмерна виртуална машина. Ползата от тази технология е ограничена само от вашата креативност, така че не се колебайте да експериментирате и да откриете нови случаи на употреба. Ако имате проблеми с инсталирането на контейнери, не се колебайте да ни зададете въпрос в раздела за коментари.