Установка и базовая настройка Docker и docker compose на VPS
Запустить на сервере одной командой (сначала проверьте содержимое скрипта ниже):
curl -sSL https://cp.lv/scripts/ustanovit-docker-vps.sh | sudo bash…или через wget:
wget -qO- https://cp.lv/scripts/ustanovit-docker-vps.sh | sudo bashСодержимое скрипта ustanovit-docker-vps.sh:
#!/usr/bin/env bash
set -e
export DEBIAN_FRONTEND=noninteractive
# 1. Удаление старых версий
sudo apt-get remove -y docker docker-engine docker.io containerd runc 2>/dev/null || true
# 2. Официальный репозиторий Docker
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 3. Установка Docker Engine и плагинов
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now docker
# 4. Запуск без sudo (применится после нового входа по SSH)
sudo usermod -aG docker $USER
# 5. Ограничение размера логов контейнеров
sudo tee /etc/docker/daemon.json > /dev/null << 'EOF'
{
"log-driver": "json-file",
"log-opts": { "max-size": "10m", "max-file": "3" }
}
EOF
sudo systemctl restart docker
# 6. Проверка
sudo docker run hello-world
docker compose version
echo "Docker готов. Перезайдите по SSH, чтобы работать без sudo."
Docker упаковывает приложение и его зависимости в контейнер, который одинаково работает на любом сервере. Ниже — установка Docker Engine и плагина docker compose из официального репозитория на Ubuntu 22.04/24.04. Не используйте пакет docker.io из стандартного репозитория Ubuntu — он часто устаревший.
Шаг 1. Удаление старых версий
sudo apt remove docker docker-engine docker.io containerd runc 2>/dev/null
sudo apt update
Шаг 2. Подключение официального репозитория Docker
sudo apt install ca-certificates curl gnupg -y
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Шаг 3. Установка Docker Engine и плагинов
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin -y
Включите автозапуск и проверьте работу:
sudo systemctl enable --now docker
sudo docker run hello-world
Если вывелось «Hello from Docker!» — движок работает.
Шаг 4. Запуск Docker без sudo
Добавьте своего пользователя в группу docker, чтобы не писать sudo перед каждой командой:
sudo usermod -aG docker $USER
newgrp docker
docker ps
Изменение группы применяется после нового входа в сессию SSH.
Шаг 5. Проверка docker compose
В современном Docker compose — это подкоманда, а не отдельный бинарник:
docker compose version
Создайте простой стек. Файл docker-compose.yml:
services:
web:
image: nginx:alpine
ports:
- "8080:80"
restart: unless-stopped
volumes:
- ./site:/usr/share/nginx/html:ro
Запуск и проверка:
mkdir site && echo "<h1>It works</h1>" > site/index.html
docker compose up -d
curl http://localhost:8080
Остановить и удалить стек:
docker compose down
Полезные команды на каждый день
| Задача | Команда |
|---|---|
| Список контейнеров | docker ps -a |
| Логи сервиса | docker compose logs -f web |
| Обновить образы | docker compose pull && docker compose up -d |
| Очистить мусор | docker system prune -a |
| Использование диска | docker system df |
Автообновление и безопасность
- Ограничьте размер логов, чтобы контейнеры не забили диск. Откройте файл
/etc/docker/daemon.jsonв редакторе:
sudo nano /etc/docker/daemon.json
Содержимое файла:
{
"log-driver": "json-file",
"log-opts": { "max-size": "10m", "max-file": "3" }
}
Либо создайте файл целиком одной командой — скопируйте и вставьте в консоль:
sudo tee /etc/docker/daemon.json > /dev/null << 'EOF'
{
"log-driver": "json-file",
"log-opts": { "max-size": "10m", "max-file": "3" }
}
EOF
После правки: sudo systemctl restart docker.
- Не публикуйте порты БД наружу (
5432,3306) без необходимости — оставляйте их во внутренней сети compose. - Регулярно обновляйте образы: уязвимости чаще всего в устаревших версиях.
Частые вопросы
Чем отличается docker-compose от docker compose?
Старый docker-compose (с дефисом) — отдельный Python-бинарник v1, снят с поддержки. Новый docker compose (плагин v2) ставится вместе с движком и рекомендуется.
Нужен ли swap для Docker? На сервере с малым объёмом RAM swap помогает пережить пики сборки образов. 1–2 ГБ swap обычно достаточно.
Как автоматически запускать контейнеры после перезагрузки?
Укажите restart: unless-stopped в compose-файле и убедитесь, что сервис Docker включён: systemctl is-enabled docker.
Docker занял весь диск — как почистить?
docker system prune -a удалит неиспользуемые образы, контейнеры и сети. Тома удаляются флагом --volumes (осторожно с данными).
Docker любит быстрый диск и запас памяти под сборки. Подходящие конфигурации — на странице аренда VPS, а под контейнерные проекты возьмите VPS для Docker.
