Модуль 1 · Подключение и первые данные

Справочник по MongoDB · модуль 1 · подключение и первые данные

Глава 1.1а

1.1а

Стенд в Docker:
если Compass не подключается

На компьютерах в классе MongoDB Server и Compass ставятся не всегда: установщику нужны права администратора, служба сервера не запускается, а Compass при подключении пишет connect ECONNREFUSED. В этой главе — запасной путь. Сервер и базы курса запускаются в Docker одной командой, данные открываются в браузере, а код работает в контейнере, где драйвер уже установлен. Если не ставится и Docker, тот же стенд поднимается в GitHub Codespaces.

Категория
Окружение и запуск
Уровень
Начальный
Связанные темы
1.1 Сервер, база, коллекция · ПР-01 · КТ-01
Зачем это знать
Работать с курсом на любом компьютере, где есть Docker или хотя бы браузер

github.com/MaximBytecamp/mongodb-practice

§1Что именно не работает

В главе 1.1 разобрано, что Compass — клиент. Сам он данных не хранит, он подключается к серверу по адресу mongodb://localhost:27017. Поэтому сообщение при создании подключения говорит о сервере, а не о Compass:

Compass · New Connection → Connectсервер не запущен
connect ECONNREFUSED 127.0.0.1:27017

ECONNREFUSED — «в соединении отказано»: компьютер ответил, но порт 27017 никто не слушает. Так бывает в трёх случаях:

сервер не установленУстановщик MongoDB Server на Windows регистрирует службу и требует прав администратора. Без них он останавливается на середине.чаще всего
служба не запущенаСервер установлен, но служба MongoDB остановлена или падает при старте — например, из-за папки данных без прав на запись.бывает
Compass не установилсяСервера нет, и открыть данные нечем. Решается так же: сервер в контейнере, данные в браузере.бывает

Во всех трёх случаях нужен сервер, который не устанавливается в систему. Это и есть контейнер: MongoDB запускается внутри Docker как отдельная программа со своей файловой системой, без службы Windows и без записи в реестр.

§2Какой путь выбрать

путь А Docker Desktop
  • свой ноутбук или домашний компьютер;
  • Windows 10/11, macOS или Linux;
  • установка один раз, дальше всё работает без интернета.
путь Б GitHub Codespaces
  • на компьютере ничего нельзя установить;
  • нужны браузер и аккаунт GitHub;
  • бесплатно — около 60 часов работы в месяц.

Docker Desktop на Windows тоже ставится не везде. Ему нужны права администратора на установку, подсистема WSL 2 и включённая в BIOS виртуализация. Если в классе этого нет, сразу переходите к §10: Codespaces работает в браузере, и стенд там тот же — те же базы, те же команды проверки.

Почему не облачный Atlas

У MongoDB есть облачный сервис Atlas с бесплатным кластером, но из России он недоступен: в 2022 году компания прекратила обслуживать пользователей из России и Беларуси. Поэтому сервер в курсе всегда свой — на компьютере или в Codespaces.

§3Что будет запущено

В корне репозитория практик лежит файл compose.yaml. В нём описан весь стенд, и Docker поднимает его одной командой. Контейнеров несколько, у каждого одна задача:

ваш компьютерWindows · macOS · Linux
браузерданные в mongo-express
localhost:8081
Compassесли установился — подключается как обычно
localhost:27017
терминалкоманды docker compose
из папки репозитория

Docker · проект mongodb-practice · контейнеры запуска в сети сервера: для них он тоже localhost:27017

mongoMongoDB 7 — тот самый серверработает всё время
seedзаливает базы курса, если сервер пустойзавершается сам
mongo-expressбазы и документы в браузереработает всё время
python · ruby · go · cppдрайвер уже внутри; запускают файл решенияна время команды

том mongo-data — данные сервера; переживает остановку и удаление контейнеров

Языки программирования на компьютер ставить не нужно. Python, Ruby, Go и компилятор C++ вместе с драйверами MongoDB лежат в образах: команда запуска поднимает нужный контейнер, выполняет в нём файл и удаляет контейнер. Папка репозитория видна внутри, поэтому код правится в обычном редакторе, а запускается в контейнере.

§4Шаг 1. Проверить Docker

Docker Desktop для Windows скачивается с docs.docker.com. Установщику нужны права администратора, а при первом запуске он включает подсистему WSL 2. После установки Docker Desktop нужно запустить: команды работают, только пока он открыт и внизу его окна написано Engine running.

Терминал на Windows — PowerShell: Win + X → «Терминал». Все команды главы набираются в нём. Проверьте две вещи:

Боковая панель Docker Desktop с надписью Engine running внизу
Docker Desktop — внизу слева Engine running: движок запущен. Кадр с macOS, в Windows эта строка на том же месте

Docker Desktop для Mac скачивается с docs.docker.com. Сборок две — для Apple Silicon и для Intel; какой у вас процессор, видно в меню → «Об этом Mac», строка «Чип» или «Процессор». После установки Docker Desktop нужно запустить из «Программ»: команды работают, пока он открыт и в его окне написано Engine running.

Терминал на macOS — приложение Терминал: Cmd + Пробел, набрать «Терминал». Проверьте две вещи:

