Создание и запуск Docker-контейнера с MCP-сервером

Вы уже знаете, что такое Docker-образ и контейнер, и понимаете, зачем нужна изоляция приложений. Теперь пришло время применить эти знания на практике. Мы создадим настоящий Docker-контейнер с MCP-сервером — и этот контейнер можно будет запускать на любом компьютере, включая облачные серверы. Это ключевой шаг к независимому развёртыванию ваших ИИ-агентов.


Создание Dockerfile: рецепт для вашего MCP-сервера

Dockerfile — это текстовый файл, в котором пошагово описывается, как собрать образ вашего приложения. Его можно сравнить с кулинарным рецептом: вы указываете ингредиенты (базовый образ), добавляете продукты (файлы проекта), выполняете действия (установка зависимостей) и определяете, что будет готово к подаче (запуск сервера).

Вот пример Dockerfile для MCP-сервера на Python с использованием FastAPI:

# Базовый образ: официальный Python 3.11
FROM python:3.11-slim

# Устанавливаем рабочую директорию внутри контейнера
WORKDIR /app

# Копируем файл зависимостей
COPY requirements.txt .

# Устанавливаем зависимости
RUN pip install --no-cache-dir -r requirements.txt

# Копируем исходный код проекта
COPY . .

# Открываем порт 8000 для внешнего доступа
EXPOSE 8000

# Запускаем сервер при старте контейнера
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

Каждая строка — это слой в образе. Docker кэширует их, что ускоряет последующие сборки.

💡 Совет: Всегда создавайте файл .dockerignore, чтобы исключить ненужные файлы из образа (например, .env, __pycache__, .git). Это уменьшает размер и повышает безопасность.

Пример .dockerignore:

.env
__pycache__
.git
.vscode

Сборка образа: превращаем Dockerfile в готовый образ

Когда Dockerfile готов, приходит время сборки образа. Этот процесс создаёт статический шаблон, из которого можно запускать контейнеры.

Выполните в терминале (в папке проекта):

docker build -t mcp-agent-python:latest .
  • docker build — команда для сборки
  • -t mcp-agent-python:latest — задаёт имя и тег образа
  • . — указывает, что контекст сборки — текущая директория

После завершения проверьте, что образ появился:

docker images

Вы увидите что-то вроде:

REPOSITORY           TAG       IMAGE ID       CREATED         SIZE
mcp-agent-python     latest    a1b2c3d4e5f6   2 minutes ago   280MB

⚠️ Типичная ошибка: забыть точку в конце команды. Без неё Docker не знает, где искать файлы.


Запуск контейнера: ваш MCP-сервер в коробке

Теперь запустим контейнер из собранного образа:

docker run -p 8000:8000 --name mcp-server mcp-agent-python:latest
  • -p 8000:8000 — пробрасывает порт 8000 с хоста на порт 8000 в контейнере
  • --name mcp-server — даёт контейнеру понятное имя
  • mcp-agent-python:latest — имя образа

Если всё прошло успешно, вы увидите логи запуска FastAPI. Откройте http://localhost:8000 — должен открыться интерфейс сервера (например, Swagger, если он подключён).

Для запуска в фоне добавьте флаг -d:

docker run -d -p 8000:8000 --name mcp-server mcp-agent-python:latest

Жизненный цикл контейнера: управление, мониторинг и диагностика

Жизненный цей контейнера — это все этапы его существования: запуск, работа, остановка, перезапуск, удаление. Умение управлять им — ключ к стабильной работе.

Основные команды:

# Остановить контейнер
docker stop mcp-server

# Запустить остановленный контейнер
docker start mcp-server

# Перезапустить контейнер
docker restart mcp-server

# Просмотреть логи (очень важно для диагностики!)
docker logs mcp-server

# Просмотреть логи в реальном времени
docker logs -f mcp-server

# Удалить контейнер
docker rm mcp-server

# Удалить образ
docker rmi mcp-agent-python:latest

💡 Практический совет: Если сервер не отвечает — первое, что нужно сделать, — проверить логи. Ошибка в requirements.txt или неправильный путь в COPY почти всегда видны в выводе docker logs.


Бонус: краткий пример для TypeScript (Express.js)

Поскольку вы — фронтенд-разработчик, вот как может выглядеть Dockerfile для MCP-сервера на TypeScript:

FROM node:18-slim

WORKDIR /app

COPY package.json .
RUN npm install

COPY . .

EXPOSE 3000

CMD ["node", "dist/index.js"]

Сборка и запуск аналогичны — просто с другим именем образа.


Best practices 2025: надёжность и безопасность

  • ✅ Используйте многоступенчатую сборку для уменьшения размера образа (особенно при сборке TypeScript).
  • ✅ Запускайте приложение от non-root пользователя для безопасности.
  • ✅ Передавайте API-ключи через переменные окружения: docker run -e API_KEY=xxx ...
  • ✅ Убедитесь, что образ работает на ARM-архитектуре (актуально для M1/M2 и облачных ARM-инстансов).

Что дальше?

Теперь у вас есть полностью автономный MCP-сервер в контейнере. Вы можете запускать его локально, передавать коллегам или — что ещё важнее — развёртывать в облаке.

В следующей теме — Выбор и настройка облачного сервера — мы подготовим виртуальную машину, на которую вы сможете перенести этот самый контейнер. Это будет ваш первый шаг к публичному запуску ИИ-агента.

Вы уже видите, как близко к реальному продукту? Уже завтра вы сможете запустить своего агента в интернете и использовать его в своём стартапе.