Docker без магии: собираем и запускаем первый контейнер
Docker часто объясняют набором команд. Мы пойдём от задачи: почему приложение «работает у меня», но ломается на сервере, и как контейнер решает эту проблему.
Контейнер, образ и Compose — на пальцах
Образ — неизменяемый шаблон с операционной системой, программой и зависимостями. Контейнер — запущенный экземпляр образа. Его можно удалить и создать заново. Dockerfile — рецепт образа. Compose — один файл, который описывает сразу несколько контейнеров и их настройки.
Данные, которые должны пережить пересоздание контейнера, хранят во volume. Секреты передают через переменные окружения. В образ токены не зашивают.
1. Устанавливаем Docker
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 compose version
docker run --rm hello-world
Docker скачает тестовый образ, запустит контейнер и удалит его благодаря --rm. Сообщение Hello from Docker! означает успех.
2. Готовим простое приложение
nano app.py
Вставьте мини‑программу:
while True:
print("Приложение работает", flush=True)
time.sleep(10)
3. Пишем Dockerfile
WORKDIR /app
COPY app.py .
CMD ["python", "app.py"]
FROM выбирает базовый образ Python, WORKDIR создаёт рабочую папку, COPY кладёт код внутрь, CMD указывает команду запуска.
docker run --rm hello-ratehost
Точка означает «использовать текущую папку». Остановите приложение Ctrl+C.
4. Передаём управление Compose
app:
build: .
restart: unless-stopped
logging:
options:
max-size: "10m"
max-file: "3"
docker compose ps
docker compose logs -f
-d запускает в фоне, --build пересобирает образ. Из просмотра логов выходят Ctrl+C — контейнер продолжает работать.
5. Добавляем секреты правильно
Создайте файл .env с токеном и никогда не отправляйте его в Git:
В Compose добавьте под app строку env_file: .env. В Python значение доступно как os.environ["BOT_TOKEN"].
6. Исключаем лишние файлы
.env
.venv
__pycache__
*.log
Это уменьшает образ и защищает от случайного копирования секретов.
7. Команды на каждый день
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 →