Гид по технологиям

Remote - Containers в VS Code — как работать с контейнерами

• 9 min read • Разработка • Обновлено 27 Nov 2025
Remote - Containers в VS Code — разработка в контейнерах
Remote - Containers в VS Code — разработка в контейнерах

Графика с иконкой Visual Studio Code

Быстрые ссылки

  • Начало работы
  • Как это работает
  • Development контейнеры
  • Настройка расширения
  • Резюме

Введение

Разработка и отладка кода внутри Docker-контейнеров даёт воспроизводимую и предсказуемую среду, но может быть неудобной, если вы вручную подключаетесь по shell и используете отдельные редакторы. Расширение Remote - Containers для Visual Studio Code позволяет открывать папки внутри контейнера и работать с ними так, будто это локальная директория.

Поддерживаемые окружения: Docker Desktop версии 2.0+ для Windows и macOS, Docker Engine 18.06+ для Linux. На Windows 10 Home требуется обновление April 2020, Docker Desktop 2.3 и установленный Windows Subsystem for Linux для корректной работы в некоторых конфигурациях. VS Code совместим с x64 и ARM контейнерами и с популярными базовыми образами: Alpine, Debian, Ubuntu, CentOS, RHEL. Если базовый образ не содержит нужных пакетов, вы можете установить их в образе или в процессе сборки dev container.

Важно: всегда подключайтесь только к контейнерам из доверенных образов. Контейнеры с рабочими пространствами VS Code имеют доступ к системе через запущенный в контейнере сервер.

Начало работы

  1. Запустите Visual Studio Code.
  2. Откройте палитру команд (Ctrl+Shift+P / ⇧⌘P) и выберите Install Extensions.
  3. В панели расширений найдите Remote - Containers и установите его.

После установки в левом нижнем углу появится зелёная кнопка удалённого подключения. Нажмите её, чтобы открыть доступные команды Remote. Команды также доступны через палитру команд: начните вводить remote.

Скриншот расширения Remote - Containers в Visual Studio Code

Чтобы подключиться к уже запущенному контейнеру, выберите команду Attach to Running Container. VS Code предупредит, что контейнер может выполнять недоверенный код — подтвердите осознанно. После выбора контейнера откроется новое окно, в котором VS Code установит серверные компоненты внутри контейнера. В строке состояния внизу слева отобразится активный контейнер.

Скриншот процесса подключения к Docker-контейнеру с расширением Remote - Containers

После запуска окна нажмите Open Folder, чтобы увидеть файловую систему контейнера, выберите директорию и подтвердите выбор. Панель слева обновится и покажет содержимое папки: открывайте файлы и редактируйте их напрямую, без ручного копирования или настроек bind mount.

Скриншот выбора папки внутри контейнера

Редактор предоставляет все стандартные возможности VS Code: IntelliSense, автодополнение, отладчик и терминал, привязанный к потокам ввода-вывода контейнера.

Скриншот редактирования файла внутри контейнера

Как это работает

Ключевая идея: VS Code устанавливает в контейнере небольшой сервер, который управляет операциями с файловой системой и запуском процессов. Сервер выполняет наблюдение за файловой системой, читает и записывает файлы и запускает процессы, которые команда редактора использует для отладки и других задач.

Диаграмма архитектуры расширения Remote - Containers

Сервер в контейнере обеспечивает доступ расширений: VS Code при необходимости устанавливает те же расширения внутри контейнера, чтобы они имели полный доступ к файловой системе и работали так же, как локально. После первого запуска установка компонентов может занять время, но сервер кешируется для последующего использования.

Пояснение терминов в одну строку

  • Dev container: контейнер, описанный конфигурацией devcontainer.json, содержащий зависимости для разработки.
  • Server в контейнере: компонент VS Code, который позволяет редактору взаимодействовать с файловой системой и процессами внутри контейнера.

Development контейнеры

Remote - Containers позволяет не только подключаться к существующим контейнерам, но и определять контейнеры разработки, которые полностью описывают среду для работы над проектом.

Преимущества development контейнера:

  • Воспроизводимая среда для всех разработчиков.
  • Централизованное обновление зависимостей — обновил образ, все разработчики подтянули новый тег.
  • Изоляция файловой системы при использовании volume вместо bind mount.

Development контейнеры описываются в файле .devcontainer/devcontainer.json в корне проекта.

Пример простого devcontainer.json:

{
  "image": "mcr.microsoft.com/vscode/devcontainers/javascript-node:16",
  "extensions": ["EditorConfig.EditorConfig"],
  "forwardPorts": [3000]
}

