Docker серьёзно изменил подход к разработке и развёртыванию приложений. По результатам опроса Stack Overflow за 2023 год, более 63 % разработчиков используют его регулярно. Контейнеры позволяют собирать, тестировать и запускать проекты быстрее и надёжнее — без лишней зависимости от окружения.
Если вы работаете с Docker на выделенном сервере, у вас в распоряжении всё: полные права, максимум ресурсов и никакого «соседства». Это отличный выбор, когда важны производительность, безопасность и стабильность под нагрузкой. Но одно дело — просто пользоваться Docker, и совсем другое — выжимать из него максимум, особенно в более сложной инфраструктуре.
В этом руководстве мы разберёмся, как устроены Docker-контейнеры, как их разворачивать и запускать, а также что можно сделать, чтобы они работали быстрее и стабильнее. Пошагово, без спешки, с акцентом на практику.
Контейнер Docker — это лёгкий, автономный пакет, в котором уже есть всё, что нужно для запуска приложения: сам код, системные утилиты, библиотеки и настройки. Проще говоря, это как небольшая коробка, где собраны все компоненты, чтобы приложение могло работать где угодно — главное, чтобы на системе был установлен Docker.
Вот основные элементы, на которых всё держится:
Контейнеры запускаются быстро и не требуют много системных ресурсов — в отличие от виртуальных машин. Это делает их отличным выбором для работы на выделенных серверах, где важны производительность и стабильность.
Если коротко: Docker-контейнеры делают приложения переносимыми, быстрыми и предсказуемыми в работе. Освоив эти основы, вы готовы переходить к практике — и запускать Docker уже на настоящем сервере.
Запуская Docker на выделенном сервере, вы получаете полный контроль над системой. Все ресурсы сервера доступны только вам — это положительно сказывается на скорости, безопасности и работе с ресурсоёмкими задачами.
Docker поддерживает большинство дистрибутивов Linux — таких как Ubuntu, CentOS и Debian. Чтобы установить Docker, выполните следующие шаги:
Для Ubuntu/Debian:
sudo apt update
sudo apt install docker.io -y
sudo systemctl start docker
sudo systemctl enable docker
Для CentOS/RHEL:
sudo yum install -y docker
sudo systemctl start docker
sudo systemctl enable docker
Эти команды установят Docker Engine на ваш сервер. Если вы используете другую операционную систему, следуйте официальной инструкции по установке.
После установки убедитесь, что Docker запущен:
sudo systemctl status docker
Вы должны увидеть сообщение, что служба active (running). Чтобы дополнительно проверить работу Docker, запустите тестовый контейнер:
sudo docker run hello-world
Эта команда загрузит тестовый образ и запустит контейнер. Если в консоли появится приветственное сообщение — значит, развертывание Docker-контейнера прошло успешно.
Также стоит убедиться, что ваш пользователь может запускать Docker без sudo. Для этого добавьте его в группу docker:
sudo usermod -aG docker $USER
После этого выйдите из системы и снова войдите, чтобы изменения вступили в силу.
Теперь, когда Docker установлен и настроен на вашем выделенном сервере, можно перейти к запуску контейнеров. Именно на этом этапе Docker по-настоящему раскрывает свой потенциал: вы можете запускать приложения в изолированной среде, не опасаясь конфликтов с другим ПО.
Чтобы создать контейнер, нужен образ. Образ — это своего рода шаблон, по которому разворачивается контейнер. Вы можете использовать готовые образы с Docker Hub или собрать свой собственный.
Загрузка образа из Docker Hub:
docker pull nginx
Эта команда скачает официальный образ веб-сервера NGINX.
Также вы можете создать собственный образ с помощью Dockerfile. Вот простой пример:
# Use base image
FROM ubuntu:latest
# Install curl
RUN apt update && apt install -y curl
# Set default command
CMD ["curl", "--version"]
Построение образа:
docker build -t my-curl-image
В результате будет создан новый образ с именем my-curl-image.
Запустить контейнер из образа в Docker — очень просто. Для этого используется команда docker run. Например, чтобы запустить контейнер с веб-сервером Nginx, выполните:
docker run -d -p 80:80 nginx
Эта команда создаёт и запускает контейнер с NGINX. Что означают параметры:
Теперь можно открыть IP-адрес вашего сервера в браузере и увидеть стандартную страницу Nginx.
Развёртывание контейнера — это его запуск в рабочем окружении, например, на сервере или в облаке.
Пример команды:
docker run -d --name web-server -p 80:80 nginx
Здесь запускается контейнер NGINX, которому задаётся имя web-server, и он становится доступен по порту 80.
Вот несколько хороших практик:
Ниже — основные команды для управления работающими и завершёнными контейнерами:
Остановить работающий контейнер:
docker stop web-server
Удалить контейнер:
docker rm web-server
Удалить все остановленные контейнеры:
docker container prune
Грамотное управление контейнерами помогает поддерживать систему в порядке и не тратить ресурсы впустую.
Docker-образы — это основа контейнеров. Они содержат приложение и всё необходимое для его запуска. Со временем может понадобиться обновлять образы или более эффективно ими управлять. Ниже — как это делать.
Если вы создали образ или внесли в него изменения, его можно опубликовать в реестре. Наиболее популярный вариант — Docker Hub, но вы также можете использовать приватные реестры.
Шаг 1. Вход в Docker Hub. Выполните авторизацию в Docker с помощью логина и пароля:
docker login
Шаг 2. Тегирование образа. Перед загрузкой образ нужно «пометить» (тегировать) с указанием имени пользователя и репозитория. Формат — username/repository:tag.
Пример: если ваш логин — myuser, а вы хотите назвать репозиторий my-app с тегом latest, то команда будет такой:
docker tag my-curl-image yourusername/my-curl-image
(Замените my-curl-image на фактическое имя или ID вашего локального образа.)
Шаг 3. Загрузка образа в реестр.
docker push yourusername/my-curl-image
Теперь ваш образ доступен в Docker Hub, и его можно скачать с любого сервера:
docker pull yourusername/my-curl-image
Обновление контейнера обычно означает обновление образа, на котором он основан.
Шаг 1. Получите последнюю версию образа:
docker pull <image_name>
Шаг 2. Пересоздайте контейнер:
docker rm -f <container_name_or_id>
docker run -d --name <container_name> <image_name>
Эти команды остановят и удалят старый контейнер, а затем создадут новый — уже с обновлённым образом.
С помощью тегов удобно отслеживать версии образов. Например, вы можете использовать теги v1, v2 и latest — это позволяет выбрать нужную версию для развертывания в зависимости от ситуации.
Чтобы посмотреть все образы на сервере:
docker images
Команда выведет список всех доступных образов и их тегов.
Вы можете устанавливать программное обеспечение внутри контейнера так же, как и в обычной системе Linux. Это особенно полезно при создании собственных образов для вашего приложения или сервиса.
Чтобы установить ПО, используется файл Dockerfile — он указывает Docker, что нужно делать при сборке образа.
Пример простого Dockerfile:
FROM ubuntu:latest
RUN apt update && apt install -y curl
CMD ["curl", "--version"]
В этом примере:
Сборка образа:
docker build -t my-custom-container
Запуск контейнера:
docker run my-custom-container
Вы можете добавлять любое ПО, необходимое вашему приложению, с помощью команды RUN в Dockerfile. Это позволяет подготовить полностью рабочее окружение сразу при запуске контейнера.
Также можно подключиться к уже работающему контейнеру и установить ПО вручную:
docker exec -it container_name bash
Внутри контейнера можно выполнять обычные команды, например:
apt install nano
Но важно помнить: все вручную установленные пакеты исчезнут, как только контейнер будет остановлен или удалён. Для постоянного использования всегда добавляйте ПО через Dockerfile.
Если вы всё же внесли изменения вручную и хотите сохранить их, создайте новый образ командой:
docker commit <container_name_or_id> new-image-name
Так вы получите новый образ, включающий все изменения, сделанные внутри контейнера.
Идеальное решение для масштабных проектов. Безупречная защита, высокая производительность и гибкая настройка.
Некоторым приложениям — например, для машинного обучения или обработки видео — требуется графический процессор (GPU) для ускорения вычислений. Docker позволяет использовать GPU сервера внутри контейнеров, но для этого его нужно правильно настроить.
Да, несколько Docker-контейнеров могут совместно использовать один GPU. Это удобно, если вы запускаете разные задачи, которым нужен доступ к графическим ресурсам. Главное условие — чтобы у GPU было достаточно памяти и вычислительной мощности, чтобы «потянуть» всё одновременно.
Чтобы дать контейнерам доступ к GPU, необходимо установить NVIDIA Container Toolkit. Вот как это сделать:
Установите драйверы NVIDIA на хост-систему (не в контейнер). А после установите сам тулкит:
sudo apt install nvidia-container-toolkit
sudo systemctl restart docker
Запустите тестовый контейнер с доступом к GPU:
docker run --gpus all nvidia/cuda:11.0-base nvidia-smi
Эта команда проверяет, видит ли контейнер видеокарту.
Если нужно ограничить доступ только к одному GPU:
docker run --gpus '"device=0"' nvidia/cuda:11.0-base nvidia-smi
Так можно разворачивать контейнеры с поддержкой GPU для задач вроде машинного обучения или видеорендера.
Вы можете запускать несколько контейнеров с GPU одновременно. Главное — следить за тем, чтобы каждый из них использовал отдельный GPU или корректно делил ресурсы без перегрузки.
Пример запуска контейнера с поддержкой GPU:
docker run -d --gpus all my-gpu-app
Для более гибкого управления удобно использовать Docker Compose с GPU-настройками или развертывание контейнеров через Kubernetes.
Запуск Docker-контейнеров на выделенном сервере даёт полный контроль над окружением. Но чтобы получить максимальную отдачу, стоит придерживаться нескольких простых рекомендаций.
Выбирайте минималистичные базовые образы, такие как alpine или версии slim. Чем меньше образ — тем меньше он занимает места и быстрее запускается.
FROM python:3.9-slim
Можно задать, сколько CPU и оперативной памяти доступно контейнеру. Это помогает избежать перегрузки сервера.
Пример:
docker run -d --memory=512m --cpus=1 my-app
Не стоит хранить данные внутри контейнера. Вместо этого подключайте Docker volume — это ускоряет работу и сохраняет данные при перезапуске.
docker run -v mydata:/app/data my-app
Старые образы могут использовать больше памяти или содержать уязвимости. Периодически пересобирайте и разворачивайте контейнеры на базе свежих образов и актуального ПО.
docker pull yourimage:latest
Удаляйте старые образы, остановленные контейнеры и неиспользуемые тома, чтобы освободить дисковое пространство:
docker system prune
Или точечно:
docker image prune
docker container prune
Для базового мониторинга используйте встроенный инструмент Docker Stats:
docker stats
Для более подробного анализа можно подключить сторонние решения: Prometheus, Grafana, cAdvisor и другие.
Развёртывание Docker-контейнеров на выделенном сервере — это удобный и эффективный способ управления современными приложениями. Вы получаете больше контроля, лучшую производительность и гибкость в настройке.
В этом руководстве мы прошли весь путь — от установки Docker до расширенных приёмов для повышения эффективности. Вы узнали, как создавать контейнеры, запускать их из образов, управлять ими и разворачивать в продакшене, придерживаясь проверенных практик: использовать лёгкие образы, ограничивать ресурсы, регулярно обновлять окружение.
Этот материал поможет вам выстроить надёжную, удобную и предсказуемую систему на базе контейнеров. Неважно, работаете ли вы с одним контейнером или управляете целым стеком — важно следить за безопасностью, обновлениями и стабильной работой.
Чтобы упростить рабочие процессы, используйте чистые образы, мониторинг и инструменты автоматизации — так вы сэкономите время и избежите лишних ошибок.