Как развернуть контейнер Docker на VPS с Debian

Как развернуть контейнер Docker на VPS с Debian

Представьте: ваш код работает одинаково на любом сервере — без правок под версии PHP, Python или библиотек. Рассказываем, как этого добиться с помощью Docker на VPS с Debian. В статье — установка Docker, настройка контейнеров, запуск приложений и советы по оптимизации и безопасности.

Docker — это технология контейнеризации, позволяющая упаковывать приложения и их зависимости в изолированные среды. Используя контейнеры, разработчики и администраторы могут разворачивать сервисы на любых системах без конфликтов версий и ручной настройки окружения. В статье мы разберём, как установить Docker на виртуальный сервер под управлением Debian, настроить базовые контейнеры и запустить веб-приложение. В процессе вы научитесь использовать образы из Docker Hub, управлять запуском и остановкой контейнеров, настраивать проброс портов, а также обеспечивать безопасность за счёт настройки прав и своевременного обновления образов. К концу руководства вы сможете быстро разворачивать приложения в изолированных средах, экономя время на настройке выделенных серверов и VPS.

Подготовка VPS с Debian

Перед установкой Docker обязательно подготовьте систему: обновите пакеты и установите зависимости, чтобы избежать конфликтов версий и обеспечить безопасное взаимодействие с репозиториями. Начните с выполнения команды:

sudo apt update && sudo apt upgrade -y

Первая часть (apt update) обновляет локальный список доступных пакетов, синхронизируя его с источниками из файлов в /etc/apt/sources.list. Вторая часть (apt upgrade -y) устанавливает обновления для всех установленных пакетов. Флаг -y автоматически подтверждает действие, избавляя от необходимости вручную нажимать «Y» в процессе. Этот шаг критичен: устаревшие библиотеки или ядро могут привести к ошибкам при установке Docker или его работе.

Затем установите вспомогательные пакеты:

sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release -y

Каждый из них решает конкретную задачу:

  • apt-transport-https — добавляет поддержку HTTPS-протокола для работы с репозиториями через зашифрованное соединение.
  • ca-certificates — содержит корневые SSL-сертификаты, необходимые для проверки подлинности удалённых серверов (например, Docker Hub).
  • curl — утилита для загрузки файлов по URL, которая понадобится для импорта GPG-ключа Docker.
  • gnupg — реализация PGP для управления криптографическими ключами (проверка подписи пакетов).
  • lsb-release — предоставляет информацию о версии ОС, что помогает автоматически определить код имени дистрибутива (например, bullseye для Debian 11).

Все они создают базовую инфраструктуру для безопасной установки Docker из официального репозитория. Без них система не сможет корректно проверить подлинность пакетов или подключиться к защищённым источникам.

Установка Docker на Debian

Для установки Docker потребуется подключить официальный репозиторий — это гарантирует получение актуальных и проверенных пакетов. Начните с импорта GPG-ключа, которым подписаны пакеты Docker. Он подтверждает, что файлы не были изменены злоумышленниками. Выполните команду:

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg  

Здесь curl загружает ключ с сайта Docker, а gpg --dearmor преобразует его из ASCII-формата в бинарный, сохраняя в /usr/share/keyrings/. Флаг -fsSL у curl отключает вывод прогресса (-s), включает следование перенаправлениям (-L) и подавляет ошибки при их возникновении (-f).

Далее добавьте репозиторий в систему. Команда автоматически подставит архитектуру вашего процессора и версию Debian:

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null  

Опция arch=$(dpkg --print-architecture) определяет разрядность ОС (например, amd64), а $(lsb_release -cs) возвращает кодовое имя дистрибутива (например, bullseye). Параметр signed-by указывает путь к ранее импортированному ключу — без этого система откажется загружать пакеты из репозитория.

Обновите список пакетов и установите Docker Engine:

sudo apt update 
sudo apt install docker-ce docker-ce-cli containerd.io -y  

Здесь:

  • docker-ce — основной пакет Docker Community Edition.
  • docker-ce-cli — интерфейс командной строки.
  • containerd.io — среда выполнения контейнеров. 

Проверьте корректность установки. Команда docker --version выведет текущую версию Docker (например, 24.0.7). Затем запустите тестовый контейнер:

sudo docker run hello-world  

Если всё настроено верно, вы увидите сообщение «Hello from Docker!». Это означает, что Docker успешно скачал образ, создал контейнер и выполнил его. Обратите внимание на предупреждение о правах: по умолчанию только пользователь с правами root или состоящий в группе docker может управлять контейнерами.

Базовые команды Docker: управление контейнерами и образами