На Linux Docker Desktop не нужен: ставится сам движок, Docker Engine, вместе с плагином Compose. Проще всего — официальным скриптом:

Терминалустановка Docker Engine
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER     # чтобы запускать docker без sudo
# затем выйдите из системы и войдите снова

Скрипт сам запускает службу Docker, и она стартует вместе с системой. Терминал в большинстве дистрибутивов открывается сочетанием Ctrl + Alt + T. Проверьте две вещи:

Терминалдве проверки
docker version            # есть ли Docker и запущен ли он
docker compose version    # есть ли Compose
Выводснято на macOS; на других системах отличаются OS/Arch и название сервера
Client:
 Version:           29.7.2
 API version:       1.55
 Go version:        go1.26.5
 OS/Arch:           darwin/arm64
 Context:           desktop-linux

Server: Docker Desktop 4.89.0 (238018)
 Engine:
  Version:          29.7.2
  API version:      1.55 (minimum version 1.40)
  OS/Arch:          linux/arm64
 …

Docker Compose version v5.5.0

Главное здесь — что в ответе есть два блока: Client и Server. Клиент — это сама команда docker, сервер — движок внутри Docker Desktop. Если блока Server нет, а вместо него ошибка подключения, движок не запущен — как эта ошибка выглядит на вашей системе, показано в §12.

§5Шаг 2. Скачать репозиторий

Если установлен Git:

Терминалчерез Git
git clone https://github.com/MaximBytecamp/mongodb-practice.git
cd mongodb-practice

Если Git нет — на странице репозитория нажмите Code → Download ZIP, распакуйте архив и перейдите в папку:

PowerShell«Извлечь всё» создаёт папку в папке
cd $HOME\Downloads\mongodb-practice-main\mongodb-practice-main
ls                        # должен быть файл compose.yaml
Терминалархив распакован двойным щелчком в Finder
cd ~/Downloads/mongodb-practice-main
ls                        # должен быть файл compose.yaml
Терминалраспаковка в терминале
cd ~/Downloads
unzip mongodb-practice-main.zip
cd mongodb-practice-main
ls                        # должен быть файл compose.yaml

Все команды дальше выполняются из этой папки — там, где лежит compose.yaml. Из другой папки Docker не найдёт описание стенда.

§6Шаг 3. Поднять стенд

Терминализ корня репозитория
docker compose up -d

Первый запуск идёт несколько минут: Docker скачивает образы mongo:7 и mongo-express. Флаг -d оставляет контейнеры работать в фоне и возвращает терминал. Когда всё поднялось, вывод заканчивается так:

