Концепция разделения ресурсов сейчас правит в множестве инфраструктур корпоративных сетей. Теперь один сервер может содержать десяток виртуальных пространств, которые работают независимо друг от друга, какие-то объединяются в общие платформы или работают сообща.
Сегодня на примере технологии виртуализации и платформы для построения подобной виртуальной среды Docker – установим и развернем образ контейнера Python.
Развертывание контейнера Docker
Базово нам необходима сама платформа, для этого обновите индексы пакетов и установите Docker, в случае, если он уже предустановлен – пропустите шаг. Для deb-подобных систем будем использовать автоматизированный скрипт развертывания:
sudo apt purge -y docker.io docker-compose docker-doc podman-docker \
curl -fsSL https://get.docker.com -o get-docker.sh \
sudo bash get-docker.sh

После по всем канонам и мерам предосторожности нам необходимо создать пользователя от чьего лица будет запускаться контейнер, с пониженными привилегиями. Чтобы в случае побега нарушителя из него с помощью запуска вредоносных команд мы могли увеличить TTA или Time-To-Attack. Для этого используем команды:
sudo adduser python && sudo usermod -aG docker python
Так как обращаться к Docker-сокету может только root или пользователи группы docker, то нам необходимо добавить python пользователя к ней. После чего мы сможем запустить базовый контейнер с окружением Python на борту.
Для этого создадим цикл в интерпретаторе bash и зайдем внутрь контейнера, чтобы просмотреть процессы:
sudo -u python docker run --name my_container -v data-storage:/home -d python /bin/bash -c ‘while true;do sleep 1000;done’ && sudo docker ps
Где каждая из представленных опций и аргументов выполняет свою функцию в запуске контейнера:
- sudo -u python docker run – запускает контейнер с правами обычного пользователя;
- –name my_container – задает имя контейнера my_container;
- -v data-storage:/home – монтирует том data-storage в /home внутри контейнера;
- -d – запускает контейнер в фоновом режиме (detached mode);
- python – использует образ python для создания контейнера;
- /bin/bash -c ‘while true; do sleep 1000; done’ – выполняет бесконечный цикл внутри контейнера:
- /bin/bash -c – запускает команду через Bash;
- sudo docker ps – после успешного запуска контейнера выводит список работающих контейнеров.
Для входа в контейнер будем использовать команду вида:
docker exec <container-id> /bin/bash 
После чего обновим пакеты на машине и установим менеджер процессов, где просмотрим структуру нашего запущенного PID пространства:

Внутри мы видим совокупность нашего авто-запущенного процесса и текущей сессии. Обычно для работы контейнеров, где нет готового сервиса необходимо подготовить соответствующие ресурсы. При создании облачного сервера от Serverspace, у каждого из стандартных репозиториев задан ключ. Для выполнения тестов, вы можете использовать изолированную среду VPS сервера, на любой из двух платформ vStack cloud или же VMware cloud. Нажмем на кнопку Создать сервер и выберем конфигурацию, подходящую под наши задачи, затем нажмем кнопку Создать.

Потребуется некоторое время для развертывания серверных мощностей. После чего вы можете подключиться любым из удобных способов.
Разворачиваем сервис в Docker контейнере
К примеру, возьмем вполне рабочий кейс, где нам в таком контейнере необходимо развернуть сервис веб-приложения. Для этого мы должны взять базовый образ, пусть это останется минимальный набор окружения Python, который необходимо модифицировать. Не зря он считается минимальным, некоторые библиотеки нужно будет докачать в процессе.
Решить это можно двумя путями: в первом случае мы прописываем команду автозапуска для начала работы и кладем приложение в хранилище, которое подключим или пересобираем образ. Конечно, более корректным способом реализации является второй, там не хранится длинная строка автозагрузки и контейнер запускается сразу с вашими файлами.
Воспользуемся первым и сохраним, не выходя из предыдущей сессии файл в папку, которую присоединили к виртуальному хранилищу:
nano /home/app.py 
После этого, выйдем из него, остановим и удалим:
sudo docker stop $(sudo docker container ls -q -a) && sudo docker remove $(sudo docker container ls -q -a) Пропишем автозапуск с обновлением индексов пакетом, установкой менеджера пакетов Python, а так же запуском приложения:
sudo -u python docker run --name my_container -d -v data-storage:/home -it python /usr/bin/bash -c ‘apt update && apt install python3-pip -y && python3 -m pip install flask && python3 /home/app.py’
Спустя некоторое время его развертывания необходимо проверить, запустился ли он. Просмотрим его логи командой:
sudo docker logs <container-id>
Отлично, сервис был запущен в виртуальной среде на машине, рядом с которым можно запустить еще десяток подобных и каждый будет работать в своей изолированной среде, что повышает эффективность работы без коллизий пакетов зависимости, так и безопасность подобного подхода.