Шаг 3 · Для начинающих · 35 минут

Docker без магии: собираем и запускаем первый контейнер

Docker часто объясняют набором команд. Мы пойдём от задачи: почему приложение «работает у меня», но ломается на сервере, и как контейнер решает эту проблему.

Контейнер, образ и Compose — на пальцах

Образ — неизменяемый шаблон с операционной системой, программой и зависимостями. Контейнер — запущенный экземпляр образа. Его можно удалить и создать заново. Dockerfile — рецепт образа. Compose — один файл, который описывает сразу несколько контейнеров и их настройки.

Данные, которые должны пережить пересоздание контейнера, хранят во volume. Секреты передают через переменные окружения. В образ токены не зашивают.

1. Устанавливаем Docker

sudo apt update
sudo apt install -y docker.io docker-compose-v2
sudo systemctl enable --now docker
sudo usermod -aG docker $USER

Первая команда обновляет список пакетов, вторая ставит движок и Compose. enable --now запускает Docker сейчас и после перезагрузки. Последняя команда позволяет текущему пользователю работать без sudo.

Выйдите командой exit, подключитесь снова и проверьте:

docker version
docker compose version
docker run --rm hello-world

Docker скачает тестовый образ, запустит контейнер и удалит его благодаря --rm. Сообщение Hello from Docker! означает успех.

2. Готовим простое приложение

mkdir -p ~/hello-docker && cd ~/hello-docker
nano app.py

Вставьте мини‑программу:

import time

while True:
    print("Приложение работает", flush=True)
    time.sleep(10)

3. Пишем Dockerfile

nano Dockerfile
FROM python:3.12-slim
WORKDIR /app
COPY app.py .
CMD ["python", "app.py"]

FROM выбирает базовый образ Python, WORKDIR создаёт рабочую папку, COPY кладёт код внутрь, CMD указывает команду запуска.

docker build -t hello-ratehost .
docker run --rm hello-ratehost

Точка означает «использовать текущую папку». Остановите приложение Ctrl+C.

4. Передаём управление Compose

nano compose.yaml
services:
  app:
    build: .
    restart: unless-stopped
    logging:
      options:
        max-size: "10m"
        max-file: "3"
docker compose up -d --build
docker compose ps
docker compose logs -f

-d запускает в фоне, --build пересобирает образ. Из просмотра логов выходят Ctrl+C — контейнер продолжает работать.

5. Добавляем секреты правильно

Создайте файл .env с токеном и никогда не отправляйте его в Git:

BOT_TOKEN=секретное_значение

В Compose добавьте под app строку env_file: .env. В Python значение доступно как os.environ["BOT_TOKEN"].

6. Исключаем лишние файлы

nano .dockerignore
.git
.env
.venv
__pycache__
*.log

Это уменьшает образ и защищает от случайного копирования секретов.

7. Команды на каждый день

docker compose ps # состояние
docker compose logs --tail=100 # последние логи
docker compose restart # перезапуск
docker compose down # остановить и удалить
docker stats --no-stream # ресурсы
docker system df # место на диске

Комментарии после # вводить необязательно.

Типовые ошибки

  • permission denied к docker.sock — переподключитесь после добавления в группу.
  • port is already allocated — порт уже занят другим процессом.
  • Контейнер постоянно перезапускается — смотрите docker compose logs.
  • Изменили код, но ничего не поменялось — запустите с --build.
Контейнер должен быть расходным. Если его страшно удалить, важные данные хранятся не там, где нужно.

Что дальше

Теперь можно собрать реальный проект: создадим AI‑бота в Telegram →