Выводпервый запуск, образы уже скачаны
Image mongo-express:1.0.2 Pulling
f2d515a8401d Pulling fs layer 0B
f541ec1a4067 Pulling fs layer 0B
8f5ec9da9bc0 Pulling fs layer 0B
41c65f6bdf40 Pulling fs layer 0B
c6b39de5b339 Pulling fs layer 0B
23ee6393f192 Pulling fs layer 0B
4a17d49bb7c9 Pulling fs layer 0B
2aa624262f6c Pulling fs layer 0B
14823bc6c926 Download complete 0B
f2d515a8401d Download complete 0B
0b5697ffa03e Download complete 0B
f541ec1a4067 Download complete 0B
23ee6393f192 Downloading 1.049MB
23ee6393f192 Download complete 0B
41c65f6bdf40 Downloading 1.049MB
8f5ec9da9bc0 Download complete 0B
41c65f6bdf40 Downloading 2.097MB
c6b39de5b339 Downloading 1.049MB
41c65f6bdf40 Downloading 2.097MB
c6b39de5b339 Downloading 1.049MB
41c65f6bdf40 Downloading 2.097MB
c6b39de5b339 Downloading 1.049MB
41c65f6bdf40 Downloading 2.097MB
c6b39de5b339 Downloading 1.049MB
41c65f6bdf40 Downloading 2.097MB
c6b39de5b339 Downloading 1.049MB
41c65f6bdf40 Downloading 2.097MB
c6b39de5b339 Downloading 1.049MB
41c65f6bdf40 Downloading 2.097MB
c6b39de5b339 Downloading 1.049MB
41c65f6bdf40 Downloading 2.097MB
c6b39de5b339 Downloading 1.049MB
41c65f6bdf40 Downloading 2.097MB
c6b39de5b339 Downloading 1.049MB
41c65f6bdf40 Downloading 5.243MB
c6b39de5b339 Download complete 0B
c6b39de5b339 Extracting 1B
41c65f6bdf40 Downloading 5.243MB
c6b39de5b339 Pull complete 0B
41c65f6bdf40 Downloading 5.243MB
41c65f6bdf40 Downloading 6.291MB
41c65f6bdf40 Downloading 7.34MB
4a17d49bb7c9 Download complete 0B
41c65f6bdf40 Downloading 7.34MB
2aa624262f6c Downloading 1.049MB
41c65f6bdf40 Downloading 8.389MB
2aa624262f6c Downloading 1.049MB
41c65f6bdf40 Downloading 9.437MB
2aa624262f6c Downloading 2.097MB
41c65f6bdf40 Downloading 9.437MB
2aa624262f6c Downloading 2.097MB
41c65f6bdf40 Downloading 9.437MB
2aa624262f6c Downloading 2.097MB
41c65f6bdf40 Downloading 9.437MB
2aa624262f6c Downloading 2.097MB
41c65f6bdf40 Downloading 9.437MB
2aa624262f6c Downloading 2.097MB
41c65f6bdf40 Downloading 9.437MB
2aa624262f6c Downloading 3.146MB
41c65f6bdf40 Downloading 10.49MB
2aa624262f6c Downloading 3.146MB
41c65f6bdf40 Downloading 11.53MB
2aa624262f6c Downloading 3.146MB
41c65f6bdf40 Downloading 11.53MB
2aa624262f6c Downloading 3.146MB
41c65f6bdf40 Downloading 11.53MB
2aa624262f6c Downloading 3.146MB
41c65f6bdf40 Downloading 11.53MB
2aa624262f6c Downloading 3.146MB
41c65f6bdf40 Downloading 11.53MB
2aa624262f6c Downloading 3.146MB
41c65f6bdf40 Downloading 11.53MB
2aa624262f6c Downloading 4.194MB
41c65f6bdf40 Downloading 12.58MB
2aa624262f6c Downloading 4.194MB
41c65f6bdf40 Downloading 12.58MB
2aa624262f6c Downloading 4.194MB
41c65f6bdf40 Downloading 12.58MB
2aa624262f6c Downloading 4.194MB
41c65f6bdf40 Downloading 12.58MB
2aa624262f6c Downloading 4.194MB
41c65f6bdf40 Downloading 12.58MB
2aa624262f6c Downloading 4.194MB
41c65f6bdf40 Downloading 12.58MB
2aa624262f6c Downloading 4.194MB
41c65f6bdf40 Downloading 12.58MB
2aa624262f6c Downloading 4.194MB
41c65f6bdf40 Downloading 12.58MB
2aa624262f6c Downloading 4.194MB
41c65f6bdf40 Downloading 12.58MB
2aa624262f6c Downloading 4.194MB
41c65f6bdf40 Downloading 13.63MB
2aa624262f6c Downloading 5.243MB
41c65f6bdf40 Downloading 13.63MB
2aa624262f6c Downloading 5.243MB
41c65f6bdf40 Downloading 13.63MB
2aa624262f6c Downloading 5.243MB
41c65f6bdf40 Downloading 13.63MB
2aa624262f6c Downloading 5.243MB
41c65f6bdf40 Downloading 13.63MB
2aa624262f6c Downloading 5.243MB
41c65f6bdf40 Downloading 13.63MB
2aa624262f6c Downloading 5.243MB
41c65f6bdf40 Downloading 13.63MB
2aa624262f6c Downloading 5.243MB
41c65f6bdf40 Downloading 13.63MB
2aa624262f6c Downloading 5.243MB
41c65f6bdf40 Downloading 14.68MB
2aa624262f6c Downloading 6.291MB
41c65f6bdf40 Downloading 14.68MB
2aa624262f6c Downloading 6.291MB
41c65f6bdf40 Downloading 14.68MB
2aa624262f6c Downloading 6.291MB
41c65f6bdf40 Downloading 14.68MB
2aa624262f6c Downloading 6.291MB
41c65f6bdf40 Downloading 14.68MB
2aa624262f6c Downloading 6.291MB
41c65f6bdf40 Downloading 14.68MB
2aa624262f6c Downloading 6.291MB
41c65f6bdf40 Downloading 14.68MB
2aa624262f6c Downloading 7.34MB
41c65f6bdf40 Downloading 15.73MB
2aa624262f6c Downloading 7.34MB
41c65f6bdf40 Downloading 15.73MB
2aa624262f6c Downloading 7.34MB
41c65f6bdf40 Downloading 15.73MB
2aa624262f6c Downloading 7.34MB
41c65f6bdf40 Downloading 15.73MB
2aa624262f6c Downloading 7.34MB
41c65f6bdf40 Downloading 16.78MB
2aa624262f6c Downloading 8.389MB
41c65f6bdf40 Downloading 16.78MB
2aa624262f6c Downloading 8.389MB
41c65f6bdf40 Downloading 16.78MB
2aa624262f6c Downloading 8.389MB
41c65f6bdf40 Downloading 16.78MB
2aa624262f6c Downloading 8.389MB
41c65f6bdf40 Downloading 17.83MB
2aa624262f6c Downloading 8.389MB
41c65f6bdf40 Downloading 17.83MB
2aa624262f6c Downloading 8.389MB
41c65f6bdf40 Downloading 17.83MB
2aa624262f6c Downloading 8.389MB
41c65f6bdf40 Downloading 17.83MB
2aa624262f6c Downloading 8.389MB
41c65f6bdf40 Downloading 17.83MB
2aa624262f6c Downloading 8.389MB
41c65f6bdf40 Downloading 17.83MB
2aa624262f6c Downloading 8.389MB
41c65f6bdf40 Downloading 18.87MB
2aa624262f6c Downloading 8.389MB
41c65f6bdf40 Downloading 18.87MB
2aa624262f6c Downloading 9.437MB
41c65f6bdf40 Downloading 18.87MB
2aa624262f6c Downloading 9.437MB
41c65f6bdf40 Downloading 18.87MB
2aa624262f6c Downloading 9.437MB
41c65f6bdf40 Downloading 18.87MB
2aa624262f6c Downloading 9.437MB
41c65f6bdf40 Downloading 18.87MB
2aa624262f6c Downloading 9.437MB
41c65f6bdf40 Downloading 18.87MB
2aa624262f6c Downloading 9.437MB
41c65f6bdf40 Downloading 18.87MB
2aa624262f6c Downloading 9.437MB
41c65f6bdf40 Downloading 18.87MB
2aa624262f6c Downloading 9.437MB
41c65f6bdf40 Downloading 18.87MB
2aa624262f6c Downloading 9.437MB
41c65f6bdf40 Downloading 18.87MB
2aa624262f6c Downloading 9.437MB
41c65f6bdf40 Downloading 18.87MB
2aa624262f6c Downloading 9.437MB
41c65f6bdf40 Downloading 18.87MB
2aa624262f6c Downloading 9.437MB
41c65f6bdf40 Downloading 18.87MB
2aa624262f6c Downloading 9.437MB
41c65f6bdf40 Downloading 19.92MB
2aa624262f6c Downloading 9.437MB
41c65f6bdf40 Downloading 19.92MB
2aa624262f6c Downloading 9.437MB
41c65f6bdf40 Downloading 19.92MB
2aa624262f6c Downloading 10.49MB
41c65f6bdf40 Downloading 19.92MB
2aa624262f6c Downloading 10.49MB
41c65f6bdf40 Downloading 19.92MB
2aa624262f6c Downloading 10.49MB
41c65f6bdf40 Downloading 19.92MB
2aa624262f6c Downloading 10.49MB
41c65f6bdf40 Downloading 19.92MB
2aa624262f6c Downloading 10.49MB
41c65f6bdf40 Downloading 20.97MB
2aa624262f6c Downloading 10.49MB
41c65f6bdf40 Downloading 20.97MB
2aa624262f6c Downloading 10.49MB
41c65f6bdf40 Downloading 20.97MB
2aa624262f6c Downloading 10.49MB
41c65f6bdf40 Downloading 20.97MB
2aa624262f6c Downloading 11.53MB
41c65f6bdf40 Downloading 22.02MB
2aa624262f6c Downloading 11.53MB
41c65f6bdf40 Downloading 22.02MB
2aa624262f6c Downloading 11.53MB
41c65f6bdf40 Downloading 22.02MB
2aa624262f6c Downloading 11.53MB
41c65f6bdf40 Downloading 23.07MB
2aa624262f6c Downloading 11.53MB
41c65f6bdf40 Downloading 23.07MB
2aa624262f6c Downloading 11.53MB
41c65f6bdf40 Downloading 23.07MB
2aa624262f6c Downloading 11.53MB
41c65f6bdf40 Downloading 23.07MB
2aa624262f6c Downloading 11.53MB
41c65f6bdf40 Downloading 23.07MB
2aa624262f6c Downloading 12.58MB
41c65f6bdf40 Downloading 24.12MB
2aa624262f6c Downloading 12.58MB
41c65f6bdf40 Downloading 24.12MB
2aa624262f6c Downloading 12.58MB
41c65f6bdf40 Downloading 24.12MB
2aa624262f6c Downloading 12.58MB
41c65f6bdf40 Downloading 24.12MB
2aa624262f6c Downloading 12.58MB
41c65f6bdf40 Downloading 25.17MB
2aa624262f6c Downloading 12.58MB
41c65f6bdf40 Downloading 25.17MB
2aa624262f6c Downloading 12.58MB
41c65f6bdf40 Downloading 25.17MB
2aa624262f6c Download complete 0B
41c65f6bdf40 Downloading 25.17MB
41c65f6bdf40 Downloading 26.21MB
41c65f6bdf40 Downloading 27.26MB
41c65f6bdf40 Downloading 28.31MB
41c65f6bdf40 Downloading 29.36MB
41c65f6bdf40 Downloading 31.46MB
41c65f6bdf40 Downloading 32.51MB
41c65f6bdf40 Downloading 33.55MB
41c65f6bdf40 Downloading 34.6MB
41c65f6bdf40 Downloading 35.65MB
41c65f6bdf40 Downloading 36.7MB
41c65f6bdf40 Downloading 37.75MB
41c65f6bdf40 Downloading 38.8MB
41c65f6bdf40 Download complete 0B
41c65f6bdf40 Extracting 1B
f541ec1a4067 Pull complete 0B
23ee6393f192 Pull complete 0B
8f5ec9da9bc0 Pull complete 0B
4a17d49bb7c9 Pull complete 0B
2aa624262f6c Extracting 1B
41c65f6bdf40 Pull complete 0B
2aa624262f6c Extracting 1B
f2d515a8401d Pull complete 0B
2aa624262f6c Pull complete 0B
Image mongo-express:1.0.2 Pulled
Network mongodb-practice_default Creating
Volume mongodb-practice_mongo-data Creating
Network mongodb-practice_default Creating
Volume mongodb-practice_mongo-data Created
Network mongodb-practice_default Created
Container course-mongo Creating
Container course-mongo Created
Container mongodb-practice-seed-1 Creating
Container mongodb-practice-mongo-express-1 Creating
Container mongodb-practice-mongo-express-1 Created
Container mongodb-practice-seed-1 Created
Container course-mongo Starting
Container course-mongo Started
Container course-mongo Waiting
Container course-mongo Healthy
Container mongodb-practice-seed-1 Starting
Container mongodb-practice-mongo-express-1 Starting
Container mongodb-practice-mongo-express-1 Started
Container mongodb-practice-seed-1 Started

Порядок в выводе задан зависимостями. Сначала сервер должен ответить на проверку ping — это строка Healthy. Только после неё стартуют seed и mongo-express: пока сервер не отвечает, загрузка не пройдёт. Что сделал seed, видно в его журнале:

Терминалжурнал загрузки
docker compose logs seed
Выводдвенадцать коллекций
hh.companies           <- hh.companies.json
hh.interviews          <- hh.interviews.json
hh.resumes             <- hh.resumes.json
hh.vacancies           <- hh.vacancies.json
logs.events            <- logs.events.json
org.categories         <- org.categories.json
org.employees          <- org.employees.json
sandbox.products       <- sandbox.products.json
sandbox.warehouse      <- sandbox.warehouse.json
shop.customers         <- shop.customers.json
shop.orders            <- shop.orders.json
shop.products          <- shop.products.json
Готово: базы курса загружены

Двенадцать файлов — двенадцать коллекций в пяти базах. При следующем docker compose up -d загрузчик увидит, что заказы уже на месте, и ничего не тронет: ваши изменения в sandbox не пропадут от перезапуска. Проверить, что работает сейчас:

Терминалсостояние контейнеров
docker compose ps
Выводчерез полминуты после up
NAME                               IMAGE                 COMMAND                  SERVICE         CREATED         STATUS                   PORTS
course-mongo                       mongo:7  mongo           4 minutes ago   Up 4 minutes (healthy)   0.0.0.0:27017->27017/tcp, [::]:27017->27017/tcp
mongodb-practice-mongo-express-1   mongo-express:1.0.2  mongo-express   4 minutes ago   Up 3 minutes             127.0.0.1:8081->8081/tcp