После установки Docker можно приступать к работе с контейнерами. Начнём с загрузки образа — шаблона, на основе которого создаются контейнеры. Образы хранятся в реестрах, и самый популярный из них — Docker Hub. Например, чтобы скачать официальный образ Nginx, выполните:

docker pull nginx:latest  

Здесь nginx — название образа, а latest — тег, указывающий версию. Использование тега помогает избежать проблем с совместимостью: например, nginx:1.25 загрузит указанную версию. Если тег не проставлен, Docker берёт latest, но это не всегда безопасно — версия может измениться.

Контейнер запускается из образа с помощью docker run. Для примера развернём Nginx:

docker run -d --name my-nginx -p 80:80 nginx  

Разберём параметры:

  • -d (detach) — фоновый режим. Без этого флага контейнер привяжется к текущему терминалу, и вы не сможете вводить команды.
  • --name my-nginx — имя контейнера. Если не задать, то будет присвоено случайное.
  • -p 80:80 — проброс портов. Первое значение — на хосте, второе — в контейнере. Если на хосте порт 80 занят, укажите другой.

После запуска проверьте, какие контейнеры активны:

docker ps  

Будут выведены ID, имена, статусы и порты. Чтобы увидеть все контейнеры (включая остановленные), добавьте флаг -a:

docker ps -a  

Для остановки контейнера выполните:

docker stop my-nginx  

Если контейнер не реагирует, завершите его принудительно:

docker kill my-nginx  

После остановки контейнер сохраняется на диске. Чтобы удалить его, используйте:

docker rm my-nginx  

Для удаления запущенного контейнера добавьте флаг -f (force):

docker rm -f my-nginx  

Другие полезные команды

Просмотр логов:

docker logs my-nginx  

Добавьте -f для потокового вывода (аналог tail -f):

docker logs -f my-nginx  

Выполнение команд внутри контейнера:

docker exec -it my-nginx bash  

-it — интерактивный режим с псевдо-TTY, а bash — запуск оболочки внутри контейнера.

Выведение списка образов:

docker images  

Удаление образов:

docker rmi nginx:latest  

Очистка системы. Удаление всех остановленных контейнеров:

docker container prune  

Удаление образов без тегов (dangling):

docker image prune  

Docker кеширует данные, и удаление образа не повлияет на контейнеры, созданные из него. Поэтому, если нужно, удаляйте все связанные контейнеры.

Пример развертывания веб-приложения на VPS

Развернём веб-сервер Nginx с пользовательским контентом. Для этого потребуется связать папку на хосте с директорией внутри контейнера — это позволит редактировать файлы сайта без пересборки образа. Запустите контейнер следующей командой:

docker run -d --name webserver -p 8080:80 -v ~/site:/usr/share/nginx/html nginx  

Разберём ключевые параметры:

  • -d — фоновый режим. Контейнер продолжит работать после закрытия терминала.
  • --name webserver — имя контейнера для удобного управления (остановка, удаление, просмотр логов).
  • -p 8080:80 — проброс портов. Запросы к порту 8080 на хосте будут перенаправляться на порт 80 в контейнере, где работает Nginx.
  • -v ~/site:/usr/share/nginx/html — подключение тома.

Директория ~/site на сервере будет синхронизирована с /usr/share/nginx/html внутри контейнера, где Nginx ищет статические файлы.

Перед запуском создайте папку ~/site и добавьте в неё файлы сайта. Например, создайте простой index.html:

mkdir -p ~/site 
echo "<h1>Hello from Docker!</h1>" > ~/site/index.html  

Если в ~/site уже есть файлы, Nginx автоматически начнёт их обслуживать. Это удобно: вы можете менять содержимое сайта на лету, и контейнер будет сразу отображать изменения.

Для проверки откройте в браузере адрес вида http://<IP-адрес вашего VPS>:8080. Если вы не знаете IP сервера, выполните:

curl ifconfig.me  

Дополнительные настройки и команды:

Изменение порта. Если порт 8080 занят, замените его на другой (например, -p 8000:80).

Права доступа. Убедитесь, что пользователь внутри контейнера (обычно nginx) имеет права на чтение файлов в ~/site. Если возникли ошибки 403, выполните:

chmod -R 755 ~/site  

Просмотр логов. Чтобы отслеживать ошибки или запросы к серверу, используйте:

docker logs webserver  

Добавьте флаг -f для потокового вывода логов в реальном времени.

Рестарт контейнера. Если вы изменили настройки Nginx (например, конфиг в ~/site), перезапустите контейнер:

docker restart webserver  

