diff --git a/docs/4. Docker Compose - несколько сервисов, сеть, тома.md b/docs/4. Docker Compose - несколько сервисов, сеть, тома.md index 2590c46..0d80b1f 100644 --- a/docs/4. Docker Compose - несколько сервисов, сеть, тома.md +++ b/docs/4. Docker Compose - несколько сервисов, сеть, тома.md @@ -46,33 +46,16 @@ docker compose up -d --build **Скриншот:** открытая главная страница с зелёными статусами и списком заметок. - + ---- - -## Логическая схема стека - -1. **Пользователь хоста** подключается только к **proxy** (порт `HTTP_PORT`). -2. **proxy** по пути `/` отдаёт статику с **web**; по `/api/` — **api** (внутренний URL без префикса `/api`). -3. **api** ходит в **db** по hostname `db` и порту `5432` (стандарт Postgres) — резолвится DNS-ом Docker в той же сети `backend`. -4. Данные БД — в томе **`pgdata`**; загруженные файлы API — в томе **`api_uploads`**. - -**Скриншот:** нарисованная схема стрелок browser → proxy → web/api → db; подписать тома. - - - ---- - -## Разбор ключевых фрагментов `compose.yaml` - -### Имена и сеть +Нам сейчас не интересна логика работы стека, так как не по теме. +## Разбор ключевых фрагментов `docker-compose.yaml`### Имена и сеть Поле `name: multi-service-demo` задаёт **префикс** для имён контейнеров/ресурсов по умолчанию (удобно не конфликтовать с другими проектами). -Сеть `backend` с драйвером `bridge` — все перечисленные сервисы в одной L2-сети, видят друг друга по **DNS-имени сервиса** (`db`, `api`, `web`, `proxy`). +Сеть `backend` с драйвером `bridge` - все перечисленные сервисы в одной L2-сети, видят друг друга по **DNS-имени сервиса** (`db`, `api`, `web`, `proxy`). ### Зависимости и здоровье - ``` depends_on: db: @@ -81,19 +64,16 @@ depends_on: Без `condition` Compose лишь **упорядочивает** старт, но не ждёт готовности БД. С `healthcheck` у `db` сервис `api` не начнёт считаться поднятым для зависимых, пока Postgres не пройдёт проверку. -**Скриншот:** `docker compose logs db` в момент `database system is ready to accept connections`. - - + ### `expose` vs `ports` -- **`ports`** — публикация на хост (нужно для proxy). -- **`expose`** — документация + открытие порта **между** контейнерами сети; на сетевой интерфейс хоста не выводится. +- **`ports`** - публикация на хост (нужно для proxy). +- **`expose`** - документация + открытие порта **между** контейнерами сети; на сетевой интерфейс хоста не выводится. -Так мы не публикуем Postgres наружу — к БД можно попасть только из контейнеров в той же сети (или если вы явно добавите `ports` для отладки). +Так мы не публикуем Postgres наружу - к БД можно попасть только из контейнеров в той же сети (или если вы явно добавите `ports` для отладки). ### Тома - ```yaml volumes: pgdata: @@ -104,16 +84,11 @@ volumes: ``` echo hello > /tmp/up.txt -# имя контейнера смотрите в выводе: docker compose ps -q api docker cp /tmp/up.txt "$(docker compose ps -q api)":/data/uploads/host-demo.txt docker compose exec api ls -la /data/uploads ``` -**Скриншот:** список файлов в `/data/uploads` внутри контейнера `api`. - - - -Альтернатива для разработки — **bind-mount** каталога с хоста в сервис (в учебном файле не включено, чтобы не привязывать пути к вашему `$HOME`): +Альтернатива для разработки - **bind-mount** каталога с хоста в сервис (в учебном файле не включено, чтобы не привязывать пути к вашему `$HOME`): ```yaml services: @@ -122,8 +97,6 @@ services: - ./local_uploads:/data/uploads ``` ---- - ## Копирование файлов в контейнер в контексте Compose | Способ | Когда использовать | @@ -132,36 +105,14 @@ services: | Именованный / bind том | Данные, логи, загрузки пользователей, меняющиеся без пересборки | | `docker cp` | Разовая отладка, экстренная подмена файла | ---- - ## Обновление одного сервиса после правки кода - ``` # изменили только api/app.py docker compose build api docker compose up -d api ``` -**Скриншот:** пересборка только слоя `COPY app.py` (кэш BuildKit для предыдущих шагов). - - - ---- - -## Просмотр конфигурации, которую «увидел» Compose - -``` -docker compose config -``` - -**Скриншот:** полный YAML после подстановки `.env` (проверьте порты и пароли перед скрином — размыть секреты). - - - ---- - ## Остановка и очистка - Мягко (тома сохраняются): ``` @@ -173,23 +124,6 @@ docker compose down ``` docker compose down -v --rmi local ``` - -**Скриншот:** `docker volume ls` без томов проекта после `down -v`. - - - ---- - -## Идеи для дополнительных скриншотов (по желанию) - -- **Portainer** или Docker Desktop — список контейнеров и томов в GUI. -- **`docker compose top`** — процессы внутри сервисов. -- **Ошибка** неверного `depends_on` / healthcheck — учебный кадр «как выглядит», если api стартует раньше БД без `condition`. - ---- - ## Документация - - [Compose file reference](https://docs.docker.com/compose/compose-file/) - [Networking in Compose](https://docs.docker.com/compose/networking/) -- [Use Compose Watch](https://docs.docker.com/compose/file-watch/) — live reload при разработке (отдельная тема) diff --git a/docs/assets/image_1777886340548.jpg b/docs/assets/image_1777886340548.jpg new file mode 100644 index 0000000..1195e22 Binary files /dev/null and b/docs/assets/image_1777886340548.jpg differ diff --git a/docs/assets/image_1777886554471.jpg b/docs/assets/image_1777886554471.jpg new file mode 100644 index 0000000..5a3f6bb Binary files /dev/null and b/docs/assets/image_1777886554471.jpg differ