seed работает несколько секунд, поэтому сразу после up он ещё может быть в списке. Когда загрузка закончится, контейнеров останется два: course-mongo и mongo-express. seed из списка пропал — он сделал работу и завершился. В колонке PORTS видно, какие порты контейнеров открыты на компьютере: 27017 для сервера и 8081 для браузера.

§7Шаг 4. Данные в браузере

Откройте http://localhost:8081. Браузер спросит логин и пароль — student и student. Это mongo-express: веб-клиент MongoDB, который заменяет Compass, когда тот не установлен.

Главная страница mongo-express: список баз данных стенда
mongo-express · стенд в Docker — те же базы, что в Compass в главе 1.1

Список баз совпадает с тем, что вернул list_database_names() в главе 1.1: пять баз курса и три служебные. Зелёная кнопка View открывает базу, красная Del удаляет её вместе со всеми коллекциями. Ниже на странице — Server Status: версия сервера (у нас 7.0.40), время работы и счётчики операций.

База shop в mongo-express: коллекции customers, orders, products
mongo-express · база shop
Документы коллекции shop.products в mongo-express
mongo-express · shop.products — документы коллекции

У базы shop внизу страницы — Database Stats: 3 коллекции, 161 документ, 79.3 KB данных. Это те же 79.32 kB, что Compass показал в главе 1.1, — сервер и данные одни и те же, отличается только клиент. В коллекции документы идут таблицей по 20 на страницу, поэтому 21 товар занял две страницы. Массив stock свёрнут в ⊕{2 items} и раскрывается щелчком. Строка Simple ищет по одному полю, Advanced принимает фильтр-документ, как find. Красная полоса Delete all 21 documents retrieved удаляет всё, что сейчас найдено, — при пустом фильтре это вся коллекция. Поэтому упражнения в mongo-express, как и в коде, делаются только в sandbox.

На полях: а если Compass всё-таки установился

Тогда он подключается к контейнеру без всяких изменений: New Connection, адрес mongodb://localhost:27017, Connect. Docker пробрасывает порт сервера на компьютер, и для Compass контейнер ничем не отличается от установленного сервера. Все кадры Compass в этом справочнике сняты с сервера в контейнере.

Осторожно: mongo-express — только для стенда курса

Через этот интерфейс можно удалить любую базу. Поэтому порт 8081 открыт только для вашего компьютера (127.0.0.1), а вход закрыт паролем. Выставлять такой интерфейс в интернет нельзя; почему — разобрано в разделе «Кейсы».

§8Шаг 5. Подключиться из кода

В папке hello лежит короткая программа на каждом из четырёх языков. Она делает то же, что §6 главы 1.1: подключается, печатает версию сервера, список баз и число документов. Запуск — одной командой; язык определяется по расширению файла:

ТерминалPython в контейнере
docker compose run --rm python hello/hello.py
ТерминалC++ в контейнере
docker compose run --rm cpp hello/hello.cpp
# первый раз образ собирается несколько минут: драйвер C++
# компилируется из исходников. Дальше — секунды
ТерминалGo в контейнере
docker compose run --rm go hello/hello.go
# первый запуск скачивает драйвер; модули сохраняются в томе go-modules
ТерминалRuby в контейнере
docker compose run --rm ruby hello/hello.rb
Вывод в терминалстенд в Docker, MongoDB 7.0.40
Адрес: mongodb://localhost:27017/
Сервер: 7.0.40
Базы данных: ['admin', 'config', 'hh', 'local', 'logs', 'org', 'sandbox', 'shop']
Коллекции shop: ['customers', 'orders', 'products']
Товаров: 21
Заказов: 120
Вывод в терминалстенд в Docker, MongoDB 7.0.40
Адрес: mongodb://localhost:27017
Сервер: 7.0.40
Базы данных: admin config hh local logs org sandbox shop
Коллекции shop: customers orders products
Товаров: 21
Заказов: 120
Вывод в терминалстенд в Docker, MongoDB 7.0.40
Адрес: mongodb://localhost:27017
Сервер: 7.0.40
Базы данных: [admin config hh local logs org sandbox shop]
Коллекции shop: [customers orders products]
Товаров: 21
Заказов: 120
Вывод в терминалстенд в Docker, MongoDB 7.0.40
Адрес: mongodb://localhost:27017/
Сервер: 7.0.40
Базы данных: ["admin", "config", "hh", "local", "logs", "org", "sandbox", "shop"]
Коллекции shop: ["customers", "orders", "products"]
Товаров: 21
Заказов: 120

Разберём команду по словам. run — запустить сервис один раз; --rm — удалить контейнер после завершения, чтобы они не копились; python — имя сервиса из compose.yaml; дальше — путь к файлу от корня репозитория. Путь с обратным слэшем, который подставляет PowerShell по Tab (.\hello\hello.py), тоже подойдёт.

Первая строка вывода — адрес сервера: mongodb://localhost:27017, тот же, что у программы на компьютере и у Compass. Так устроен стенд:

программа на компьютере · Compass mongodb://localhost:27017

Docker пробрасывает порт сервера на компьютер: снаружи контейнера сервер слушает localhost:27017.

программа в контейнере запуска mongodb://localhost:27017

Контейнеры python, ruby, go и cpp подключены к сети сервера (network_mode: service:mongo), поэтому для них сервер — тоже localhost.

Поэтому примеры из глав работают без изменений на всех трёх стендах: на компьютере, в Docker и в Codespaces. В рабочем проекте сервер стоит на другой машине, поэтому адрес в решениях практик и в заготовках глав берётся из переменной окружения MONGO_URI; если её нет, программа подключается к localhost:

Адрес из окруженияPython
import os
from pymongo import MongoClient

URI = os.environ.get("MONGO_URI", "mongodb://localhost:27017/")
client = MongoClient(URI)
Адрес из окруженияC++
const char* env = std::getenv("MONGO_URI");
const std::string uri = env ? env : "mongodb://localhost:27017";
mongocxx::client client{mongocxx::uri{uri}};
Адрес из окруженияGo
uri := os.Getenv("MONGO_URI")
if uri == "" {
    uri = "mongodb://localhost:27017"
}
client, err := mongo.Connect(options.Client().ApplyURI(uri))
Адрес из окруженияRuby
SERVER = ENV.fetch("MONGO_URI", "mongodb://localhost:27017/")
client = Mongo::Client.new(SERVER)

§9Шаг 6. Практика и контрольная точка

Решения практик запускаются той же командой — меняется только путь. Перед каждым прогоном базы возвращаются в исходное состояние сервисом reset: он делает то же, что seed, но перезаписывает коллекции всегда.

ТерминалПР-01 от чистых данных до проверки
docker compose run --rm reset
docker compose run --rm python practice01/solution.py
docker compose run --rm python practice01/check.py
ТерминалПР-01 от чистых данных до проверки
docker compose run --rm reset
docker compose run --rm cpp practice01/solution.cpp      # собрать и запустить
docker compose run --rm python practice01/check.py       # проверка одна на все языки
ТерминалПР-01 от чистых данных до проверки
docker compose run --rm reset
docker compose run --rm go practice01/solution.go
docker compose run --rm python practice01/check.py       # проверка одна на все языки
ТерминалПР-01 от чистых данных до проверки
docker compose run --rm reset
docker compose run --rm ruby practice01/solution.rb
docker compose run --rm python practice01/check.py       # проверка одна на все языки
Вывод check.pyодинаковый для всех четырёх решений
Задача 1 · витрина каталога
 ✓ товаров в каталоге shop.products               21
 ✓ ноутбуков                                      5
 ✓ самый дорогой товар                            'Ноутбук Apple MacBook Air 13'

Задача 2 · приёмка поставки
 ✓ всего позиций в песочнице                      22
 ✓ новинка p-101 заведена                         1
 ✓ новинка p-102 заведена                         1
 ✓ снятый с продажи SKU-CP-018 удалён             0
 ✓ бесплатная доставка у аксессуаров              5
 ✓ остаток по SKU-NB-001                          5
 ✓ остаток по SKU-PH-006                          12
 ✓ остаток по SKU-PR-010                          3
 ✓ эталонная база shop не тронута                 0

Пройдено 12 из 12

