Как справиться с сохранением и хранением Docker-контейнеров — CloudSavvy IT

Логотип докера.

Docker — это служба контейнеризации, предназначенная для запуска приложений в своей среде в любой системе. Предполагается, что он не зависит от платформы, но если вам нужно хранить данные на диске, это можно сделать с помощью монтирования тома и привязки.

Использовать внешнюю базу данных или хранилище объектов

Это метод, который порекомендует большинство людей. Сохранение состояния в виде файла на диске не соответствует модели Docker, и, хотя это можно сделать, всегда лучше учитывать — действительно ли это необходимо?

Например, предположим, что вы запускаете веб-приложение в Docker, которое должно хранить данные в базе данных. Не имеет смысла запускать MySQL в контейнере Docker, поэтому вы должны вместо этого развернуть MySQL на RDS или EC2, и пусть контейнер Docker подключается к нему напрямую. Контейнер Docker полностью лишен состояния, как и предполагалось; его можно остановить, запустить или ударить кувалдой, и вместо него можно развернуть новый, и все это без потери данных. Используя разрешения IAM, это может быть выполнено безопасно, полностью в вашем VPC.

Если вам действительно нужно хранить файлы, такие как загруженные пользователем фотографии и видео, вам действительно следует использовать AWS Простая служба хранения (S3), Это намного дешевле, чем хранилище на основе EBS, и далеко дешевле по сравнению с хранилищем EFS, которое является вашим основным выбором для общей файловой системы для контейнеров ECS. Вместо того, чтобы хранить файл на диске, вы загружаете непосредственно на S3. Этот метод также позволяет запускать дополнительную обработку с использованием лямбда-функций для загружаемого контента, например сжатие изображений или видео, что может значительно сэкономить на затратах на пропускную способность.

Программы для Windows, мобильные приложения, игры - ВСЁ БЕСПЛАТНО, в нашем закрытом телеграмм канале - Подписывайтесь:)

Простое решение: подключите диск к контейнеру

У Docker есть два способа достижения постоянства: монтирование томов и монтирование. Привязка позволяет вам монтировать определенное место в файловой системе вашего сервера в расположение внутри контейнера Docker. Эта ссылка может быть доступна только для чтения, но также для чтения и записи, где файлы, записанные контейнером Docker, будут сохраняться на диске.

Вы можете привязать отдельные каталоги хоста к целевым каталогам в контейнере Docker, что полезно, но рекомендуемый метод — создать новый «том», управляемый Docker. Это упрощает резервное копирование, передачу и совместное использование томов между различными экземплярами контейнеров.

Слово предостережения: Если у вас нет прямого доступа к серверу, на котором вы запускаете Docker, как в случае с управляемыми развертываниями, такими как AWS Elastic Container Service (ECS) и Kubernetes, вы должны быть осторожны с этим. Он привязан к собственному дисковому пространству сервера, которое обычно эфемерно. Вы захотите использовать внешнее хранилище файлов, такое как EFS, для достижения реального постоянства с ECS (подробнее об этом позже).

Тем не менее, связывание и монтирование тома работают хорошо, если вы просто используете Docker для простой установки приложения на вашем сервере или просто хотите быстрого сохранения в целях тестирования. В любом случае, метод создания томов будет одинаковым независимо от того, где вы храните их.

Вы можете создать новый том из командной строки с помощью:

docker volume create nginx-config

А затем, когда вы запустите свой контейнер Docker, свяжите его с целью в контейнере с помощью --mount флаг:

docker run -d 
--name devtest 
--mount source=nginx-config,target=/etc/nginx 
nginx:latest

Если вы бежите docker inspect вы увидите объем, указанный под Mounts раздел.

Если вы используете Docker Compose, настройка также проста. Просто добавьте volumes введите для каждой имеющейся у вас службы контейнеров, затем сопоставьте имя тома с местоположением в гостевой системе. Вам также необходимо предоставить список томов на верхнем уровне. volumes Ключ для Составить для предоставления.

version: "3.0"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - nginx-config:/etc/nginx/
volumes:
  nginx-config:

Это создаст том автоматически для этого Compose. Если вы хотите использовать готовый том извне Compose, укажите external: true в конфигурации громкости:

volumes:
  cms-content:
    external: true

Если вы хотите вместо этого просто выполнить привязку и не беспокоиться о томах, просто введите имя пути вместо имени тома и откажитесь от определения имен томов.

version: "3.0"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - /docker/nginx-config/:/etc/nginx/

Ты можешь читать Полная документация Docker по использованию томов с Compose если ваш вариант использования требует чего-то более конкретного, чем это.

Для управляемых развертываний используйте общую файловую систему (AWS EFS)

Если вы развертываете в AWS ECS, вы не сможете использовать обычное связывание или монтирование тома, потому что, как только вы закроете контейнер, вы, вероятно, не будете работать на той же машине при следующем запуске. , победив цель настойчивости.

Тем не менее, вы все еще можете добиться устойчивости, используя другой сервис AWS — Elastic File System (EFS). EFS является общей сетевой файловой системой. Вы можете подключить его к нескольким серверам EC2, и к ним будут синхронизироваться все данные. Например, вы могли бы использовать это для размещения статического контента и кода для вашего веб-сайта, а затем запустить все ваши рабочие узлы в ECS для обработки фактической подачи вашего контента. Это позволяет обойти ограничение не хранить данные на диске, поскольку монтирование тома привязано к внешнему диску, который сохраняется во всех развертываниях ECS.

Чтобы настроить это, вам нужно создать файловую систему EFS. Это довольно просто и может быть сделано из Консоль управления EFS, но вы захотите записать идентификатор тома, так как он понадобится вам для работы с томом.

Если вам нужно вручную добавить или изменить файлы в томе EFS, вы можете подключить его к любому экземпляру EC2. Вам нужно установить amazon-efs-utils:

sudo yum install -y amazon-efs-utils

А затем подключите его с помощью следующей команды, используя идентификатор:

sudo mount -t efs fs-12345678:/ /mnt/efs

Таким образом, вы можете напрямую просматривать и редактировать содержимое тома EFS, как если бы это был другой жесткий диск на вашем сервере. Вы хотите убедиться, что у вас есть NFS-Utils установлено для этого все для правильной работы.

Далее вам нужно подключить ECS к этому объему. Создайте новое определение задачи в Консоль управления ECS, Прокрутите вниз и выберите «Настроить через JSON». Затем замените пустой ключ «volume» следующим JSON, добавив в конце ключ «family»:

"volumes": [
        {
            "name": "efs-demo",
            "host": null,
            "dockerVolumeConfiguration": {
                "autoprovision": true,
                "labels": null,
                "scope": "shared",
                "driver": "local",
                "driverOpts": {
                    "type": "nfs",
                    "device": ":/",
                    "o": "addr=fs-XXXXXX.efs.us-east-1.amazonaws.com,nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport"
                }
            }
        }
    ],
"family":"nginx",

замещать fs-XXXXXX.efs.us-east-1.amazonaws.com с реальным адресом тома EFS. Вы должны увидеть новый том:

ес новый том

Вы можете использовать это в своем определении контейнера как точку монтирования. Выберите «Добавить контейнер» (или отредактируйте существующий) и в разделе «Хранение и ведение журнала» выберите вновь созданный том и укажите путь к контейнеру.

добавить точку монтирования

Сохраните определение задачи, и при запуске кластера с этим новым определением все контейнеры смогут получить доступ к вашей общей файловой системе.

Программы для Windows, мобильные приложения, игры - ВСЁ БЕСПЛАТНО, в нашем закрытом телеграмм канале - Подписывайтесь:)

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован.