# Глава 3 — Управление проектами

# Docker — Операции с проектами

Эта страница описывает базовые операции по управлению Docker-проектами на сервере: организацию директорий, работу с файлами проектов, изменение прав доступа и создание резервных копий. Материал рассчитан на начинающих и помогает понять, **как правильно хранить и обслуживать несколько Docker-проектов на одном сервере**, что особенно актуально для веб-студий и хостинга клиентских проектов.

---

# Типичная структура проектов на сервере

На серверах с несколькими сайтами или сервисами Docker-проекты обычно размещаются в одной общей директории.

Пример структуры:

```
/opt/flamy_projects
```

Внутри неё располагаются отдельные проекты:

```
/opt/flamy_projects
│
├─ site1
│  ├─ docker-compose.yml
│  ├─ .env
│  ├─ Dockerfile
│  └─ src
│
├─ site2
│  ├─ docker-compose.yml
│  └─ src
│
└─ api_service
   ├─ docker-compose.yml
   └─ app
```

Каждый каталог — это **отдельный Docker Compose проект**.

---

# Переход в директорию проекта

Перед выполнением большинства Docker-команд необходимо перейти в директорию проекта.

```bash
cd /opt/flamy_projects
```

Просмотреть содержимое папки:

```bash
ls -la
```

### Когда используется

Эта команда помогает:

* убедиться, что вы работаете в нужной директории
* увидеть список проектов
* проверить наличие файлов конфигурации

---

# Поиск docker-compose файлов

Иногда на сервере много проектов, и нужно найти все compose-файлы.

```bash
find /opt/flamy_projects -type f -name "docker-compose*.yml"
```

Эта команда покажет:

* все `docker-compose.yml`
* дополнительные файлы вроде `docker-compose.prod.yml`

Пример результата:

```
/opt/flamy_projects/site1/docker-compose.yml
/opt/flamy_projects/site2/docker-compose.yml
/opt/flamy_projects/api_service/docker-compose.yml
```

### Когда полезно

* аудит серверов
* поиск старых проектов
* диагностика конфигураций

---

# Проверка файлов проекта

Перед запуском проекта полезно проверить содержимое директории.

```bash
ls -la
```

Пример:

```
docker-compose.yml
.env
Dockerfile
src/
logs/
```

### Что важно проверить

* наличие `docker-compose.yml`
* наличие `.env` файла
* наличие исходного кода

Если файл `docker-compose.yml` отсутствует — проект запустить не получится.

---

# Изменение владельца файлов

Иногда файлы проекта принадлежат неправильному пользователю.
Это может происходить, если:

* проект копировали через `root`
* архив был распакован другим пользователем
* файлы были перенесены с другого сервера

Исправить владельца можно так:

```bash
sudo chown -R Crimson:Crimson /opt/flamy_projects
```

### Что означает команда

| Часть           | Значение                   |
| --------------- | -------------------------- |
| chown           | изменить владельца         |
| -R              | рекурсивно для всех файлов |
| Crimson:Crimson | пользователь и группа      |

---

# Назначение текущего пользователя владельцем

Иногда проще назначить владельцем текущего пользователя.

```bash
sudo chown -R $(id -u):$(id -g) /opt/flamy_projects
```

### Что делают параметры

| Команда | Значение                 |
| ------- | ------------------------ |
| `id -u` | ID текущего пользователя |
| `id -g` | ID текущей группы        |

Это позволяет быстро исправить проблемы с правами.

---

# Изменение прав доступа

Иногда Docker или приложение не может читать файлы из-за неправильных прав.

Исправить можно так:

```bash
sudo chmod -R 755 /opt/flamy_projects
```

### Что означает 755

| Право | Значение                   |
| ----- | -------------------------- |
| 7     | чтение, запись, выполнение |
| 5     | чтение и выполнение        |
| 5     | чтение и выполнение        |

В итоге:

* владелец может изменять файлы
* остальные пользователи могут читать и выполнять

> **Важно:**
> Не стоит использовать `777`, так как это даёт полный доступ всем пользователям и может быть небезопасно.

---

# Резервное копирование проектов

Регулярное резервное копирование помогает защититься от:

* ошибок обновления
* повреждения данных
* случайного удаления файлов

---

# Архивирование проекта

Создать архив можно с помощью `tar`.

```bash
tar -czf flamy_projects_backup_$(date +%Y%m%d).tar.gz /opt/flamy_projects
```

### Что делает команда

