From 98330f11f713205659356f998e2a27a106539b9b Mon Sep 17 00:00:00 2001 From: chase Date: Mon, 4 May 2026 12:07:58 +0300 Subject: [PATCH] push --- ...ΎΠΌΠ°Π½Π΄Ρ‹.md => 2. Docker Engine - установка ΠΈ основныС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹.md} | 0 ...Π° ΠΈ COPY.md => 3. Dockerfile - сборка ΠΎΠ±Ρ€Π°Π·Π° ΠΈ COPY.md} | 0 ...Ρ‚ΠΎΠΌΠ°.md => 4. Docker Compose - нСсколько сСрвисов, ΡΠ΅Ρ‚ΡŒ, Ρ‚ΠΎΠΌΠ°.md} | 35 ++++++------------ docs/assets/image_1777885586812.jpg | Bin 0 -> 10493 bytes .../{compose.yaml => docker-compose.yaml} | 0 5 files changed, 12 insertions(+), 23 deletions(-) rename docs/{2. Docker Engine β€” установка ΠΈ основныС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹.md => 2. Docker Engine - установка ΠΈ основныС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹.md} (100%) rename docs/{3. Dockerfile β€” сборка ΠΎΠ±Ρ€Π°Π·Π° ΠΈ COPY.md => 3. Dockerfile - сборка ΠΎΠ±Ρ€Π°Π·Π° ΠΈ COPY.md} (100%) rename docs/{4. Docker Compose β€” нСсколько сСрвисов, ΡΠ΅Ρ‚ΡŒ, Ρ‚ΠΎΠΌΠ°.md => 4. Docker Compose - нСсколько сСрвисов, ΡΠ΅Ρ‚ΡŒ, Ρ‚ΠΎΠΌΠ°.md} (86%) create mode 100644 docs/assets/image_1777885586812.jpg rename examples/multi-service/{compose.yaml => docker-compose.yaml} (100%) diff --git a/docs/2. Docker Engine β€” установка ΠΈ основныС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹.md b/docs/2. Docker Engine - установка ΠΈ основныС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹.md similarity index 100% rename from docs/2. Docker Engine β€” установка ΠΈ основныС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹.md rename to docs/2. Docker Engine - установка ΠΈ основныС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹.md diff --git a/docs/3. Dockerfile β€” сборка ΠΎΠ±Ρ€Π°Π·Π° ΠΈ COPY.md b/docs/3. Dockerfile - сборка ΠΎΠ±Ρ€Π°Π·Π° ΠΈ COPY.md similarity index 100% rename from docs/3. Dockerfile β€” сборка ΠΎΠ±Ρ€Π°Π·Π° ΠΈ COPY.md rename to docs/3. Dockerfile - сборка ΠΎΠ±Ρ€Π°Π·Π° ΠΈ COPY.md diff --git a/docs/4. Docker Compose β€” нСсколько сСрвисов, ΡΠ΅Ρ‚ΡŒ, Ρ‚ΠΎΠΌΠ°.md b/docs/4. Docker Compose - нСсколько сСрвисов, ΡΠ΅Ρ‚ΡŒ, Ρ‚ΠΎΠΌΠ°.md similarity index 86% rename from docs/4. Docker Compose β€” нСсколько сСрвисов, ΡΠ΅Ρ‚ΡŒ, Ρ‚ΠΎΠΌΠ°.md rename to docs/4. Docker Compose - нСсколько сСрвисов, ΡΠ΅Ρ‚ΡŒ, Ρ‚ΠΎΠΌΠ°.md index 4d2cb13..885cc64 100644 --- a/docs/4. Docker Compose β€” нСсколько сСрвисов, ΡΠ΅Ρ‚ΡŒ, Ρ‚ΠΎΠΌΠ°.md +++ b/docs/4. Docker Compose - нСсколько сСрвисов, ΡΠ΅Ρ‚ΡŒ, Ρ‚ΠΎΠΌΠ°.md @@ -4,29 +4,21 @@ ΠšΠΎΠΌΠ°Π½Π΄Ρ‹: -``` -docker compose up -d --build -docker compose ps -docker compose logs -f api -docker compose down -docker compose down -v -``` - -ПослСдняя ΠΊΠΎΠΌΠ°Π½Π΄Π° с **`-v`** ΡƒΠ΄Π°Π»ΠΈΡ‚ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ‚ΠΎΠΌΠ° β€” Π΄Π°Π½Π½Ρ‹Π΅ Π‘Π” ΠΏΡ€ΠΎΠΏΠ°Π΄ΡƒΡ‚ (ΡƒΠ΄ΠΎΠ±Π½ΠΎ для сброса Π΄Π΅ΠΌΠΎ, опасно Ссли это ΠΏΡ€ΠΎΠ΄). - ---- +`docker compose up -d --build` - Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π΄ΠΎΠΊΠ΅Ρ€ компос Π² Ρ„ΠΎΠ½Π΅ ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠ΅Ρ€Π΅ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ +`docker compose ps` - список ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² Π² Π΄ΠΎΠΊΠ΅Ρ€ компос +`docker compose logs -f api` - ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π»ΠΎΠ³ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° `api` ΠΈΠ· Π΄ΠΎΠΊΠ΅Ρ€ компос +`docker compose down` - ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ## Π“Π΄Π΅ Π»Π΅ΠΆΠΈΡ‚ ΡƒΡ‡Π΅Π±Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ +Π’ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½ ΠΏΠΎΠ»Π½Ρ‹ΠΉ стСк, Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ сСрвиса: -Π’ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½ ΠΏΠΎΠ»Π½Ρ‹ΠΉ стСк (Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ сСрвиса): - -| ΠŸΡƒΡ‚ΡŒ | Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ | -|------|------------| -| `docker/examples/multi-service/compose.yaml` | ОписаниС всСх сСрвисов, сСтСй, Ρ‚ΠΎΠΌΠΎΠ² | -| `docker/examples/multi-service/.env.example` | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния для Compose | -| `docker/examples/multi-service/web/` | Nginx + статика Ρ‡Π΅Ρ€Π΅Π· `COPY` | -| `docker/examples/multi-service/api/` | Flask + Postgres + Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Ρ„Π°ΠΉΠ»ΠΎΠ² Π² Ρ‚ΠΎΠΌ | -| `docker/examples/multi-service/proxy/` | Π’Ρ…ΠΎΠ΄Π½ΠΎΠΉ nginx: `/` β†’ web, `/api/` β†’ api | +| ΠŸΡƒΡ‚ΡŒ | Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ | +| ------------------------------------------- | ---------------------------------------- | +| `examples/multi-service/docke-compose.yaml` | ОписаниС всСх сСрвисов, сСтСй, Ρ‚ΠΎΠΌΠΎΠ² | +| `examples/multi-service/.env.example` | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния для Compose | +| `examples/multi-service/web/` | Nginx + статика Ρ‡Π΅Ρ€Π΅Π· `COPY` | +| `examples/multi-service/api/` | Flask + Postgres + Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Ρ„Π°ΠΉΠ»ΠΎΠ² Π² Ρ‚ΠΎΠΌ | +| `examples/multi-service/proxy/` | Π’Ρ…ΠΎΠ΄Π½ΠΎΠΉ nginx: `/` β†’ web, `/api/` β†’ api | Π‘ΠΊΠΎΠΏΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния: @@ -35,12 +27,9 @@ cd docker/examples/multi-service cp .env.example .env ``` -**Π‘ΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚:** Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ ΠΈΠ»ΠΈ IDE с Π΄Π΅Ρ€Π΅Π²ΠΎΠΌ ΠΏΠ°ΠΏΠΎΠΊ `multi-service` (Π²ΠΈΠ΄Π½Ρ‹ `compose.yaml`, `web`, `api`, `proxy`). - Запуск: - ``` docker compose up -d --build ``` diff --git a/docs/assets/image_1777885586812.jpg b/docs/assets/image_1777885586812.jpg new file mode 100644 index 0000000000000000000000000000000000000000..264c3573513c5fcf2fdac1b4bb51d4f576de3cb2 GIT binary patch literal 10493 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≤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