Проверка написана на Python и смотрит на состояние базы, поэтому для решений на C++, Go и Ruby её тоже запускают в контейнере python. Контрольная точка — так же, свой файл кладёте в папку kt01:

ТерминалКТ-01
docker compose run --rm reset
docker compose run --rm python kt01/inventory.py
docker compose run --rm python kt01/check.py
ТерминалКТ-01
docker compose run --rm reset
docker compose run --rm cpp kt01/inventory.cpp
docker compose run --rm python kt01/check.py
ТерминалКТ-01
docker compose run --rm reset
docker compose run --rm go kt01/inventory.go
docker compose run --rm python kt01/check.py
ТерминалКТ-01
docker compose run --rm reset
docker compose run --rm ruby kt01/inventory.rb
docker compose run --rm python kt01/check.py

Файл запускается из своей папки, поэтому stocktake.json рядом с решением открывается по короткому имени — как если бы вы сделали cd kt01 и запустили скрипт на компьютере.

§10Без установки: Codespaces

GitHub Codespaces — редактор VS Code в браузере, под которым работает виртуальная машина GitHub. В репозитории практик есть папка .devcontainer: по ней Codespaces поднимает тот же compose.yaml — сервер, базы курса, mongo-express — и ставит Python, Go и Ruby с драйверами.

  1. Войдите на github.com — аккаунт бесплатный.
  2. Откройте репозиторий практик и нажмите Code → Codespaces → Create codespace on main.
  3. Подождите 3–5 минут: в первый раз окружение собирается с нуля. Когда в нижней панели откроется терминал, всё готово.
  4. При первом открытии терминала редактор спросит «Вы доверяете авторам файлов в этой папке?» — нажмите Доверять папке и продолжить. Без этого терминал не запустится.
  5. Проверьте подключение и запустите практику прямо в терминале редактора — Docker там уже не нужен, вы и так внутри контейнера.
Меню Code, вкладка Codespaces, кнопка Create codespace on main
GitHub · Code → Codespaces → Create codespace on main. Меню одинаковое у любого репозитория
Терминал CodespacesPython
python hello/hello.py
cd practice01
python solution.py
python check.py
Терминал CodespacesC++
# Драйвер C++ в Codespaces не установлен: его сборка заняла бы
# бо́льшую часть бесплатных часов. Для C++ — путь А, Docker Desktop.
# Самопроверка и данные в Codespaces работают:
python hello/hello.py
Терминал CodespacesGo
cd hello && go run hello.go && cd ..
cd practice01
go run solution.go
python check.py
Терминал CodespacesRuby
ruby hello/hello.rb
cd practice01
ruby solution.rb
python check.py

mongo-express открывается на вкладке Ports рядом с терминалом: строка с портом 8081, значок глобуса. Вместо Compass в Codespaces удобнее расширение MongoDB for VS Code — оно уже установлено. В нём создаётся подключение mongodb://localhost:27017, и базы видны деревом в боковой панели.

Codespace в браузере: вкладка Порты со строкой 8081
Codespaces · вкладка Порты: порт 8081 перенаправлен — ссылка во второй колонке открывает mongo-express
120ядро-часов в месяц бесплатно на личном аккаунте GitHub ≈ 60 чработы на стандартной машине с двумя ядрами 15 ГБместа в месяц на все сохранённые codespaces

Часы расходуются, пока codespace запущен, даже если вкладка закрыта. Остановится он сам через 30 минут бездействия, но надёжнее остановить руками: Code → Codespaces → ⋯ → Stop codespace. Код при остановке сохраняется; чтобы он попал в ваш репозиторий, его коммитят и отправляют, как обычно.

§11Сбросить, остановить, удалить

КомандаЧто происходитДанные
docker compose run --rm resetБазы курса перезаписываются зановоИзменения в sandbox пропадут — для этого и нужна
docker compose stopКонтейнеры останавливаются, память освобождаетсяОстаются
docker compose up -dВсё запускается сноваОстаются; seed ничего не перезаписывает
docker compose downКонтейнеры удаляютсяОстаются в томе mongo-data
docker compose down -vУдаляются контейнеры и томаУдаляются. Следующий up -d начнёт с чистого сервера

Консоль сервера, если нужна: docker exec -it course-mongo mongosh. В ней работают все команды оболочки из глав справочника; выход — exit.

§12Частые ошибки