| Часть | Значение                 |
| ----- | ------------------------ |
| tar   | инструмент архивирования |
| -c    | создать архив            |
| -z    | сжать через gzip         |
| -f    | имя файла                |

Файл будет иметь имя вроде:

```
flamy_projects_backup_20260311.tar.gz
```

---

# Резервное копирование через rsync

`rsync` позволяет копировать файлы между серверами или папками.

```bash
rsync -avz /opt/flamy_projects/ backup_location/
```

### Что означают параметры

| Параметр | Назначение      |
| -------- | --------------- |
| -a       | архивный режим  |
| -v       | подробный вывод |
| -z       | сжатие данных   |

---

# Пример копирования на другой сервер

```bash
rsync -avz /opt/flamy_projects user@backup-server:/backup/docker_projects
```

Это часто используется для:

* ежедневных backup
* синхронизации серверов
* миграции проектов

---

# Проверка размера проекта

Иногда полезно узнать размер проекта.

```bash
du -sh /opt/flamy_projects/*
```

Пример вывода:

```
1.2G site1
850M site2
430M api_service
```

Это помогает определить:

* какие проекты занимают больше всего места
* где могут находиться большие логи или кэш

---

# Проверка логов проекта

Некоторые проекты сохраняют логи внутри директории.

Например:

```
logs/
storage/logs
var/log
```

Посмотреть последние строки:

```bash
tail -n 100 logs/app.log
```

---

# Типичный рабочий процесс

Обычно работа с проектом выглядит так:

### 1 Перейти в директорию проекта

```bash
cd /opt/flamy_projects/site1
```

---

### 2 Проверить файлы

```bash
ls -la
```

---

### 3 Запустить контейнеры

```bash
docker compose up -d
```

---

### 4 Проверить контейнеры

```bash
docker compose ps
```

---

### 5 Проверить логи

```bash
docker compose logs --tail=50
```

---

# Работа с несколькими проектами

На сервере может быть десятки проектов.

Чтобы понять, какие контейнеры запущены:

```bash
docker ps
```

Можно увидеть:

```
site1_nginx
site2_php
api_service_db
```

Это помогает быстро определить, какие проекты работают.

---

# Полезные советы

## Храните проекты в одной директории

Это упрощает:

* резервное копирование
* администрирование
* поиск конфигураций

---

## Используйте `.env` файлы

В `.env` удобно хранить:

* пароли
* порты
* настройки окружения

---

## Делайте регулярные backup

Минимум раз в день для production-серверов.

---

# Краткая памятка

```bash
cd /opt/flamy_projects                    # перейти в директорию проектов
ls -la                                    # список файлов

find /opt/flamy_projects -name "docker-compose*.yml"  # найти compose файлы

sudo chown -R user:user /opt/flamy_projects  # изменить владельца
sudo chmod -R 755 /opt/flamy_projects        # изменить права

tar -czf backup_$(date +%Y%m%d).tar.gz /opt/flamy_projects  # архив проекта

rsync -avz /opt/flamy_projects/ backup/      # резервная копия

du -sh /opt/flamy_projects/*                 # размер проектов
```

# Docker — Volumes (Хранение данных)

Эта страница объясняет, как Docker хранит постоянные данные контейнеров с помощью **Volumes**. Здесь разобраны основные типы хранения данных, команды управления volumes, а также практические примеры резервного копирования и восстановления данных. Материал рассчитан на начинающих и помогает понять, **где Docker хранит данные и как не потерять их при пересоздании контейнеров**.

---

# Что такое Docker Volume

По умолчанию контейнеры Docker **не сохраняют данные после удаления**.
Если контейнер удалить и создать заново, все файлы внутри него исчезнут.

Чтобы сохранить данные между перезапусками контейнеров, используются **Volumes**.

Volume — это специальное хранилище данных Docker, которое:

* существует независимо от контейнера
* сохраняет данные между перезапусками
* может использоваться несколькими контейнерами

---

# Почему volumes важны

Volumes используются для хранения **постоянных данных**, например:

* базы данных
* загруженные пользователями файлы
* кэш приложений
* логи

Пример:

```text
mysql container
│
└── /var/lib/mysql  → volume
```

Если контейнер удалить и создать заново, данные в volume **сохранятся**.

---

# Где Docker хранит volumes

По умолчанию volumes находятся в системе Docker:

```text
/var/lib/docker/volumes/
```

Каждый volume имеет свою директорию.

Пример структуры:

```text
/var/lib/docker/volumes/mysql_data/_data
```

---

# Типы хранения данных в Docker