Этот пример использует официальный шаблон Node.js, автоматически добавляет расширение EditorConfig и пробрасывает порт 3000 из контейнера на хост.

Дополнительные ключи devcontainer.json:

  • settings: набор значений VS Code, которые будут применены внутри контейнера (аналог .vscode/settings.json).
  • postCreateCommand: команда, выполняемая после создания контейнера (например, установка зависимостей).
  • runArgs / dockerFile / context: дополнительные опции для сборки и запуска образа.
  • remoteUser: пользователь, от имени которого будет запущен сервер VS Code внутри контейнера.

Если не хотите писать файл вручную, используйте команду Remote-Containers: Add Development Configuration Files — она добавит шаблоны для популярных стеков.

После добавления devcontainer.json выполните команду Remote-Containers: Rebuild Container для сборки образа по конфигурации, затем Remote-Containers: Reopen Folder in Container, чтобы открыть текущую папку в новом контейнере.

Если репозиторий хранится в Git, удобно клонировать его прямо в контейнер с помощью команды Remote-Containers: Clone Repository in Container Volume. Команда создаст том, клонирует репозиторий туда и подключит его к контейнеру — вы избегаете засорения локальной файловой системы. VS Code автоматически передаёт ваши локальные Git-учётные данные в контейнер.

Настройка расширения

Настройки Remote - Containers доступны через команду Remote-Containers: Settings for Remote-Containers.

Основные группы настроек:

  • Dotfiles: репозиторий dotfiles можно указать через Repository; он будет клонирован в Target Path (по умолчанию ~/dotfiles). Можно задать Install Command для выполнения после клона.
  • Docker Path: по умолчанию используется docker; если вы используете Podman или другой совместимый CLI, укажите здесь его имя.
  • Default Extensions: список расширений, которые нужно автоматически устанавливать во все контейнеры.
  • Copy Git Config: при включении локальный ~/.gitconfig будет скопирован в контейнер, чтобы коммиты имели корректные авторские данные.
  • Git Credential Helper Config Location: указывает, куда записывать новые Git-учётные данные (пользовательский ~/.gitconfig или /etc/gitconfig).

Скриншот настроек расширения Remote - Containers

Практические советы

  • Bind mount vs Volume: bind mount монтирует вашу локальную папку в контейнер, что удобно для быстрых итераций. Volume более «чистый» и зачастую быстрее в Docker-подходах, особенно на macOS/Windows.
  • Пользователь внутри контейнера: по умолчанию процессы могут запускаться от root. Для соответствия локальным правам укажите remoteUser или используйте postCreateCommand для настройки пользователя.
  • Сетевые порты: проброс портов через forwardPorts удобен для локального тестирования веб-сервисов.
  • Кэширование: при первой установке dev сервер компонентов в контейнер может собираться — будьте терпеливы.

Безопасность и риски

Важно: подключение к контейнеру даёт этим компонентам доступ к вашей системе через сервер в контейнере. Рекомендации по снижению риска:

  • Подключайтесь только к проверенным образам.
  • Не открывайте контейнеры от неизвестных источников в привилегированном режиме.
  • Отдельно рассматривайте использование read-only слоёв для продакшен-образов, но для разработки это может быть неудобно.
  • Не храните секреты в devcontainer.json; используйте менеджеры секретов или переменные окружения и .env-файлы, исключённые из контроля версий.

Когда это не подходит

  • Если у вас ограниченные ресурсы на машине и вы не можете запускать Docker, локальная среда может быть проще.
  • Для быстрого редактирования одиночных файлов без окружения контейнеры избыточны.
  • Если вам важна графическая отладка, проходящая через нестандартные драйверы, возможны ограничения.

Альтернативы

  • Локальная виртуальная машина (Vagrant, Multipass) — даёт более полную изоляцию, но медленнее по итерациям.
  • Удалённые серверы SSH с VS Code Remote - SSH — хороший вариант, если требуется доступ к мощному удалённому хосту.
  • JetBrains Gateway / другие IDE с удалёнными возможностями — предлагают похожие сценарии, но требуют другой экосистемы.

Мини-методология внедрения в команду

  1. Описать минимальный devcontainer.json с языком и основными зависимостями.
  2. Подготовить CI-пайплайн, который собирает образ и публикует тег (если нужно).
  3. Распространить инструкцию для разработчиков: как установить VS Code, расширение и открыть проект.
  4. Поддерживать образ актуальным и проверять работоспособность при обновлениях зависимостей.

Роль-ориентированные контрольные списки

Разработчик:

  • Установить VS Code и расширение Remote - Containers.
  • Открыть проект через Reopen Folder in Container.
  • Проверить работу автодополнения и отладчика.

