Допустим, мы хотим запустить интернет-магазин на готовой системе управления, а если торговля пойдёт — запустить ещё несколько подобных магазинов. В магазине нам нужен движок, интерпретатор PHP, система работы с БД PHPMyAdmin и FTP-сервер для работы с файлами.
Можно настроить все эти сервисы вручную:
- Установить PHP и настроить его для наших задач.
- Установить MySQL и PHPMyAdmin.
- Установить движок магазина.
- Связать движок с базой, чтобы в ней хранились все записи о товарах.
- Установить тему для движка, чтобы магазин симпатично выглядел.
- Дописать скрипт, который подключит онлайн-кассу к нашему магазину.
- Установить и настроить FTP-сервер для доступа к файлам.
В результате мы всё сделаем как нужно, но потратим на это много времени. Если через месяц нам нужно будет запустить ещё три таких же магазина, то придётся делать всё то же самое, но уже на других серверах. Кажется, что это можно поручить машине.
Ручная установка всего на сервер — это как приготовить пиццу дома полностью самому: замесить тесто, купить и нарезать овощи и колбасу и так далее. В результате мы получим вкусное блюдо, но потратим на приготовление много времени.
Docker – автоматизация рутинной работы
Если мы заранее знаем, что некоторые наши действия могут повторяться, то идеальным выходом из ситуации будет автоматизация. Мы заранее прописываем все действия в виде скрипта, а потом просто запускаем этот скрипт. Похоже на рецепт пиццы.
По такой технологии работает Docker — программа, которая позволяет запускать подобные скрипты и собирать разный софт в одно целое. Принцип действия Докера такой:
- Есть набор различных программ, которые нужно установить, настроить и запустить.
- Для этого набора программ пишется скрипт, в котором написано, какую программу в какой последовательности нужно ставить и как настраивать. Задача Докера — выполнить эти инструкции и запустить программы как нужно.
- Для каждой программы Докер создаёт виртуальную машину, в которой работает эта программа. Если в скрипте будет 5 программ, Докер сделает 5 виртуальных машин и объединит их в одну виртуальную сеть.
- Эта виртуальная сеть со стороны выглядит как единое целое и называется докер-контейнером.
Получается, что если мы один раз напишем такой скрипт, в котором будут учтены все наши требования к интернет-магазину, то в следующий раз мы можем просто запустить этот скрипт через Докер. Он заведёт весь нужный софт в память и будет исполнять с нужными настройками.
Докер — это как готовая замороженная полуфабрикатная пицца. В ней уже всё готово и нарезано как нужно, нам остаётся только разогреть пиццу в микроволновке. В итоге у нас тоже будет вкусная пицца, но времени мы потратим намного меньше, чем при полноценной готовке.
Пример скрипта
Вот пример из реальной жизни: для тестирования новых тем вордпресса его нужно много раз ставить, скачивать и устанавливать тему, а затем смотреть, что нужно поправить или добавить. Чтобы не делать всё с нуля, программист пишет скрипт — docker-compose.yml, в котором уже всё предусмотрено:
В этом скрипте написано, что у нас в контейнере используются два докер-файла: wordpress и mysql. Строка image отвечает за то, откуда докер возьмёт образы докер-файлов для установки. Их можно брать откуда угодно — с локальной машины, официального репозитория или из любого другого места в интернете. Как только докер доходит до такой строчки, он делает так:
- Находит нужный докер-файл.
- Смотрит, какая операционная система в нём прописана.
- Запускает внутри себя виртуальный образ этой системы.
- Устанавливает в эту виртуальную систему нужный софт, который прописан в докер-файле.
- Смотрит, что написано дальше в скрипте, и меняет настройки виртуальной системы или софта внутри неё.
И так докер делает для каждого докер-файла, который найдёт внутри скрипта. В результате мы получим две виртуальные системы: внутри одной крутится вордпресс, а внутри другой — база данных. Так как в скрипте мы сразу написали нужные настройки, то эти две программы знают, как общаться друг с другом: у вордпресса есть логин и пароль от базы данных. Получилась такая виртуальная сеть из виртуальных машин, которая называется контейнер.
Чтобы получить доступ к вордпрессу, в скрипте есть такая строчка: ports: - 8888:80. Она означает, что все запросы на локальный порт 80 будут перенаправлены в эту виртуальную сеть в наш вордпресс. Если мы в адресной строке браузера введём http://localhost:80, то сразу увидим интерфейс установки вордпресса.
На картинке это можно представить так:
В примере с нашей замороженной пиццей докер-файлы — это начинка: колбаса, ананасы, сыр, томатная паста и специи. Каждый такой докер-файл готовится для пиццы отдельно и не зависит от других. А докер-скрипт — это рецепт приготовления всей пиццы из этих компонентов. Он отвечает за то, чтобы все продукты были в нужном количестве и в нужном месте.
Что такое докер-файл
Докер-файл — это тоже скрипт, но немного с другой задачей. Задача докер-файла такая:
- Сказать, какая операционная система будет виртуально запускаться при запуске.
- Установить и настроить какую-то программу в этой операционной системе.
Например, один докер-файл может отвечать за вордпресс, и тогда в нём будут прописаны все команды для простой установки движка. Другой докер-файл может отвечать за работу базы данных MySQL, и тогда в нём будет написано как её установить и какие ресурсы выделить.
👉 Докер-файл говорит, какую выбрать операционную систему и как в ней установить нужный софт. Скрипт docker-compose.yml говорит, как между собой подружить несколько докер-файлов, чтобы они работали как единое целое.
Как запускать
Если у нас есть скрипт и нужные докер-файлы, то тогда запустить вордпресс на сервере — это задача на три минуты (команды для линукса):
- Установить докер на сервере:
sudo apt install -y docker-ce
. - Закачать туда нужные скрипты и файлы.
- Запустить скрипт
docker-compose.yml: docker compose up -d
.
После этого на нашем сервере будет работать свой Докер, который запустит виртуальный контейнер с нашей сборкой. Для всего интернета это будет выглядеть так, как будто мы на самом деле развернули это на сервере, но на самом деле это всё работает внутри виртуальной машины.
Это так же быстро, как разогреть замороженную пиццу: мы просто ставим её в любую подходящую микроволновку и сразу получаем готовый обед.
А для чего всё это?
Экономия времени при разработке — не главное, хотя Докер действительно сильно упрощает жизнь программистам.
Основная задача этой технологии — возможность масштабирования и запуска десятков и сотен контейнеров одновременно, чтобы справиться с нагрузкой на сайт или сервис. Например, можно запустить одновременно несколько контейнеров с базой данных, если запросов к базе станет слишком много.