Docker поддерживает несколько способов хранения данных.

---

## 1. Docker Volume

Это основной и рекомендуемый способ хранения данных.

Пример в `docker-compose.yml`:

```yaml
services:
  mysql:
    image: mysql:8
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:
```

Преимущества:

* безопасное хранение данных
* управляется Docker
* легко делать backup

---

## 2. Bind Mount

Bind mount подключает **обычную папку сервера** внутрь контейнера.

Пример:

```yaml
services:
  app:
    volumes:
      - ./src:/var/www/html
```

Это означает:

```text
сервер ./src  → контейнер /var/www/html
```

Используется для:

* разработки
* подключения исходного кода
* конфигурационных файлов

---

## Разница между Volume и Bind Mount

| Тип        | Описание              |
| ---------- | --------------------- |
| Volume     | управляется Docker    |
| Bind mount | обычная папка сервера |

Обычно используется:

* **Volumes → данные приложений**
* **Bind mounts → код проекта**

---

# Просмотр volumes

## Список volumes

```bash
docker volume ls
```

Пример вывода:

```text
DRIVER    VOLUME NAME
local     site1_mysql_data
local     redis_cache
```

---

## Информация о volume

```bash
docker volume inspect <volume_name>
```

Пример:

```bash
docker volume inspect site1_mysql_data
```

Результат покажет:

* путь к volume
* драйвер
* настройки

---

# Создание volume

Создать volume можно вручную:

```bash
docker volume create mysql_data
```

После этого volume можно использовать в контейнерах.

---

# Удаление volumes

## Удалить один volume

```bash
docker volume rm <volume>
```

Пример:

```bash
docker volume rm mysql_data
```

---

## Удалить неиспользуемые volumes

```bash
docker volume prune -f
```

Команда удаляет volumes, которые **не используются контейнерами**.

> **Важно:**
> Перед удалением нужно убедиться, что volume не содержит важных данных.

---

# Использование volumes в Docker Compose

Пример конфигурации:

```yaml
services:
  mysql:
    image: mysql:8
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:
```

Это создаёт volume `mysql_data`, который будет хранить данные базы.

---

# Проверка volumes контейнера

Можно посмотреть volumes конкретного контейнера:

```bash
docker inspect <container>
```

Пример:

```bash
docker inspect site1_mysql
```

В выводе нужно найти блок:

```text
Mounts
```

Он показывает подключённые volumes.

---

# Резервное копирование volume

Очень важная операция — backup данных.

---

## Backup volume

```bash
docker run --rm \
  -v mysql_data:/data \
  -v $(pwd):/backup \
  alpine tar czf /backup/mysql_backup.tar.gz /data
```

Эта команда:

1. подключает volume
2. создаёт архив
3. сохраняет backup в текущей директории

---

# Восстановление volume

Чтобы восстановить данные:

```bash
docker run --rm \
  -v mysql_data:/data \
  -v $(pwd):/backup \
  alpine tar xzf /backup/mysql_backup.tar.gz -C /
```

После этого данные снова появятся в volume.

---

# Типичные ошибки при работе с volumes

## Потеря данных после удаления контейнера

Если данные хранятся **внутри контейнера**, а не в volume, они будут потеряны.

Правильная практика:

```yaml
volumes:
  - mysql_data:/var/lib/mysql
```

---

## Удаление volume вместе с проектом

Команда:

```bash
docker compose down -v
```

удаляет:

* контейнеры
* сети
* volumes

Это приведёт к **потере данных**.

---

## Использование bind mount для базы данных

Не рекомендуется хранить базы данных через bind mount.

Лучше использовать:

```yaml
volumes:
  - mysql_data:/var/lib/mysql
```

---

# Проверка volumes проекта

Показать volumes Compose проекта:

```bash
docker compose config --volumes
```

Это помогает понять, какие volumes использует проект.

---

# Краткая памятка

```bash
docker volume ls                    # список volumes
docker volume inspect <volume>     # информация о volume
docker volume create <volume>      # создать volume
docker volume rm <volume>          # удалить volume

docker volume prune -f             # удалить неиспользуемые volumes

docker inspect <container>         # посмотреть volumes контейнера
```

# Docker — Images (Управление образами)

Эта страница объясняет, что такое Docker-образы (Images), как они создаются, хранятся и управляются. Здесь разобраны основные команды для просмотра, загрузки, удаления и очистки образов. Материал рассчитан на начинающих и помогает понять, **как работают Docker-образы и как управлять ими на сервере**.

---

# Что такое Docker Image