При удалении контейнера (docker rm webserver) данные в ~/site сохранятся, так как том привязан к файловой системе хоста. Это отличает тома от временных файловых систем внутри контейнера.

Если нужно обновить версию Nginx, остановите контейнер, выполните docker pull nginx:latest и запустите его заново с теми же параметрами. Docker автоматически использует обновлённый образ, а ваши файлы останутся в ~/site.

Советы по управлению контейнерами и обеспечению безопасности

Эффективное управление контейнерами и соблюдение правил безопасности — важные аспекты работы с Docker. Начнём с мониторинга — для просмотра логов контейнера выполните:

docker logs python-app

Это выведет историю сообщений приложения, в том числе ошибки и HTTP-запросы. Чтобы отслеживать логи в реальном времени, добавьте флаг -f (follow), а для ограничения количества строк — --tail N, где N — число последних записей.

Для автоматического перезапуска контейнера при перезагрузке сервера или аварийном завершении работы примените политику рестарта:

docker update --restart unless-stopped python-app  

Параметр unless-stopped означает, что контейнер будет перезапущен при любом завершении работы Docker, кроме случаев, когда его остановили вручную. Альтернативные политики:

  • no — отключение автозапуска.
  • on-failure — перезапуск только при ошибках (код выхода != 0).
  • always — принудительный рестарт, даже после ручной остановки.

Очистка системы помогает освободить место на диске. Удалите все остановленные контейнеры командой:

docker container prune  

Для точечного удаления используйте фильтры. Например, чтобы стереть контейнеры, созданные более недели назад:

docker container prune --filter "until=168h"  

Полная очистка (образы, тома, сети) выполняется через:

docker system prune -a  

Теперь перейдём к безопасности.

Запуск от непривилегированного пользователя. Docker с дефолтными настройками требует прав root, что создаёт риски. Чтобы запускать контейнеры без sudo, добавьте нужного пользователя в группу docker:

sudo usermod -aG docker $USER  

После выполнения команды перезапустите сессию терминала (выйдите и войдите заново).

Регулярное обновление образов. Образы из Docker Hub могут содержать уязвимости. Чтобы загрузить актуальные версии с исправлениями, выполните:

docker pull nginx:latest  

Для автоматизации используйте инструменты, которые следят за обновлениями и пересоздают контейнеры (Watchtower).

Использование .dockerignore. Этот файл исключает ненужные файлы (кеш IDE, временные данные) из контекста сборки образа. Пример содержимого:

.git 
__pycache__ 
*.log 
.env  

Без .dockerignore секреты из .env или тяжёлые файлы могут попасть в образ, увеличив его размер и риск утечки данных.

Сканирование образов на уязвимости. Инструмент docker scan (ранее — Snyk) проверяет образы на известные CVE-уязвимости:

docker scan my-python-app  

Ограничение ресурсов. Задавайте лимиты CPU и RAM для контейнеров, чтобы предотвратить исчерпание ресурсов сервера:

docker run -d --name python-app --cpus 2 --memory 512m my-python-app  

Дополнительные рекомендации:

  • Избегайте образа latest — явно указывайте версии (например, nginx:1.25), чтобы избежать неожиданных изменений.
  • Не храните секреты в образах — используйте Docker Secrets или переменные окружения (-e KEY=VAL).
  • Пишите минимальные Dockerfile — уменьшайте количество слоёв и удаляйте временные зависимости в одном RUN.

Эти действия помогут поддерживать стабильную работу контейнеров, снизить риски атак и упростить обслуживание инфраструктуры.

Заключение

Теперь вы умеете разворачивать Docker-контейнеры на VPS с Debian: устанавливать движок, управлять образами, настраивать тома. Эти навыки позволяют быстро переносить проекты между средами, изолировать зависимости и экономить ресурсы за счёт контейнеризации. Для углубления знаний научитесь создавать собственные приложения через Dockerfile, освойте Docker Compose — инструмент для управления многоконтейнерными приложениями, подключите мониторинг через cAdvisor и экспериментируйте с сетевыми настройками (например, мостами или overlay-сетями).

Не забывайте о безопасности: регулярно обновляйте образы, используйте .dockerignore и ограничивайте права контейнеров. Docker широко применяется в разработке и DevOps — чем больше вы с ним работаете, тем увереннее сможете решать инфраструктурные задачи.

Читайте в блоге:

Loading spinner
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

VPN на VPS-сервере

Узнайте, как создать собственный VPN на VPS-сервере для защиты ваших конфиденциальных данных!

Что будем искать? Например,VPS-сервер

Мы в социальных сетях