Docker JupyterLab для ML семинаров: гайд по созданию образовательной среды | AiManual
AiManual Logo Ai / Manual.
08 Фев 2026 Гайд

Docker + JupyterLab для живых семинаров по ML: как заставить студентов писать код, а не смотреть

Пошаговый гайд по созданию локальной образовательной среды для ML семинаров с Docker и JupyterLab. Установка, конфигурация, расширения и лучшие практики для вов

Проблема: студенты смотрят, а не пишут

Знакомо? Вы стоите у доски, объясняете градиентный спуск, показываете код в Jupyter Notebook. Аудитория кивает. Потом просите повторить - и тишина. Потому что 80% студентов просто смотрят на ваш экран, а не пишут код.

Google Colab? Да, удобно. Но у него есть проблемы:

  • Сессии сбрасываются через 12 часов (а иногда и раньше)
  • Ограничения по GPU для бесплатных аккаунтов
  • Нет контроля над окружением - сегодня библиотека версии X, завтра Y
  • Студенты тратят 15 минут на установку зависимостей вместо работы
  • Нет нормальной совместной работы в реальном времени

Решение? Свой образовательный сервер с Docker и JupyterLab. Не просто "еще один Jupyter", а настроенная под семинары среда.

Ключевая идея: дать студентам одинаковое окружение за 30 секунд. Не "установите библиотеки", а "запустите контейнер". Все зависимости уже внутри.

Что получится в итоге

Образовательная платформа, где каждый студент получает:

Что Зачем
JupyterLab с предустановленными библиотеками ML Не тратить время на установку
Встроенный Git и терминал Работать как в реальном проекте
Real Time Collaboration (RTC) Преподаватель видит код студентов сразу
Предзагруженные датасеты Не качать по 2 ГБ каждый раз
Локальный AI-ассистент для кода Помощь без выхода в интернет

1 Подготовка: Dockerfile для ML-образования

Стандартный образ Jupyter - это голый Python. Нам нужен образ для обучения ML. Вот Dockerfile, который я использую с 2024 года (обновлен под 2026):

FROM jupyter/scipy-notebook:2026-01-15

# Устанавливаем русскую локаль (для студентов)
ENV LANG=ru_RU.UTF-8 \
    LANGUAGE=ru_RU:ru \
    LC_ALL=ru_RU.UTF-8