Docker Image — это **шаблон контейнера**, из которого создаются запущенные контейнеры.

Проще говоря:

```text
Docker Image → контейнер
```

Пример:

```text
nginx:1.25  → контейнер nginx
mysql:8     → контейнер mysql
node:18     → контейнер node
```

Image содержит:

* операционную систему
* зависимости
* приложение
* конфигурацию запуска

Контейнер создаётся на основе образа и запускается как отдельный процесс.

---

# Как работают Docker Images

Docker Images состоят из **слоёв (layers)**.

Пример:

```text
Base OS
↓
System packages
↓
Application dependencies
↓
Application code
```

Каждый слой кэшируется.
Это позволяет Docker **ускорять сборку образов**.

---

# Просмотр образов

## Показать список образов

```bash
docker images
```

Пример вывода:

```text
REPOSITORY   TAG      IMAGE ID       SIZE
nginx        1.25     a1b2c3d4e5     142MB
mysql        8        f6g7h8i9j0     520MB
node         18       k1l2m3n4o5     1.2GB
```

### Что означает каждая колонка

| Поле       | Описание      |
| ---------- | ------------- |
| REPOSITORY | имя образа    |
| TAG        | версия образа |
| IMAGE ID   | уникальный ID |
| SIZE       | размер образа |

---

# Загрузка образа из registry

Docker может скачивать готовые образы из Docker Hub или другого registry.

```bash
docker pull <image>
```

Пример:

```bash
docker pull nginx:1.25
```

После этого образ появится в списке `docker images`.

---

# Теги образов

Docker использует **теги** для обозначения версии образа.

Пример:

```text
nginx:latest
nginx:1.25
node:18
```

### Почему не стоит использовать `latest`

Тег `latest` может измениться в любой момент.

Лучше использовать фиксированную версию:

```text
nginx:1.25
```

Это делает окружение более предсказуемым.

---

# Удаление Docker Images

## Удалить образ

```bash
docker rmi <image>
```

Пример:

```bash
docker rmi nginx:1.25
```

---

## Удалить образ по ID

```bash
docker rmi <image_id>
```

Пример:

```bash
docker rmi a1b2c3d4e5
```

---

## Удалить неиспользуемые образы

```bash
docker image prune -f
```

Удаляются **dangling images** — образы, которые больше не используются.

---

# Полная очистка старых образов

Если на сервере накопилось много старых образов:

```bash
docker system prune -a
```

Эта команда удалит:

* остановленные контейнеры
* неиспользуемые образы
* сети
* build cache

> **Важно:**
> Использовать эту команду нужно осторожно, особенно на production.

---

# Сборка образа

Образы можно создавать самостоятельно через `Dockerfile`.

Пример сборки:

```bash
docker build -t my_app .
```

Где:

| Параметр | Значение           |
| -------- | ------------------ |
| -t       | тег образа         |
| my_app   | имя образа         |
| .        | текущая директория |

---

# Проверка истории образа

Можно посмотреть, из каких слоёв состоит образ:

```bash
docker history <image>
```

Пример:

```bash
docker history nginx
```

Это помогает понять:

* какие команды выполнялись при сборке
* размер каждого слоя

---

# Использование образа для запуска контейнера

Контейнер можно запустить напрямую:

```bash
docker run nginx
```

Но чаще используется Docker Compose.

Пример:

```yaml
services:
  nginx:
    image: nginx:1.25
```

---

# Поиск образов

Можно искать образы на Docker Hub:

```bash
docker search nginx
```

Пример результата:

```text
NAME              DESCRIPTION
nginx             Official build of Nginx
nginx-unit        Nginx Unit runtime
```

Лучше использовать **официальные образы**.

---

# Типичные проблемы с образами

## Слишком много образов на сервере

Проверить:

```bash
docker images
```

Удалить старые:

```bash
docker image prune -f
```

---

## Образ не обновляется

Если используется:

```text
nginx:latest
```

Docker может использовать старую версию.

Решение:

```bash
docker pull nginx
```

---

## Слишком большой размер образа

Некоторые образы могут занимать несколько гигабайт.

Проверить:

```bash
docker images
```

При необходимости удалить неиспользуемые.

---

# Краткая памятка

```bash
docker images                     # список образов
docker pull <image>               # скачать образ
docker search <image>             # поиск образа

docker rmi <image>                # удалить образ
docker image prune -f             # удалить неиспользуемые образы

docker build -t <name> .          # собрать образ
docker history <image>            # история слоев образа
```