Глава 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-команд необходимо перейти в директорию проекта.

cd /opt/flamy_projects

Просмотреть содержимое папки:

ls -la

Когда используется

Эта команда помогает:


Поиск docker-compose файлов

Иногда на сервере много проектов, и нужно найти все compose-файлы.

find /opt/flamy_projects -type f -name "docker-compose*.yml"

Эта команда покажет:

Пример результата:

/opt/flamy_projects/site1/docker-compose.yml
/opt/flamy_projects/site2/docker-compose.yml
/opt/flamy_projects/api_service/docker-compose.yml

Когда полезно


Проверка файлов проекта

Перед запуском проекта полезно проверить содержимое директории.

ls -la

Пример:

docker-compose.yml
.env
Dockerfile
src/
logs/

Что важно проверить

Если файл docker-compose.yml отсутствует — проект запустить не получится.


Изменение владельца файлов

Иногда файлы проекта принадлежат неправильному пользователю. Это может происходить, если:

Исправить владельца можно так:

sudo chown -R Crimson:Crimson /opt/flamy_projects

Что означает команда

Часть Значение
chown изменить владельца
-R рекурсивно для всех файлов
Crimson:Crimson пользователь и группа

Назначение текущего пользователя владельцем

Иногда проще назначить владельцем текущего пользователя.

sudo chown -R $(id -u):$(id -g) /opt/flamy_projects

Что делают параметры

Команда Значение
id -u ID текущего пользователя
id -g ID текущей группы

Это позволяет быстро исправить проблемы с правами.


Изменение прав доступа

Иногда Docker или приложение не может читать файлы из-за неправильных прав.

Исправить можно так:

sudo chmod -R 755 /opt/flamy_projects

Что означает 755

Право Значение
7 чтение, запись, выполнение
5 чтение и выполнение
5 чтение и выполнение

В итоге:

Важно: Не стоит использовать 777, так как это даёт полный доступ всем пользователям и может быть небезопасно.


Резервное копирование проектов

Регулярное резервное копирование помогает защититься от:


Архивирование проекта

Создать архив можно с помощью tar.

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 позволяет копировать файлы между серверами или папками.

rsync -avz /opt/flamy_projects/ backup_location/

Что означают параметры

Параметр Назначение
-a архивный режим
-v подробный вывод
-z сжатие данных

Пример копирования на другой сервер

rsync -avz /opt/flamy_projects user@backup-server:/backup/docker_projects

Это часто используется для:


Проверка размера проекта

Иногда полезно узнать размер проекта.