RUN apt-get update && apt-get install -y \
    locales \
    git-lfs \
    htop \
    nano \
    && rm -rf /var/lib/apt/lists/* \
    && localedef -i ru_RU -c -f UTF-8 -A /usr/share/locale/locale.alias ru_RU.UTF-8

# Основные ML библиотеки
RUN pip install --no-cache-dir \
    torch==2.5.0 \
    torchvision==0.20.0 \
    torchaudio==2.5.0 \
    scikit-learn==1.6.0 \
    pandas==2.3.0 \
    matplotlib==3.10.0 \
    seaborn==0.13.2 \
    plotly==5.24.0 \
    xgboost==2.1.0 \
    lightgbm==4.5.0 \
    catboost==1.3.0 \
    jupyterlab-git==0.50.0 \
    jupyterlab-lsp==5.2.0 \
    python-lsp-server[all]==1.10.0

# JupyterLab расширения для семинаров
RUN jupyter labextension install \
    @jupyterlab/git \
    @jupyter-widgets/jupyterlab-manager \
    @jupyterlab/toc \
    @jupyterlab/debugger \
    --no-build

# Копируем учебные материалы
COPY datasets/ /home/jovyan/datasets/
COPY tutorials/ /home/jovyan/tutorials/
COPY exercises/ /home/jovyan/exercises/

# Права на запись (студенты будут сохранять работы)
RUN chmod -R 777 /home/jovyan/work

EXPOSE 8888

CMD ["start.sh", "jupyter", "lab", "--LabApp.token=''", "--LabApp.password=''"]
💡
Зачем token и password пустые? Чтобы студенты не тратили время на авторизацию. Это образовательная среда, не продакшн. Если нужна безопасность - используйте JupyterHub.

2 Makefile для упрощения жизни

Студенты не должны запоминать команды Docker. Дайте им Makefile:

.PHONY: build run stop clean help

IMAGE_NAME = ml-seminar-2026
CONTAINER_NAME = ml-student-$(shell whoami)
PORT = 8888

build:
	docker build -t $(IMAGE_NAME) .

run:
	docker run -d \
		--name $(CONTAINER_NAME) \
		-p $(PORT):8888 \
		-v $(PWD)/work:/home/jovyan/work \
		-v $(PWD)/.jupyter:/home/jovyan/.jupyter \
		--gpus all \
		$(IMAGE_NAME)
	@echo "JupyterLab запущен: http://localhost:$(PORT)"

stop:
	docker stop $(CONTAINER_NAME) || true
	docker rm $(CONTAINER_NAME) || true

clean:
	docker rmi $(IMAGE_NAME) || true
	rm -rf work/*

help:
	@echo "Команды для студентов:"
	@echo "  make run    - запустить среду"
	@echo "  make stop   - остановить"
	@echo "  make clean  - очистить всё"
	@echo ""
	@echo "После make run откройте http://localhost:$(PORT)"

Студент делает три команды:

git clone https://github.com/your-university/ml-seminar.git
cd ml-seminar
make run

И получает рабочую среду. Никаких "pip install не работает", "версия конфликтует", "памяти не хватает".

3 Настройка JupyterLab для совместной работы

Стандартный JupyterLab - это индивидуальная работа. Для семинаров нужны расширения. Создаем конфигурацию:

# .jupyter/jupyter_server_config.py

c.ServerApp.allow_origin = '*'  # Для локальной сети
c.ServerApp.allow_remote_access = True
c.ServerApp.ip = '0.0.0.0'

# Real Time Collaboration
c.LabApp.collaborative = True
c.ServerApp.disable_check_xsrf = True  # Только для локальной сети!

# Автосохранение каждые 30 секунд
c.ContentsManager.checkpoints_kwargs = {'root_dir': '.ipynb_checkpoints/'}
c.FileContentsManager.autosave_interval = 30

# Лимиты для студентов
c.ExecutePreprocessor.timeout = 600  # 10 минут на ячейку
c.ExecutePreprocessor.kernel_name = 'python3'

# Отключаем предупреждения о больших данных
c.NbConvertApp.use_output_suffix = False

Внимание: отключение XSRF защиты - только для локальной образовательной сети! Для публичного доступа используйте аутентификацию.

Как это работает на семинаре

Сценарий живого семинара:

  1. За 5 минут до начала: студенты делают make run
  2. Преподаватель показывает код на своем экране
  3. Студенты повторяют в своих инстансах
  4. Преподаватель может зайти на любой студенческий инстанс (по IP:8888)
  5. Видит ошибки сразу, помогает точечно
  6. Все сохраняют работы в папку work/, которая маппится на хост

Преимущество перед демонстрацией экрана: студенты не просто смотрят, они взаимодействуют. Каждый пишет код в своем темпе.

Добавляем локального AI-ассистента

Студенты задают вопросы. Преподаватель один на 20 человек. Решение - локальный код-ассистент. Поднимаем его в соседнем контейнере:

# docker-compose.yml
version: '3.8'

services:
  jupyter:
    build: .
    ports:
      - "8888:8888"
    volumes:
      - ./work:/home/jovyan/work
      - ./datasets:/home/jovyan/datasets
    environment:
      - JUPYTER_ENABLE_LAB=yes
      - GRANT_SUDO=yes
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]
  
  code-assistant:
    image: ghcr.io/opencode/assistant:latest
    ports:
      - "8080:8080"
    volumes:
      - ./code-assistant-data:/data
    environment:
      - MODEL=deepseek-coder-7b-instruct-v2.5
      - GPU_MEMORY=8
    depends_on:
      - jupyter

Теперь студенты могут спрашивать у AI-ассистента про синтаксис, ошибки, лучшие практики. Без интернета, без лимитов, без платных подписок.

Если нужен полноценный локальный AI с RAG - посмотрите мой гайд про развертывание локального ИИ-ассистента для кода. Там подробно про настройку моделей и экономию VRAM.

Предзагрузка датасетов и моделей

Самое раздражающее на семинаре - ждать, пока 20 человек скачают MNIST по 50 МБ каждый. Решение - положить датасеты в образ:

# scripts/prepare_datasets.py

import torchvision
import pandas as pd
from sklearn.datasets import fetch_openml
import pickle
import os

# Создаем папку для датасетов
os.makedirs('datasets', exist_ok=True)

# MNIST
print("Downloading MNIST...")
train = torchvision.datasets.MNIST('datasets/mnist', download=True)

# Boston Housing
print("Downloading Boston Housing...")
boston = fetch_openml(name='boston', version=1)
pd.DataFrame(boston.data, columns=boston.feature_names).to_csv('datasets/boston.csv', index=False)

# Titanic
print("Downloading Titanic...")
titanic = pd.read_csv('https://web.stanford.edu/class/archive/cs/cs109/cs109.1166/stuff/titanic.csv')
titanic.to_csv('datasets/titanic.csv', index=False)

print("Datasets ready!")

Запускаем скрипт при сборке образа. Теперь датасеты доступны сразу.

Интеграция с Git для сдачи работ

Студенты делают задания. Как собирать работы? Через Git. Настраиваем в JupyterLab:

{
  "git": {
    "repository": "https://github.com/your-university/ml-assignments-2026",
    "branch": "main",
    "user": {
      "name": "Student",
      "email": "student@university.edu"
    }
  },
  "notebook": {
    "default_dir": "/home/jovyan/work",
    "auto_save": true
  }
}

Студенты делают commit прямо из JupyterLab. Преподаватель видит все изменения в одном репозитории.

Типичные ошибки и как их избежать

Ошибка Решение
Контейнеры конфликтуют по портам Используйте разные порты: 8888, 8889, 8890. Или docker-compose с сетью
Нет доступа к GPU в контейнере Установите nvidia-container-toolkit и флаг --gpus all
Студенты теряют работы при остановке Маппите папку work на хост (volume)
Образ слишком большой (10+ ГБ) Используйте многоэтапную сборку, удаляйте кэш pip
Студенты с Windows не могут запустить Дайте им Docker Desktop или WSL2 инструкцию

Масштабирование: когда студентов больше 20

Локальный Docker на ноутбуке преподавателя выдержит 10-20 контейнеров. Для 100+ студентов нужен сервер. Тут два пути:

1. JupyterHub с DockerSpawner - каждый студент получает свой контейнер по запросу. Сложнее в настройке, но автоматическое масштабирование.

2. Предварительно запущенные контейнеры - на сервере с 32 ядрами и 128 ГБ RAM можно запустить 50 контейнеров заранее. Студенты подключаются к свободным.

Для серьезных ML курсов с большим количеством студентов рекомендую посмотреть мой гайд про построение ML-песочницы на k8s. Kubernetes справится с сотнями инстансов.

Что дальше? От семинаров к проектам

Семинары - это хорошо. Но настоящие навыки появляются в проектах. Как перейти от упражнений к реальным задачам?

1. Добавьте продвинутые инструменты - MLflow для экспериментов, DVC для данных, Prefect для пайплайнов.

2. Интегрируйте с IDE - студенты пишут код в VSCode, который подключается к Jupyter kernel. Смотрите идеальный стек для self-hosted LLM и IDE.

3. Добавьте продвинутую аналитику - Grafana dashboard, где видно, какие задачи вызывают проблемы у большинства студентов.

4. Автоматическую проверку заданий - pytest + nbval, который проверяет ноутбуки студентов.

💡
Самый важный показатель успеха: через месяц после курса студенты сами разворачивают подобные среды для своих проектов. Не просят "дайте Colab", а говорят "сейчас подниму контейнер".

Чего не хватает в этом подходе?

Идеальных решений не бывает. У Docker+JupyterLab для образования есть минусы:

  • Требует Docker на компьютерах студентов - не все могут установить (корпоративные ноутбуки)
  • Нет автоматического сохранения в облако - если студент забыл сделать commit, работа теряется
  • Сложнее демонстрировать работу с большими моделями - нужны GPU на стороне студентов
  • Нет встроенной системы оценивания - преподаватель проверяет вручную

Но эти минусы решаемы. Для больших моделей используйте локальный запуск LLM через Ollama. Для автоматического оценивания - CI/CD пайплайны.

Финальный совет: начинайте с малого

Не пытайтесь сразу построить идеальную образовательную платформу. Начните с одного Dockerfile и Makefile. Проведите один семинар. Посмотрите, что понравилось студентам, что вызвало проблемы.

Через месяц у вас будет:

ml-seminar/
├── Dockerfile          # Образ с библиотеками
├── Makefile           # Простые команды для студентов
├── datasets/          # Предзагруженные данные
├── tutorials/         # Готовые ноутбуки
├── exercises/         # Задания
└── docker-compose.yml # Для продвинутых сценариев

И самое главное - студенты, которые действительно пишут код. Не смотрят на ваш экран, а экспериментируют, ошибаются, исправляют, учатся.

Потому что разница между "посмотреть демонстрацию" и "написать код самому" - это разница между "понять теорию" и "научиться применять". А в ML, как и в любом ремесле, навык важнее знаний.