1. Подготовка сервера Ubuntu и установка среды Docker
Подготовка сервера Ubuntu и установка среды Docker
До появления стандартизированных морских контейнеров в 1950-х годах погрузка судна была хаотичным процессом: бочки, мешки и ящики загружались вручную, часто повреждая друг друга. Изобретение универсального стального контейнера изменило мировую логистику — теперь портовым кранам неважно, что внутри: автомобили или бананы. Они работают со стандартным блоком. В мире разработки программного обеспечения похожую революцию совершил Docker.
Развертывание сложных веб-приложений, таких как Rocket.Chat, исторически требовало ручной установки множества компонентов. Вам нужно было бы установить правильную версию среды выполнения Node.js, настроить базу данных MongoDB, убедиться, что их версии совместимы с вашей операционной системой Ubuntu, и разрешить конфликты зависимостей, если на сервере уже крутятся другие проекты. Docker устраняет эту проблему, упаковывая приложение и все его зависимости в изолированные, стандартизированные программные блоки — контейнеры.
Архитектура: почему именно Docker
Традиционный подход к изоляции приложений — использование виртуальных машин (ВМ). Виртуальная машина эмулирует аппаратное обеспечение и запускает полноценную гостевую операционную систему поверх вашей основной (хостовой) ОС. Если вам нужно запустить три изолированных приложения, вы запускаете три виртуальные машины, каждая из которых потребляет гигабайты оперативной памяти и процессорное время просто на поддержание работы собственных ядер ОС.
Docker использует другой подход — контейнеризацию на уровне операционной системы.
!Сравнение архитектуры виртуальных машин и контейнеров Docker
Контейнеры не содержат собственной операционной системы. Они используют ядро вашей хостовой Ubuntu, но при этом изолированы друг от друга на уровне процессов, файловой системы и сети. Это делает их невероятно легковесными: контейнер запускается за доли секунды и потребляет ровно столько ресурсов, сколько нужно самому приложению, без накладных расходов на эмуляцию ОС. Для Rocket.Chat это означает, что база данных и сам мессенджер будут работать в изолированных средах, не засоряя системные директории вашего сервера, но при этом работать так же быстро, как если бы они были установлены напрямую в Ubuntu.
Подготовка операционной системы
Любая работа с новым сервером на базе Ubuntu начинается с обновления системных пакетов. Пакетный менеджер apt (Advanced Package Tool) использует локальную базу данных, в которой хранится информация о доступных программах и их версиях в официальных репозиториях.
Если сервер был установлен некоторое время назад, эта база данных устарела. Попытка установить новое программное обеспечение со старой базой может привести к ошибкам 404 (сервер не найдет старую версию программы по ссылке) или к нарушению зависимостей.
Процесс обновления состоит из двух строго последовательных шагов. Сначала необходимо обновить саму базу данных пакетов:
Команда update ничего не устанавливает. Она лишь скачивает актуальные списки программ с серверов Ubuntu и сравнивает их с тем, что установлено у вас. После выполнения этой команды терминал часто сообщает, что определенное количество пакетов может быть обновлено.
Второй шаг — фактическая установка новых версий:
Флаг -y (yes) автоматически отвечает утвердительно на вопрос системы «Хотите ли вы продолжить?», что экономит время. Процесс upgrade скачает и установит последние патчи безопасности и минорные обновления для системных утилит. Это критически важный фундамент: установка сложных сред вроде Docker на необновленную систему — прямой путь к конфликтам библиотек.
Установка среды Docker
Существует несколько способов установить Docker на Ubuntu: из стандартных репозиториев Ubuntu, через добавление официального репозитория Docker или с помощью автоматического скрипта.
Для быстрого и надежного развертывания оптимален официальный скрипт автоматической установки. Он самостоятельно определяет версию вашей операционной системы, архитектуру процессора, добавляет нужные GPG-ключи (цифровые подписи, гарантирующие подлинность скачиваемых файлов) и устанавливает самые свежие стабильные версии всех необходимых компонентов.
Выполните в терминале следующую команду:
Разберем, что здесь происходит. Утилита curl обращается к веб-серверу по указанному адресу и скачивает содержимое.
-f (fail) заставляет curl тихо завершиться с ошибкой, если сервер недоступен, не выдавая мусорный HTML-код в терминал.-s (silent) скрывает прогресс-бар скачивания.-S (show-error) в комбинации с -s гарантирует, что если ошибка всё же произойдет, мы её увидим.-L (location) позволяет переходить по редиректам, если файл переехал.-o get-docker.sh сохраняет скачанный текст в локальный файл с названием get-docker.sh.Теперь этот скрипт нужно запустить с правами суперпользователя:
Процесс займет от одной до нескольких минут в зависимости от скорости интернет-соединения сервера. Скрипт установит docker-ce (Community Edition — сам движок), docker-ce-cli (инструмент командной строки для управления движком) и containerd.io (низкоуровневую среду выполнения контейнеров).
Настройка прав доступа
По умолчанию архитектура Docker состоит из двух частей: фоновой службы (демона), которая выполняет всю тяжелую работу по созданию и запуску контейнеров, и клиентской утилиты командной строки (CLI), через которую мы отдаем команды.
Демон Docker взаимодействует напрямую с ядром Linux и требует прав суперпользователя (root). Поэтому, если вы попытаетесь выполнить команду docker ps (показать запущенные контейнеры) от имени обычного пользователя, вы получите ошибку вида permission denied while trying to connect to the Docker daemon socket.
Чтобы не писать sudo перед каждой командой Docker, необходимо добавить вашего текущего пользователя в специальную системную группу docker, которая создается автоматически при установке.
bash
docker compose version
bash
docker run hello-world
``
Эта простая команда запускает сложную последовательность действий, которая является основой работы с любым приложением в Docker.
!Жизненный цикл контейнера при выполнении команды run
Когда вы нажимаете Enter, происходит следующее:
Если вы видите сообщение, начинающееся со слов «Hello from Docker!», значит базовый фундамент полностью готов. Сервер обновлен, среда контейнеризации установлена, права настроены корректно, а плагин Compose ожидает инструкций. Инфраструктура готова к тому, чтобы принять конфигурационный файл и развернуть полноценный сервер Rocket.Chat.