du -sh /opt/flamy_projects/*

Пример вывода:

1.2G site1
850M site2
430M api_service

Это помогает определить:


Проверка логов проекта

Некоторые проекты сохраняют логи внутри директории.

Например:

logs/
storage/logs
var/log

Посмотреть последние строки:

tail -n 100 logs/app.log

Типичный рабочий процесс

Обычно работа с проектом выглядит так:

1 Перейти в директорию проекта

cd /opt/flamy_projects/site1

2 Проверить файлы

ls -la

3 Запустить контейнеры

docker compose up -d

4 Проверить контейнеры

docker compose ps

5 Проверить логи

docker compose logs --tail=50

Работа с несколькими проектами

На сервере может быть десятки проектов.

Чтобы понять, какие контейнеры запущены:

docker ps

Можно увидеть:

site1_nginx
site2_php
api_service_db

Это помогает быстро определить, какие проекты работают.


Полезные советы

Храните проекты в одной директории

Это упрощает:


Используйте .env файлы

В .env удобно хранить:


Делайте регулярные backup

Минимум раз в день для production-серверов.


Краткая памятка

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 используются для хранения постоянных данных, например:

Пример:

mysql container
│
└── /var/lib/mysql  → volume

Если контейнер удалить и создать заново, данные в volume сохранятся.


Где Docker хранит volumes

По умолчанию volumes находятся в системе Docker:

/var/lib/docker/volumes/

Каждый volume имеет свою директорию.

Пример структуры:

/var/lib/docker/volumes/mysql_data/_data

Типы хранения данных в Docker

Docker поддерживает несколько способов хранения данных.


1. Docker Volume

Это основной и рекомендуемый способ хранения данных.

Пример в docker-compose.yml:

services:
  mysql:
    image: mysql:8
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:

Преимущества:


2. Bind Mount

Bind mount подключает обычную папку сервера внутрь контейнера.

Пример:

services:
  app:
    volumes:
      - ./src:/var/www/html

Это означает:

сервер ./src  → контейнер /var/www/html

Используется для:


Разница между Volume и Bind Mount

Тип Описание
Volume управляется Docker
Bind mount обычная папка сервера

Обычно используется:


Просмотр volumes

Список volumes

docker volume ls

Пример вывода:

DRIVER    VOLUME NAME
local     site1_mysql_data
local     redis_cache

Информация о volume

docker volume inspect <volume_name>

Пример:

docker volume inspect site1_mysql_data

Результат покажет:


Создание volume

Создать volume можно вручную:

docker volume create mysql_data

После этого volume можно использовать в контейнерах.


Удаление volumes

Удалить один volume

docker volume rm <volume>

Пример:

docker volume rm mysql_data

Удалить неиспользуемые volumes

docker volume prune -f

Команда удаляет volumes, которые не используются контейнерами.

Важно: Перед удалением нужно убедиться, что volume не содержит важных данных.


Использование volumes в Docker Compose

Пример конфигурации:

services:
  mysql:
    image: mysql:8
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:

Это создаёт volume mysql_data, который будет хранить данные базы.


Проверка volumes контейнера

Можно посмотреть volumes конкретного контейнера:

docker inspect <container>

Пример:

docker inspect site1_mysql

В выводе нужно найти блок:

Mounts

Он показывает подключённые volumes.


Резервное копирование volume

Очень важная операция — backup данных.


Backup volume

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

Чтобы восстановить данные:

docker run --rm \
  -v mysql_data:/data \
  -v $(pwd):/backup \
  alpine tar xzf /backup/mysql_backup.tar.gz -C /

После этого данные снова появятся в volume.


Типичные ошибки при работе с volumes

Потеря данных после удаления контейнера

Если данные хранятся внутри контейнера, а не в volume, они будут потеряны.

Правильная практика:

volumes:
  - mysql_data:/var/lib/mysql

Удаление volume вместе с проектом

Команда:

docker compose down -v

удаляет:

Это приведёт к потере данных.


Использование bind mount для базы данных

Не рекомендуется хранить базы данных через bind mount.

Лучше использовать:

volumes:
  - mysql_data:/var/lib/mysql

Проверка volumes проекта

Показать volumes Compose проекта:

docker compose config --volumes

Это помогает понять, какие volumes использует проект.


Краткая памятка

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 — это шаблон контейнера, из которого создаются запущенные контейнеры.

Проще говоря:

Docker Image → контейнер

Пример:

nginx:1.25  → контейнер nginx
mysql:8     → контейнер mysql
node:18     → контейнер node

Image содержит:

Контейнер создаётся на основе образа и запускается как отдельный процесс.


Как работают Docker Images

Docker Images состоят из слоёв (layers).

Пример:

Base OS
↓
System packages
↓
Application dependencies
↓
Application code

Каждый слой кэшируется. Это позволяет Docker ускорять сборку образов.


Просмотр образов

Показать список образов

docker images

Пример вывода:

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.

docker pull <image>

Пример:

docker pull nginx:1.25

После этого образ появится в списке docker images.


Теги образов

Docker использует теги для обозначения версии образа.

Пример:

nginx:latest
nginx:1.25
node:18

Почему не стоит использовать latest

Тег latest может измениться в любой момент.

Лучше использовать фиксированную версию:

nginx:1.25

Это делает окружение более предсказуемым.


Удаление Docker Images

Удалить образ

docker rmi <image>

Пример:

docker rmi nginx:1.25

Удалить образ по ID

docker rmi <image_id>

Пример:

docker rmi a1b2c3d4e5

Удалить неиспользуемые образы

docker image prune -f

Удаляются dangling images — образы, которые больше не используются.


Полная очистка старых образов

Если на сервере накопилось много старых образов:

docker system prune -a

Эта команда удалит:

Важно: Использовать эту команду нужно осторожно, особенно на production.


Сборка образа

Образы можно создавать самостоятельно через Dockerfile.

Пример сборки:

docker build -t my_app .

Где:

Параметр Значение
-t тег образа
my_app имя образа
. текущая директория

Проверка истории образа

Можно посмотреть, из каких слоёв состоит образ:

docker history <image>

Пример:

docker history nginx

Это помогает понять:


Использование образа для запуска контейнера

Контейнер можно запустить напрямую:

docker run nginx

Но чаще используется Docker Compose.

Пример:

services:
  nginx:
    image: nginx:1.25

Поиск образов

Можно искать образы на Docker Hub:

docker search nginx

Пример результата:

NAME              DESCRIPTION
nginx             Official build of Nginx
nginx-unit        Nginx Unit runtime

Лучше использовать официальные образы.


Типичные проблемы с образами

Слишком много образов на сервере

Проверить:

docker images

Удалить старые:

docker image prune -f

Образ не обновляется

Если используется:

nginx:latest

Docker может использовать старую версию.

Решение:

docker pull nginx

Слишком большой размер образа

Некоторые образы могут занимать несколько гигабайт.

Проверить:

docker images

При необходимости удалить неиспользуемые.


Краткая памятка

docker images                     # список образов
docker pull <image>               # скачать образ
docker search <image>             # поиск образа

docker rmi <image>                # удалить образ
docker image prune -f             # удалить неиспользуемые образы

docker build -t <name> .          # собрать образ
docker history <image>            # история слоев образа