Docker — контейнеры и простой запуск приложений на сервере

Что такое Docker?
Docker — платформа для разработки, доставки и запуска приложений в изолированных окружениях, которые называются контейнерами.
Главная идея Docker заключается в том, что приложение можно упаковать вместе с необходимыми библиотеками, зависимостями и настройками, а затем одинаково запускать на разных компьютерах и серверах.
Вместо ручной установки множества компонентов получается простая схема:
Docker Image → Docker Container → работающее приложение
Что такое контейнер?
Контейнер — изолированный процесс, внутри которого работает приложение и находятся необходимые ему файлы и зависимости.
Например, на одном сервере можно одновременно запустить:
- веб-сайт;
- PostgreSQL;
- Redis;
- n8n;
- Ollama;
- систему мониторинга;
- несколько собственных приложений.
Каждый сервис может находиться в отдельном контейнере и иметь собственные настройки, сеть и хранилище.
Docker и виртуальная машина — в чём разница?
На первый взгляд Docker похож на виртуализацию, но контейнер и виртуальная машина устроены по-разному.
Виртуальная машина:
Сервер → Hypervisor → виртуальная машина → собственная ОС → приложение
Docker:
Сервер → операционная система → Docker → контейнер → приложение
Виртуальная машина обычно содержит полноценную гостевую операционную систему со своим ядром. Контейнеры используют ядро хостовой системы и изолируют процессы на уровне операционной системы.
Поэтому контейнеры обычно запускаются быстрее и требуют меньше ресурсов.
Docker Image
Docker Image — это шаблон, на основе которого создаются контейнеры.
Image содержит приложение и необходимые для его запуска компоненты.
Например, образ Nginx можно загрузить командой:
docker pull nginx
После этого из него можно создать контейнер:
docker run -d -p 8080:80 nginx
Параметр -d запускает контейнер в фоновом режиме, а:
-p 8080:80
связывает порт 8080 сервера с портом 80 внутри контейнера.
После запуска веб-сервер будет доступен через порт 8080.
Image и Container
Эти два понятия важно различать.
Image — готовый шаблон приложения.
Container — запущенный экземпляр этого шаблона.
Из одного image можно создать несколько независимых контейнеров.
Docker Hub
Docker Hub — реестр контейнерных образов.
В нём публикуются официальные образы и образы различных разработчиков.
Например, вместо ручной установки PostgreSQL можно загрузить готовый образ:
docker pull postgres
Аналогично доступны образы Nginx, Redis, Node.js, Python, Ubuntu и тысяч других приложений.
Основные команды Docker
Посмотреть работающие контейнеры:
docker ps
Посмотреть все контейнеры:
docker ps -a
Запустить контейнер:
docker start container_name
Остановить:
docker stop container_name
Перезапустить:
docker restart container_name
Удалить:
docker rm container_name
Посмотреть логи:
docker logs container_name
Следить за логами в реальном времени:
docker logs -f container_name
Dockerfile
Если готового образа приложения нет или требуется собственная конфигурация, можно создать Dockerfile.
Dockerfile содержит инструкции для создания image.
Простой пример для Node.js:
FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["npm", "start"]
Создать image можно командой:
docker build -t my-app .
После этого приложение запускается как обычный Docker-контейнер.
Docker Compose
Современное приложение часто состоит не из одного сервиса.
Например:
Frontend + Backend + PostgreSQL + Redis
Запускать каждый контейнер вручную неудобно. Для таких случаев используется Docker Compose.
Конфигурация всей системы описывается в файле:
compose.yaml
Простой пример:
services:
web:
image: nginx:alpine
ports:
- "8080:80"
redis:
image: redis:alpine
После этого оба сервиса можно запустить одной командой:
docker compose up -d
Остановить и удалить созданные контейнеры:
docker compose down
Volumes — где хранятся данные?
Контейнеры удобно считать временными. Их можно удалить и создать заново.
Но базы данных, пользовательские файлы и другая важная информация должны сохраняться независимо от контейнера.
Для этого Docker использует volumes.
Например:
services:
postgres:
image: postgres
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
Теперь данные PostgreSQL находятся в отдельном volume и не исчезнут просто из-за пересоздания контейнера.
Docker Networks
Docker позволяет объединять контейнеры во внутренние сети.
Например:
Web → API → PostgreSQL
При использовании Docker Compose сервисы одной конфигурации могут обращаться друг к другу по именам сервисов.
Например, приложение может обращаться к базе данных по адресу:
postgres:5432
При этом порт PostgreSQL необязательно открывать напрямую в Интернет.
Переменные окружения
Настройки приложений часто передаются через environment variables.
Например:
environment:
DATABASE_HOST: postgres
DATABASE_PORT: 5432
APP_ENV: production
Пароли и API-ключи не следует без необходимости записывать непосредственно в Dockerfile или публиковать в Git-репозитории.
Обновление контейнера
Обычно приложение в Docker обновляется не путём изменения уже работающего контейнера.
Вместо этого загружается новый image и контейнер создаётся заново.
Для Compose-проекта это может выглядеть так:
docker compose pull
docker compose up -d
Docker применит новую конфигурацию и при необходимости пересоздаст контейнеры.
Docker на VPS
Docker особенно удобен на VPS.
На одном Linux-сервере можно разместить множество независимых сервисов:
VPS
│
├── Docker
│ ├── Web App
│ ├── PostgreSQL
│ ├── Redis
│ ├── n8n
│ ├── Ollama
│ └── Monitoring
│
└── Linux
Каждый сервис остаётся логически отделённым от остальных.
Docker и Proxmox
Docker и Proxmox не являются прямыми конкурентами.
Proxmox используется для управления виртуальными машинами и LXC-контейнерами.
Docker используется для контейнеризации приложений.
Один из распространённых вариантов домашнего сервера выглядит так:
Физический сервер → Proxmox → Linux VM → Docker → приложения
Таким образом Proxmox отвечает за инфраструктуру, а Docker — за запуск приложений внутри неё.
Docker и Dokploy
Dokploy, о котором мы рассказывали в отдельной статье, работает поверх контейнерной инфраструктуры и значительно упрощает управление приложениями.
Вместо постоянного использования команд Docker пользователь получает веб-интерфейс:
Git → Dokploy → Docker → приложение
Поэтому понимание основных принципов Docker помогает лучше понимать работу Dokploy и других подобных платформ.
Преимущества Docker
- изоляция приложений;
- быстрое развёртывание;
- повторяемая конфигурация;
- простое обновление сервисов;
- удобный перенос между серверами;
- огромная экосистема готовых images;
- Docker Compose для сложных проектов;
- подходит для VPS, Home Lab и облачной инфраструктуры.
Что важно помнить?
Docker значительно упрощает управление приложениями, но сам по себе не отменяет необходимость администрирования сервера.
Необходимо обновлять систему и контейнерные образы, контролировать открытые порты, правильно хранить секреты, создавать резервные копии volumes и баз данных и ограничивать права контейнеров.
Особенно осторожно следует относиться к доступу к Docker daemon и файлу docker.sock, поскольку такой доступ фактически предоставляет очень широкие возможности управления Docker-хостом.
Кому пригодится Docker?
- веб-разработчикам;
- системным администраторам;
- DevOps-инженерам;
- владельцам VPS;
- пользователям домашних серверов;
- владельцам Proxmox;
- тем, кто использует self-hosted приложения.
Итог
Docker стал одним из основных инструментов современной серверной инфраструктуры.
Он позволяет упаковать приложение и его зависимости в image, запустить его в изолированном контейнере и воспроизводить практически одинаковое окружение на разных системах.
Для небольшого домашнего сервера Docker позволяет удобно разместить несколько независимых сервисов. Для разработчика он упрощает перенос приложения от разработки к production. А Docker Compose позволяет описать целую инфраструктуру приложения в одном конфигурационном файле.
После понимания Docker значительно проще разобраться с такими инструментами, как Dokploy, Portainer, Traefik, n8n и множеством других self-hosted сервисов.
Официальный сайт: docker.com
Документация: docs.docker.com
Docker — платформа контейнеризации, позволяющая запускать приложения вместе с их зависимостями в изолированных контейнерах. Docker упрощает установку, перенос, обновление и развёртывание сервисов на компьютерах, VPS и домашних серверах.