Содержание
Вступление
Что такое Docker
Как готовить контейнеры
Как работать с контейнером
Вступление
Не так давно, буквально несколько месяцев назад, ко мне обратился коллега, который сильно хотел вбежать по карьерной лестнице в страну увеличения уровня абстракции. Другими словами — перестать заниматься пользователями и железом, а начать постигать сервисы и облака. Тогда я как-то и не подозревал,что мне могут задать вопрос «Что такое Docker?», так как сам я знаком с ним сравнительно недавно. И вот, собрать в кучку свой скромный результат изучения, решил я написать статью в которой постараюсь максимально просто и доступно описать, что же это за такой зверёк.
Что такое Docker
Согласно статье Википедии
Docker — программное обеспечение для автоматизации развёртывания и управления приложениями в средах с поддержкой контейнеризации. Позволяет «упаковать» приложение со всем его окружением и зависимостями в контейнер, который может быть перенесён на любую Linux-систему с поддержкой cgroups в ядре, а также предоставляет среду по управлению контейнерами.
Как это выглядит в операционной системе?
На сегодняшний день Docker разворачивается на Linux из пакетных менеджеров deb и rpm -подобных систем.
apt install docker
yum install docker
Для любителей экспериментов, существует так же версия и под Windows, однако десктопная редакция должна быть не ниже уровня Professional.
После установки, не требуется дополнительной настройки, сервис сразу готов к работе, достаточно просто его запустить через менеджер служб.
Как это работает?
Служба Docker разделяется на 3 основные части:
- Клиентская — интерфейс взаимодействия с сервисом посредством команд.
- Сервер — создаёт уровень абстракции контейнеров на сетевом уровне, в файловой системе и окружении, обеспечивая их изоляцию средствами библиотеки libcontainer.
- Контейнеры — службы, выполняемые в изолированном Docker-сервером окружении.
В результате написанного выше, можно сделать вывод: всё, что происходит в контейнере, остаётся в контейнере 🙂
Однако это не совсем так. Сервер Docker позволяет подключать к контейнеру директории с хостовой файловой системы и работать с ними, как с локальными файлами контейнера. Так же легко осуществляется мапинг сетевых портов контейнеров — к портам хоста, что позволяет получить сетевой доступ к контейнеру при обращении на сетевой адрес:порт хоста.
Стоит так же упомянуть одну особенность сетевой доступности между контейнерами. Дело в том, что по-умолчанию, контейнеры подключаются к одному бриджу, созданному сервером Docker и получают адреса, которые им присваивает сервер при запуске. Эти адреса знать не обязательно, так как контейнеры знают друг друга по-имени и могут таким образом взаимодействовать между собой.
Как готовить контейнеры
Рассмотрим пример создания сайта на обработчике php. Выберем распространённый движок WordPress и сделаем полноценный сайт, работающий в контейнере, с самого начала. Нам понадобится уже рабочая служба Docker и СУБД на движке mysql с созданной пустой базой, пользователем и правами. Как настроить БД можно посмотреть здесь.
За основу возьмём уже готовый image из реестра docker. Выполним команду:
docker run --name my-wordpress -p 8080:80 \
-e WORDPRESS_DB_HOST=<dbhost>:3306 -e WORDPRESS_DB_USER=<dbuser> -e WORDPRESS_DB_PASSWORD=<dbpass> \
-v <plugins_dir>:/var/www/html/wp-content/plugins/ -v <themes_dir>:/var/www/html/wp-content/themes/ -v <uploads_dir>:/var/www/html/wp-content/uploads \
-d wordpress
где требуется указать <dbhost> — имя сервера mysql, <dbuser> — имя пользователя mysql, <dbpass> — пароль пользователя mysql, а так же <plugins_dir> — директория на хосте в которой будут храниться плагины, <themes_dir> — директория на хосте в которой будут храниться темы, <uploads_dir> — директория на хосте, в которую wordpress будет загружать медиафайлы.
Разберём подробнее все аргументы команды:
docker — вызов клиента службы.
—name — параметр для задания имени контейнера. В данном случае контейнер будет называться my-wordpress.
-p — мапинг порта хоста — к порту контейнера. В данном случае порт хоста 8080, а контейнера — 80.
-e — задание глобальной переменной окружения в контейнере. Например -e WORDPRESS_DB_HOST=127.0.0.1:3306
-v — задание директории/файла хоста, которые будут доступны внутри контейнера. Например -v /mnt/storage/wordpress/uploads/:/var/www/html/wp-content/uploads/
-d — отцепиться от контейнера после создания и отправить его в фоновое выполнение.
wordpress — произвольное имя образа контейнера, на основе которого он будет создан. Образ будет скачан из реестра docker.
Данный пример является демонстрацией базовых фич docker и не является окончательным для WordPress. В результате мы получим работающий контейнер с сайтом, который доступен на порту хоста 8080. Как собрать контейнер пригодный для разработки, описано в статье Русский wordpress на docker + docker-compose.
Как работать с контейнером
В основе контейнера лежит его образ (image), который содержит в себе компоненты, нужные для работы. Эти компоненты могут изменяться в процессе работы контейнера, но образ остаётся неизменным. Это значит, что если удалить контейнер и создать его снова, все изменения будут утрачены. Такой эффект достигается за счёт файловой системы aufs, лежащей в основе образа, которая наслаивает изменения на уже имеющиеся. Чтобы сохранить изменения контейнера, нужно его закоммитить и тем самым родится новый образ. Так же на основе существующего образа можно создать новый образ и сохранить его.
Из сказанного выше, становится ясно, что контейнер — это песочница. Контейнеры удобно разворачивать и масштабировать. Для этого существуют системы оркестрации и инструменты CI/CD.
Простейшие манипуляции с контейнером подразумевают его остановку/запуск, подключение в окружение контейнера.
docker container <stop|start> <name|ID>
docker <stop|start> <name|ID>
docker exec -it <name|ID> <command>
Описание всех команд доступны по вызову docker help
.
Заключение
На этом краткое описание работы службы заканчиваю. Старался максимально доступно описать работу службы и взаимодействие с ней. Если что-то упустил, или напутал, пишите в комментариях.
Свежие комментарии