Что происходитЧто видноВ чём дело
Docker Desktop не запущенerror during connect: … open //./pipe/dockerDesktopLinuxEngine: The system cannot find the file specified.Команда docker есть, движка нет. Запустите Docker Desktop и дождитесь Engine running
Docker Desktop не запущенfailed to connect to the docker API at unix:///Users/…/.docker/run/docker.sock; check if the path is correct and if the daemon is runningКоманда docker есть, движка нет. Запустите Docker Desktop из «Программ» и дождитесь Engine running
Служба Docker не запущенаfailed to connect to the docker API at unix:///var/run/docker.sock; check if the path is correct and if the daemon is runningsudo systemctl start docker; чтобы стартовала вместе с системой — sudo systemctl enable docker
Docker не установлен или терминал открыт до установкиdocker : The term 'docker' is not recognized as the name of a cmdlet…Закройте и заново откройте PowerShell. Не помогло — Docker не установлен, путь Б
Docker не установлен или ни разу не запускалсяzsh: command not found: dockerКоманду docker в систему добавляет первый запуск Docker Desktop. Запустите его и откройте новое окно терминала
Docker не установленbash: docker: command not foundУстановите Docker Engine скриптом из §4
Docker Desktop не стартуетСообщение о виртуализации или о том, что WSL 2 не установлен или устарелВиртуализация включается в BIOS, WSL обновляется командой wsl --update — обоим нужны права администратора. Без них — путь Б
Docker Desktop не открываетсяПриложение сразу закрывается или macOS сообщает, что его нельзя запуститьСкачана сборка не для вашего процессора: у Apple Silicon и Intel они разные. Проверьте «Чип» в «Об этом Mac» и скачайте нужную
Пользователь не в группе dockerpermission denied while trying to connect to the docker API at unix:///var/run/docker.socksudo usermod -aG docker $USER, затем выйти из системы и войти снова. Пока не перелогинились, работает только sudo docker …
Команда выполнена не в той папкеno configuration file provided: not foundDocker ищет compose.yaml в текущей папке. Перейдите в корень репозитория
Порт 27017 занят другим контейнеромBind for 0.0.0.0:27017 failed: port is already allocatedРаботает другой проект с MongoDB. docker ps покажет его имя, docker stop имя остановит
Порт 27017 занят MongoDB, установленной в системуports are not available: exposing port TCP 0.0.0.0:27017 … bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.Кто занял: Get-NetTCPConnection -LocalPort 27017. Служба останавливается командой Stop-Service MongoDB от администратора. Прав нет — возьмите другой порт: Set-Content .env "MONGO_PORT=27018" в корне репозитория, и Compass подключайте к localhost:27018
Порт 27017 занят MongoDB, установленной в системуports are not available: exposing port TCP 0.0.0.0:27017 -> 127.0.0.1:0: listen tcp 0.0.0.0:27017: bind: address already in useКто занял: lsof -nP -iTCP:27017 -sTCP:LISTEN. MongoDB из Homebrew останавливается командой brew services stop mongodb-community. Или другой порт: echo "MONGO_PORT=27018" > .env в корне репозитория, и Compass — к localhost:27018
Порт 27017 занят MongoDB, установленной в системуError starting userland proxy: listen tcp4 0.0.0.0:27017: bind: address already in useКто занял: sudo ss -ltnp 'sport = :27017'. Служба останавливается командой sudo systemctl stop mongod. Или другой порт: echo "MONGO_PORT=27018" > .env в корне репозитория
Путь к файлу от папки практикиФайл не найден: solution.py (путь считается от корня репозитория)Команда выполняется из корня, путь пишется целиком: practice01/solution.py
Числа в check.py не сходятся после второго прогонаОшибка E11000 или лишние документыБазы остались от прошлого запуска. Перед прогоном — docker compose run --rm reset

§13Проверьте себя

Compass показывает connect ECONNREFUSED 127.0.0.1:27017. Надо переустанавливать Compass?

Нет. Compass работает — он дошёл до порта и получил отказ. На порту нет сервера. После docker compose up -d то же подключение заработает без изменений.

Пример из главы подключается к mongodb://localhost:27017. Почему он работает и в контейнере python, хотя у каждого контейнера свой localhost?

Контейнеры запуска подключены к сети контейнера с сервером — в compose.yaml у них указано network_mode: service:mongo. Для программы внутри такой контейнер и сервер — одна машина, и порт 27017 открыт на её localhost.

Вы выполнили docker compose down. Пропали ли документы в sandbox?

Нет. Данные сервера лежат в томе mongo-data, а down удаляет только контейнеры. Том удаляет down -v.

Зачем два сервиса загрузки — seed и reset?

seed запускается при каждом up и заливает данные, только если сервер пустой, — иначе каждый перезапуск стирал бы вашу работу. reset вызывают сами, когда нужны чистые данные, и он перезаписывает коллекции всегда.

Почему проверка практики на Go запускается в контейнере python?

check.py написан на Python и проверяет состояние базы; код он не читает. Решение на любом языке меняет одну и ту же базу, поэтому проверка одна.

§14Шпаргалка

Поднять стенд cd mongodb-practice docker compose up -d docker compose ps
Посмотреть данные http://localhost:8081 # student / student docker exec -it course-mongo mongosh
Запустить код docker compose run --rm python practice01/solution.py # ruby … .rb · go … .go · cpp … .cpp docker compose run --rm python practice01/check.py
Сбросить и остановить docker compose run --rm reset docker compose stop docker compose down -v # вместе с данными

Итог главы

Если Compass не подключается, чаще всего дело в сервере: его нет на порту 27017. Сервер в контейнере поднимается командой docker compose up -d вместе с базами курса и mongo-express на localhost:8081. Код запускается командой docker compose run --rm с путём к файлу, а адрес сервера везде один — mongodb://localhost:27017. Если не ставится и Docker Desktop, тот же стенд открывается в Codespaces. Дальше — снова к данным: глава 1.2 о том, как устроен документ.

Глава 1.1а · Стенд в Docker · Справочник по MongoDB Автор: Макаров Максим Николаевич