push
This commit is contained in:
@@ -46,33 +46,16 @@ docker compose up -d --build
|
||||
|
||||
**Скриншот:** открытая главная страница с зелёными статусами и списком заметок.
|
||||
|
||||
<img src="./assets/image_1777885916959.jpg" width="auto">
|
||||
<img src="./assets/image_1777886340548.jpg" width="auto">
|
||||
|
||||
---
|
||||
|
||||
## Логическая схема стека
|
||||
|
||||
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; подписать тома.
|
||||
|
||||
<img src="./assets/compose_architecture_diagram.png" width="700">
|
||||
|
||||
---
|
||||
|
||||
## Разбор ключевых фрагментов `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`.
|
||||
|
||||
<img src="./assets/compose_logs_db_ready.png" width="auto">
|
||||
<img src="./assets/image_1777886554471.jpg" width="auto">
|
||||
|
||||
### `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`.
|
||||
|
||||
<img src="./assets/compose_api_uploads_volume.png" width="auto">
|
||||
|
||||
Альтернатива для разработки — **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 для предыдущих шагов).
|
||||
|
||||
<img src="./assets/compose_rebuild_api_cache.png" width="auto">
|
||||
|
||||
---
|
||||
|
||||
## Просмотр конфигурации, которую «увидел» Compose
|
||||
|
||||
```
|
||||
docker compose config
|
||||
```
|
||||
|
||||
**Скриншот:** полный YAML после подстановки `.env` (проверьте порты и пароли перед скрином — размыть секреты).
|
||||
|
||||
<img src="./assets/compose_config_interpolated.png" width="auto">
|
||||
|
||||
---
|
||||
|
||||
## Остановка и очистка
|
||||
|
||||
Мягко (тома сохраняются):
|
||||
|
||||
```
|
||||
@@ -173,23 +124,6 @@ docker compose down
|
||||
```
|
||||
docker compose down -v --rmi local
|
||||
```
|
||||
|
||||
**Скриншот:** `docker volume ls` без томов проекта после `down -v`.
|
||||
|
||||
<img src="./assets/compose_down_volumes_removed.png" width="auto">
|
||||
|
||||
---
|
||||
|
||||
## Идеи для дополнительных скриншотов (по желанию)
|
||||
|
||||
- **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 при разработке (отдельная тема)
|
||||
|
||||
Reference in New Issue
Block a user