DevOps/Инфраструктура:

  • Подготовить базовый образ с необходимыми пакетами.
  • Определить политику обновления образа.
  • Настроить публикацию образа и документировать процедуру отката.

Тимлид:

  • Убедиться, что devcontainer.json покрывает ключевые сценарии разработки.
  • Проверить, что команды разработки обучены использованию контейнеров.

Решение проблем и примеры тест-кейсов

Распространённые проблемы и проверки:

  • VS Code не может подключиться к контейнеру: проверить, запущен ли Docker и доступны ли контейнеры через docker ps.
  • Долгая установка расширений внутри контейнера: проверить скорость сети, кеширование образов и содержимое devcontainer.json.
  • Ошибки прав доступа: проверить remoteUser и владельца файлов внутри контейнера.

Критерии приёмки:

  • Проект успешно открывается в контейнере через Reopen Folder in Container.
  • Команды сборки и тестирования запускаются внутри контейнера без ошибок.
  • Отладка запускается и телеметрия (если есть) доступна.

Диаграмма принятия решения (Mermaid)

flowchart TD
  A[Нужно ли воспроизводимое окружение?] -->|Да| B[Использовать devcontainer]
  A -->|Нет| C[Локальная разработка]
  B --> D{Есть ли готовый образ}
  D -->|Да| E[Reopen Folder in Container]
  D -->|Нет| F[Создать devcontainer.json и билд]
  F --> E
  E --> G[Работать внутри контейнера]

Примеры конфигураций и сниппеты

Пример devcontainer.json для проекта на Node.js с установкой зависимостей после создания:

{
  "image": "mcr.microsoft.com/vscode/devcontainers/javascript-node:16",
  "extensions": ["dbaeumer.vscode-eslint", "esbenp.prettier-vscode"],
  "forwardPorts": [3000],
  "postCreateCommand": "npm install",
  "settings": {
    "terminal.integrated.shell.linux": "/bin/bash"
  }
}

Если вы используете Dockerfile вместо образа, devcontainer.json может указывать путь к Dockerfile и контексту:

{
  "name": "My Dev Container",
  "build": {
    "dockerfile": "Dockerfile",
    "context": ".."
  },
  "extensions": ["ms-vscode.cpptools"]
}

Совместимость и миграция

  • Если вы переходите с Docker на Podman, укажите podman в Docker Path. Учтите различия в поведении сетевых и привилегированных режимов.
  • При миграции с другого редактора документируйте devcontainer.json и postCreateCommand, чтобы схема была воспроизводима для новых участников.

Тестирование и SLI/SLO (качество разработки)

Подходящие проверки качества для команды, использующей dev containers:

  • SLI: время от открытия контейнера до готовности окружения для разработки.
  • SLO: 90% случаев — готовность окружения менее N минут (значение N устанавливается командой).

Если точные численные цели неизвестны, начните с качественных задач: документация и стабильность образов.

Безопасность данных и GDPR заметки

  • Не добавляйте пользовательские секреты напрямую в devcontainer.json или в образ.
  • Используйте секретные менеджеры и ограничьте доступ к публичным образам.
  • При необходимости передачи персональных данных убедитесь, что хранение и обработка соответствуют корпоративной политике и требованиям законодательства.

Edge-cases и когда это ломается

  • Контейнеры, работающие в нестандартных OCI-режимах, могут не поддерживаться расширением.
  • Если внутри контейнера недоступны базовые утилиты (например, sh/bin/bash отсутствует в лёгких образах), сервер VS Code может не запуститься без дополнительных пакетов.
  • В случаях проблем с файловыми системами на macOS/Windows (производительность bind mounts) рассмотрите использование томов.

Рекомендации по обслуживанию

  • Регулярно обновляйте базовые образы и шаблоны devcontainer.json.
  • Удерживайте список Default Extensions минимальным и документируйте причины их включения.
  • Тестируйте процесс создания контейнера в CI, чтобы изменения не ломали onboarding новых участников.

Итог

Remote - Containers превращает контейнеры из «инструмента инфраструктуры» в повседневную среду разработки. Это упрощает onboarding, делает окружение воспроизводимым и интегрирует возможности VS Code с контейнерной инфраструктурой.

Ключевые моменты:

  • Используйте devcontainer.json для описания окружения.
  • Применяйте volumes для изоляции или bind mounts для быстрой итерации.
  • Поддерживайте безопасность: не доверяйте незнакомым контейнерам и не храните секреты в образах.

Важно: начните с простого devcontainer.json, убедитесь, что он работает локально, и затем постепенно добавляйте оптимизации и автоматизацию в CI.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро