В данной статье рассматривается контейнеризация как эффективный способ виртуализации для различных приложений (сервисов). Также приведен пример создания простейшего dokcer контейнера.
Ключевые слова: контейнеризация, виртуализация, микросервисы, docker, dockerfile, wordpress, phpmyadmin, nginx
Введение.
Контейнеризация — это метод виртуализации, при котором ядро операционной системы поддерживает несколько изолированных экземпляров пространства пользователя вместо одного [1] (как в виртуальных машинах).
Виртуализация в общем случае решает проблему зависимости программного обеспечения от окружения, в котором оно запускается. Например, если вы написали программу под Windows, то для того, чтобы запустить её на Linux’е необходимо создать изолированное окружение. Обычно изолированное окружение представляет собой виртуальную операционную систему.
Для решения проблемы из примера виртуальная ОС подходит хорошо. Но что, если нам необходимо запустить много разных приложений, причем они зависят не только от операционной системы, но и от версий стороннего ПО, которое установлено в данных ОС. Для создания одного изолированного виртуального пространства (виртуальная операционная система) требуется довольно много ресурсов гостевой ОС. Например, для создания виртуальной машины Linux требуется в среднем не менее 10 Гб [2], и это без данных.
Сравнение контейнеров и виртуальных машин.
Контейнеры и виртуальные машины обладают схожими преимуществами изоляции и распределения ресурсов, но функционируют по-разному, поскольку контейнеры виртуализируют операционную систему, а не аппаратное обеспечение. Контейнеры более портативны и эффективны. [3]
Контейнеры
Контейнеры — это абстракция на уровне приложения, которая хранит код и зависимости окружения вместе. Несколько контейнеров могут работать на одной машине и совместно использовать ядро ОС с другими контейнерами, каждый из которых работает как изолированный процесс в пользовательском пространстве. Контейнеры занимают меньше места, чем виртуальные машины (образы контейнеров обычно имеют размер в десятки МБ), могут обрабатывать больше приложений и требуют меньшего количества виртуальных машин и операционных систем. [3]
Виртуальная машина
Виртуальные машины (ВМ) — это абстракция физического оборудования, превращающая один сервер во множество серверов. Гипервизор позволяет запускать несколько виртуальных машин на одной машине. Каждая виртуальная машина включает в себя полную копию операционной системы, приложения, необходимые двоичные файлы и библиотеки — занимая десятки Гб. Виртуальные машины также могут медленно загружаться. [3]
Графическое сравнение контейнеров и виртуальных машин представлено на рисунках 1 и 2.
Рис. 1. Виртуальные машины управляются гипервизором
Рис. 2. Контейнеры управляются докером, дополнительные ВМ не требуются
Растущая популярность контейнеров.
Контейнеризация и распространение микросервисной архитектуры в последнее время набирает большую популярность. Главным лидером рынка является компания Docker. В основном Docker и контейнеризацию внедряют крупные компании со штатом более 5000 человек, и с каждым годом их становится больше [4].
Запуск собственного Docker -контейнера.
Для создания и запуска контейнера необходимо выполнить следующие шаги:
- Написать Dockerfile
- Создать образ контейнера из Dokcerfile
- С помощью образа запустить экземпляр контейнера
Создадим простейший контейнер, который будет содержать web‑сервер nginx, wordpress и phpmyadmin веб-сайты:
Dockerfile:
FROM debian:buster
RUN apt-get update && \
apt-get -y install nginx mariadb-server php7.3-fpm php7.3-mysql openssl
ADD srcs/wordpress.tar.gz /var/www/
COPY srcs/nginx.conf /etc/nginx/nginx.conf
COPY srcs/wp_db_create.sql /etc/
COPY srcs/container_script.sh /etc/
EXPOSE 80 443
RUN mv /var/www/phpMyAdmin-4.9.0.1-all-languages /var/www/phpmyadmin && \
chown -R www-data:www-data /var/www/* && \
rm /etc/nginx/sites-enabled/default && \
service mysql start && \
mysql -u root < /etc/wp_db_create.sql && \
openssl req \
—newkey rsa:2048 -nodes -keyout etc/ssl/certs/localhost.key \
—x509 -days 365 -out etc/ssl/certs/localhost.crt -subj \
"/C=RU/ST=Kamchatka/L=P-Kamchatskii/O=KSTU/CN=localhost» && \
chmod 777 /etc/container_script.sh
CMD /etc/container_script.sh
Ключевое слово FROM определяет базовый дистрибутив, из которого будет собран контейнер.
Ключевое слово RUN определяет команды, которые будут запущены внутри контейнера во время его сборки. В данном случае мы устанавливаем nginx, клиент базы данных, php, и ssl клиент для возможности защищенного подключения к wordpress и phpmyadmin.
Ключевое слово COPY определяет файлы, которые будут скопированы из основной операционной системы внутрь контейнера. В данном примере мы копируем файлы будущих сайтов и.sh скрипт, который будет запускаться при старте контейнера (ключевое слово CMD).
Ключевое слово EXPOSE определяет, какие порты будут открыты у контейнера для взаимодействия с внешней средой. В нашем примере это 80 и 443 порты для подключения к веб-сайтам по протоколам http и https соответственно.
Для создания образа (image) контейнера необходимо выполнить команду:
docker build –t ContainerName.
Точка в конце означает текущую директорию. В общем случае там прописывается путь до dokcerfile.
На экране будет показан статус выполнения команд из докерфайла. Как только образ контейнера будет собран мы можем запустить команду
docker run –p 80:80 –p 443:443 –d ContainerName
Флаги p означают проброс портов между контейнером и основной ОС. Флаг d означает что мы запускаем контейнер в фоновом режиме (detach mode). После того как контейнер запущен, мы можем убедиться, что контейнер работает, выполнив команду:
docker ps
Убедившись в том, что контейнер работает, мы можем подключиться к нашим запущенным из контейнера веб-сайтам.
Полностью исходный код и файлы проекты можно посмотреть в github репозитории автора [https://github.com/vesord/ft_server]
Литература:
- Контейнеризация. — Текст: электронный // Википедия свободная энциклопедия. — URL: https://ru.wikipedia.org/wiki/Контейнеризация (дата обращения 01.12.2020)
- Ибраев М., Месропян Н. Контейнеризация простым языком. — Текст: электронный // Интервью. — URL: https://habr.com/ru/company/southbridge/blog/530226/ (дата обращения 30.11.2020)
- What is a Container. — Текст: электронный // Официальный сайт Docker. — URL: https://www.docker.com/resources/what-container (дата обращения 02.12.2020)
- Docker adoption. — Текст: электронный // Datadog, the essential monitoring and security platform for cloud applications. — URL: https://www.datadoghq.com/docker-adoption/ (дата обращения 03.12.2020)