- Linux containers in ubuntu
- 2. Requirements
- 3. Install Docker for Windows
- 4. Download the Ubuntu container image
- 5. Prepare the container environment
- 6. More Docker preparation
- 7. Run an Ubuntu container on Hyper-V
- 8. Getting help
- Linux-контейнеры дома: зачем и как
- Рассуждения
- Развертывание и настройка контейнера
- Использование
- Контейнеры LXC в Linux
- Что такое контейнеры LXC?
- Установка и настройка LXC
- Использование контейнеров LXC
- Подключение к контейнеру
- Выключение контейнера
- Клонирование контейнеров
- Моментальные снимки
- Запуск контейнера при старте системы
- Решение проблем
- Выводы
Linux containers in ubuntu
It is now possible to run Docker containers on Windows 10 and Windows Server, leveraging Ubuntu as a hosting base.
Imagine running your own Linux applications on Windows, using a Linux distribution you are comfortable with: Ubuntu!
It is now possible to do so using the power of Docker technology and Hyper-V virtualization on Windows.
Originally authored by Mathieu Trudel-Lapierre.
2. Requirements
You will need a 64-bit x86 PC with 8GiB of RAM running Windows 10 or Windows Server, updated to include the Windows 10 Fall Creator update, released October 2017.
You will also need a recent installation of Docker.
Finally, you will need to make sure you have installed a program for decompressing the Ubuntu host container image, e.g. 7-Zip or XZ Utils
3. Install Docker for Windows
Download Docker for Windows from Docker Store.
Once downloaded, proceed with the installation steps, and either logout or reboot of your system as indicated by the installer.
After reboot, Docker will be started. Docker requires that the Hyper-V feature is enabled, so if necessary will ask you to enable it and restart. Click OK for Docker to enable Hyper-V and restart your system.
4. Download the Ubuntu container image
Download the latest Ubuntu container image for Windows from the Canonical Partner Images website
Once downloaded, extract the image, using e.g. 7-Zip, or XZ Utils:
5. Prepare the container environment
First, create two directories:
Create C:\lcow, which will be used as scratch space for Docker while preparing the containers.
Also create C:\Program Files\Linux Containers. This is where the Ubuntu container image will live.
You will need to give this folder extra permissions to allow Docker to use the images from it. Run the following Powershell script in an administrator Powershell window:
Save this file as set_perms.ps1 and run it:
TIP You may need to run ‘Set-ExecutionPolicy -Scope process unrestricted’ to be allowed to run unsigned Powershell scripts.
Now, copy the Ubuntu container image .vhdx file that was decompressed at the previous step to uvm.vhdx under C:\Program Files\Linux Containers.
6. More Docker preparation
Docker for Windows requires some pre-release features in order to work with Hyper-V isolation. While these features are not yet available in the Docker CE installation that was done previously, the necessary files can be downloaded from master.dockerproject.org.
Retrieve dockerd.exe and docker.exe from master.dockerproject.org, and put the two programs somewhere safe, such as in your own folder. They will be used to start the Ubuntu container in the next step.
7. Run an Ubuntu container on Hyper-V
You’re now ready to start your container. First, open a Command-line prompt (cmd.exe) as Administrator, and start dockerd.exe with the right environment:
Docker already running?
If the Docker installer sets Docker to run automatically at boot, you may need to quit the already running daemon, via its toolbar icon, before running the above commands.
Then, start a Powershell window as Administrator; and run docker.exe, instructing it to pull the image for your container:
We can now finally start the container. Run docker.exe again, and tell it to run the new image:
Congratulations! You have successfully set up your system to use containers with Hyper-V isolation on Windows, and have run your very own Ubuntu container.
8. Getting help
If you need some guidance getting started with the Ubuntu container images for Hyper-V, or if you get stuck, help is always at hand:
Источник
Linux-контейнеры дома: зачем и как
Рассуждения
При упоминании словосочетания «контейнерная виртуализация», многим на ум сразу же приходят Virtuozzo и OpenVZ, а также Docker. Ассоциируется же это все, в первую очередь, с хостингом, VPS и другими подобными вещами.
Дома, на личных компьютерах многие используют виртуальные машины: в основном, пожалуй, Virtualbox. Как правило, для того, чтобы работая под Linux, иметь под рукой Windows или наоборот. Однако, при наличии множества родственных Linux-операционок, я стал замечать, что использование виртуальных машин — это, мягко говоря, нерационально.
В первую очередь, очень быстро расходуется дисковое пространство. Каждой виртуальной машине нужно место, даже если несколько из них отличаются только конфигами. Особенно критично это на невеликих размеров SSD лаптопа. В принципе, Virtualbox умеет работать с raw-девайсами и, теоретически, машинам можно назначать rw LVM-снапшот, но тут опять же встают вопросы с изменением размера файловой системы в дальнейшем, автоматизацией клонирования, переноса, удаления и тому подобное.
Во вторую — это больший расход оперативной памяти. В третью — не самые удобные инструменты взаимодействия…
Потому, возникла идея опробовать в домашних условиях контейнерную виртуализацию. OpenVZ отмел сразу, по причине необходимости возиться с кастомным ядром. Выбор же пал на LXC, поставляющийся в репозитарии стабильного Debian’a.
Что такое контейнеры и чем это все отличается от виртуализации? В случае контейнеров, не создается виртуальное аппаратное окружение, а используется изолированное пространство процессов и сетевого стека. Скажем так, получается chroot с расширенными возможностями.
Зачем это нужно:
— Для сборки ПО при нежелании захламлять разномастными *-dev пакетами основную рабочую систему.
— Потребность в другом дистрибутиве для запуска каких-либо специфических программ и, опять же, сборки.
— Изоляция потенциально небезопасного софта, вроде того же скайпа совершающего разные непонятные действия в домашнем каталоге пользователя и всяких сомнительных веб-технологий: уязвимость во флеше, в java, в обработчике pdf — это только то, что плавает на поверхности.
— Анонимность. Эдак можно банально остаться залогиненым в своей любимой социалочке, забыть подчистить куки или оказаться незнакомым с очередной новой веб-технологией вроде этой webrtc. Можно, конечно, держать несколько профилей браузера, но от перечисленных выше дыр и технологий это не защитит.
Итак, рассмотрим плюсы и минусы LXC:
+ Работает на ванильном ядре
+ Простота проброса устройств и каталогов хоста, так как работает это все через cgroups
+ Очень нетребовательно к ресурсам, в отличии от виртуальных машин типа Virtualbox или qemu
— Контейнеры будут работать на том же ядре, что и хост, хотя — это скорей особенность контейнерной виртуализации в целом.
— Некоторая недоделанность идущих в комплекте утилит.
Развертывание и настройка контейнера
В первую очередь, ставим пакет lxc и все необходимые утилиты:
Смотрим доступные группы томов LVM:
Указываем использовать LVM в качестве системы хранения, Volume Group ( в моем случае — nethack-vg) и размер 2 гигабайта, иначе по умолчанию будет создан одногиговый том. Хотя, если вдруг стало тесновато, можно будет сделать lvresize.
Видим, что у нас появился том deb_test.
Типовой конфиг, созданный скриптом:
Залогинимся с указанным паролем. Для запуска в headless-режиме используется ключ -d, а рутовую консоль можно получить с помощью команды
Пока у нас ни сети, ни нужных для работы программ. Для этого на хосте поднимаем мост, задаем IP, заворачиваем трафик из подсети виртуалки, при отключении интерфейса разрушаем мост.
На хосте прописываем в /etc/network/interfaces
В конфиг контейнера дописываем:
Понятно, что mac-адрес произвольный, на любой вкус.
Чтобы сразу получить рабочую сеть и возможность установки пакетов apt’ом, допишем
Понятно, что 192.168.18.1 — IP моего DNS.
Установим нужные пакеты:
Дальше либо на хосте, либо на другой рабочей виртуалке можно получить список установленных пакетов и установить их все в нашем новом контейнере:
Теперь можно по-человечески настроить сетевой интерфейс в контейнере, использовав любимый текстовый редактор:
Впрочем, это можно было сделать с хост-системы, например, смонтировав логический том. Способов много.
В принципе, в качестве DNS можно указать любой публичный, если не опасаетесь за свою приватность. Например, гугловские 8.8.8.8 и 8.8.4.4.
По доступу к устройствам хост-системы, я придерживаюсь политики «все, что не разрешено, запрещено». Добавим для этого следующую строчку в конфиг:
Попробуем подключиться через OpenVPN. Сразу же получаем ошибку:
Система пишет, что интерфейсы TUN/TAP недоступны по причине их отсутствия. Очевидно, что нужно разрешить гостевой системе использовать устройства хоста. Открываем конфигурационный файл контейнера, /var/lib/lxc/deb_test/config и добавляем туда строчку:
В контейнере выполняем:
Обратим внимание на 10:200 — это идентификатор типа устройств. Если выполним на хосте:
То увидим идентификаторы 10, 200. По ним и будем ориентироваться, разрешая доступ к устройства, например камере — video0.
Точно также добавляем остальные нужные устройства:
Для функционирования иксов и возможности их проброса через ssh, нужно добавить точку монтирования:
По аналогии можно примонтировать и другие, нужные каталоги и файлы:
Для воспроизведения звука, можно разрешить доступ к звуковому устройству, если карта многопоточная (с однопоточной при использовании dmix возникают проблемы с блокировкой):
А можно настроить pulseaudio на воспроизведение звука по сети, как это описано здесь. Кратко:
Отредактировать на хосте /etc/pulse/default.pa, дописав туда:
В итоге у нас получается вот такой конфиг:
Контейнер готов к использованию.
Использование
Доустановим, например, i2p с Tor’ом, если не сделали этого ранее, и сходу настроим privoxy:
Запускать графические приложения вроде браузера удобнее всего через ssh:
Также, разумеется, LXC предоставляет средства для клонирования контейнеров и снятия снапшотов.
Так, например, склонировать контейнер, файловая система которого будет являться LVM-снапшотом можно командой:
Будет создан контейнер deb_test2 с файловой системой, размещенной на LVM-снапшоте размером 200MB (под хранение diff’ов). Это будет точная копия deb_test, над которой можно провести пару экспериментов и, например, безболезненно удалить.
А вот lxc-snapshot с LVM в качестве хранилища, на версии lxc-1.0.6 почему-то не работает:
Проблема описывается и обсуждается здесь. Потому, снимки придется делать по старинке:
В данном случае создали read-only снапшот с именем deb_test_before_rm_rf размером 100MB. Что с ним делать дальше? Например, его можно сдампить посредством dd, перенести на другую машину вместе с конфигами контейнера, создать там том нужного размера и пролить тем же dd (cp, cat, итд) — эдакая «живая миграция».
Как писалось выше, областей применения контейнерам можно найти массу. Но главной, при домашнем использовании, на мой взгляд, является изоляция приложений.
Источник
Контейнеры LXC в Linux
Контейнеры Linux или LXC — это легкая технология виртуализации, которая может использоваться для решения различных задач. Технология встроена в ядро Linux и с помощью неё вы сможете запустить несколько дистрибутивов на одном компьютере или сервере практически без потерь производительности.
LXC можно расценивать как что-то среднее между изолированным окружением chroot и полноценной технологией виртуализации Qemu, Xen, KVM или VirtualBox. Поскольку все программы выполняются на реальном железе, без использования виртуализации, то вы не теряете производительность, в отличие от случая если бы вы использовали VirtualBox. Вы можете очень легко запустить параллельно несколько контейнеров в своей системе, даже при очень низких аппаратных ресурсах, чего нельзя сделать с полноценными технологиями виртуализации.
В этой небольшой статье мы рассмотрим как выполняется установка и настройка LXC в Ubuntu, а также как использовать эту технологию.
Что такое контейнеры LXC?
Перед тем как перейти к настройке давайте рассмотрим что из себя представляют контейнеры Linux. Как я уже сказал, это не совсем виртуализация, потому что все программы, которые выполняются внутри контейнера — работают на реальном железе и почти не теряют в производительности. Используется, только одно ядро, а для разграничения наборов процессов между собой применяются виртуальные окружения.
Виртуальные окружения создаются с помощью встроенных в ядро механизмов. Это в первую очередь улучшенный механизм chroot, который изолирует файловую систему контейнера от основной файловой системы. Но, как вы знаете в chroot есть один недостаток, вы не можете запустить систему инициализации, поскольку программа с таким PID уже существует, но это необходимо для управления процессами и службами.
Для решения этой проблемы используются пространства имен PID, с помощью этого механизма PID процессов контейнера не зависят от основной системы и других контейнеров, а поэтому мы можем очень просто запустить систему инициализации. Ну и наконец нужно управлять ресурсами, для этого используется механизм cgroups.
Благодаря всему этому потеря производительности при использовании контейнеров LXC Linux составляет не более 1%. Теперь, когда вы знаете как все это работает, перейдем к описанию процесса установки LXC.
Установка и настройка LXC
В этой инструкции мы будем настраивать LXC в Ubuntu, поскольку это самая популярная операционная система, но все эти команды подойдут для всех других дистрибутивов. Отличие составляет только команда установки. Сначала нужно установить все необходимое программное обеспечение. Установка LXC на Ubuntu выполняется командой:
sudo apt install lxc lxc-templates uidmap
Дальше нужно задать базовые настройки, которые будут применяться для создания сети в контейнерах и установки других параметров. Сначала создаем папку с конфигурацией:
Настроим пользовательские пространства имен. Первая цифра означает первый UID пользователя linux в контейнере, вторая отвечающий ему UID пользователя в основной системе:
echo «lxc.id_map = u 0 100000 65536» >>
/.config/lxc/default.conf
echo «lxc.id_map = g 0 100000 65536» >>
Дальше настраиваем сеть в контейнере:
echo «lxc.network.type = veth» >>
/.config/lxc/default.conf
echo «lxc.network.link = lxcbr0» >>
/.config/lxc/default.conf
echo «lxc.network.flags = up» >>
Затем в файле /etc/lxc/lxc-usernet нужно разрешить использовать сетевые интерфейсы текущему пользователю, чтобы получить возможность запускать контейнер без root прав:
echo «$USER veth lxcbr0 2» | sudo tee -a /etc/lxc/lxc-usernet
Для того чтобы пространства имен пользователей linux в контейнере работали нужно присвоить своему пользователю подпространство UID и GID 100000-165536:
sudo usermod —add-subuids 100000-165536 $USER
sudo usermod —add-subgids 100000-165536 $USER
И даем права на использование данного пользователя в cgm:
sudo cgm create all user
sudo cgm chown all user $(id -u) $(id -g)
cgm movepid all user $$
Теперь первоначальная настройка завершена и мы готовы перейти к загрузке и установке образа контейнера. Для установки в интерактивном режиме наберите такую команду, здесь ubu1, это имя будущего контейнера:
lxc-create —template download —name ubu1
В этом списке вам предстоит выбрать нужную операционную систему. Просто введите необходимые параметры, имя, релиз и архитектура, выбрав их из списка доступных, например, для Ubuntu Yakkety Yak 64 бит:
Затем начнется загрузка уже готового, настроенного образа из интернета. Это может занять довольно много времени если у вас медленный интернет.
Также вы можете использовать не интерактивный режим и указать все необходимые параметры сразу в командной строке:
lxc-create -t download -n ubu1 — —dist ubuntu —release xenial —arch amd64
После завершения загрузки контейнера первоначальная установка будет завершена и мы можем перейти дальше.
Использование контейнеров LXC
После всех проделанных выше действий мы можем перейти к запуску контейнера. Для этого используйте команду lxc-start с именем вашего контейнера, например:
lxc-start -n ubu1 -d
Опция -n задает имя контейнера, в нашем случае — ubu1, а -d говорит утилите запуска, что нужно выполнять программу в фоновом режиме. Вы можете убедиться, что контейнер запущен с помощью такой команды:
Тут опция -f включает более подробный вывод, в списке вы увидите только что установленный контейнер и его состояние будет запущен.
Подключение к контейнеру
Чтобы подключиться к терминалу контейнера используйте команду lxc-attach:
lxc-attach -n ubu1
После подключения вы получаете полный root доступ к файлам в контейнере, дальше рекомендуется задать пароль root и создать пользователя:
Настройка системы или установка программ выполняется точно так же, как и в обычной системе, например установка программ:
apt install wget openssh-server htop tmux nano iptables
Выключение контейнера
Когда вы завершили все работы в контейнере, его можно выключить, чтобы он не отнимал системные ресурсы. Для этого выполните:
Эта команда проведет правильное завершение работы контейнера и он больше не будет потреблять ресурсов системы, кроме дискового пространства.
Клонирование контейнеров
После того как вы установили все необходимые программы в контейнере и настроили его как нужно, можно создать несколько его копий для упрощения настройки новых контейнеров и экспериментов. Для этого есть команда clone, которая создает полную копию контейнера:
Для примера давайте создадим клон контейнера ubu1 с именем ubu2. Сначала нужно остановить контейнер:
Затем можно клонировать. Опция -n указывает контейнер источник, а -N — имя нового контейнера:
lxc-copy -n ubu1 -N ubu2
Затем вы опять можете использовать lxc-ls, чтобы убедится, что контейнер был создан:
Моментальные снимки
Если вы хотите экспериментировать с контейнером, вносить какие-либо изменения, которые будет трудно исправить, то можно сделать снимок контейнера, чтобы потом вернуть все как было, с помощью одной команды восстановив снимок. Чтобы создать снимок тоже нужно остановить контейнер:
Затем используйте команду lxc-snapshot для создания снимка:
lxc-snapshot -n ubu1
Будет создан снимок с именем snap0, следующие снимки для этой же машины будут называться snap1, snap2, и так далее. Вы можете восстановить состояние контейнера до снимка в любой момент, для этого используйте опцию -r:
lxc-snapshot -r snap0 -n ubu1
Вам нужно указать имя снимка и имя контейнера.
Запуск контейнера при старте системы
Вы можете настроить запуск контейнера автоматически при старте системы, например, для запуска веб-сервера. Для этого откройте файл конфигурации контейнера и добавьте такие строки:
lxc.start.auto = 1
lxc.start.delay = 5
Первая строка означает, что контейнер нужно запускать при старте системы,а вторая указывает, что нужно подождать пять секунд перед запуском следующего контейнера, если такие есть.
Решение проблем
Если у вас возникнут проблемы с запуском контейнеров, первое что нужно сделать, это попытаться запустить контейнер lxc с опцией -F, запуск не будет отправлен в фоновый режим и вы увидите все ошибки:
lxc-start -n ubu1 -F
Проанализировав вывод команды, вы сможете понять в чем дело и исправить проблемы. Если вы пытаетесь запустить несколько контейнеров одновременно, то можете получить ошибки типа «Quota reached» или «failed to create the configured network». Это потому что вы используете больше сетевых интерфейсов, чем было разрешено. Мы задавали этот параметр в файле /etc/lxc/lxc-usernet. Вначале мы усказали, что можно использовать два сетевых интерфейса, но можно сделать 5:
sudo vi /etc/lxc/lxc-usernet
losst veth lxcbr0 5
Вы можете указать любое нужное число, в зависимости от того сколько контейнеров вам понадобится.
Выводы
Контейнеры Linux можно использовать для решения огромного количества задач. Начиная от средства тестирования настроек или нового программного обеспечения и до изоляции своих приложений для обеспечения максимальной безопасности системы. Обратите внимание, что вы даже можете запускать приложения с графическим интерфейсом с помощью контейнеров.
Установка и настройка LXC Linux полностью рассмотрена и я надеюсь, теперь вам стало понятнее как работать с этой технологией. Ее полезность ограничена только вашей фантазией, так что не бойтесь экспериментировать. Если остались вопросы по настройке контейнеров, спрашивайте в комментариях!
На завершение видео с конференции LinuxPiter, где рассказывается подробно что такое контейнеры Linux и действительно ли они настолько безопасны:
Источник