1. Введение
Одна из многих философий 12-факторных приложений заключается в том, что конфигурация должна храниться в среде. На практике это означает хранение конфигурации отдельно от нашего кода .
В этом руководстве мы рассмотрим, как секреты Docker могут помочь нам в достижении этой цели. Мы рассмотрим, как мы можем создавать секреты Docker и управлять ими. Затем мы рассмотрим, как мы можем использовать секреты Docker в рамках развертывания наших приложений.
2. Что такое секреты?
В общем, секреты обеспечивают механизм для безопасного хранения данных, которые могут быть прочитаны приложениями во время выполнения . Секреты играют важную роль в хранении конфиденциальных данных отдельно от кода приложения. Сюда входят такие данные, как пароли, имена хостов, ключи SSH и многое другое.
Например, предположим, что нашему приложению требуется подключение к базе данных. Для этого ему нужно имя хоста, имя пользователя и пароль. Кроме того, существует другой сервер базы данных для разработки, тестирования и производства.
С помощью секретов каждая среда может предоставлять приложениям информацию о собственной базе данных. Коду приложения не нужно знать, в какой среде оно работает. Ему просто нужен согласованный способ поиска значений.
Хотя секреты Docker — относительно новая функция, большинство облачных платформ уже много лет предоставляют те или иные формы секретов .
Например, и Amazon Web Services, и Google Cloud имеют инструмент Secrets Manager, а Azure предоставляет службу Key Vault. Kubernetes также обеспечивает первоклассную поддержку секретов.
Реализация секретов Docker использует многие из тех же функций, что и ранее упомянутые системы:
- Секреты создаются и управляются отдельно от приложений
- Следует принципам наименее привилегированного и необходимого доступа
- Гибкость для хранения различных типов данных
Имея базовое представление о секретах Docker, давайте посмотрим, как ими управлять.
3. Управление секретами Docker
В этом разделе мы рассмотрим, как управлять секретами Docker от создания до удаления.
3.1. Требования к докеру
В настоящее время секреты Docker доступны только swarm-сервисам . Это означает, что автономные контейнеры не могут получить доступ к секретам.
Следовательно, чтобы использовать эти секреты, мы должны настроить наш кластер для swarm с помощью команды:
docker swarm init --advertise-addr <MANAGER-IP>
Где <MANAGER-IP> — это IP-адрес, назначенный Docker узлу менеджера.
В Docker Desktop для Windows и Mac мы можем упростить команду:
docker swarm init
Теперь, когда наш кластер настроен для swarm, мы можем создавать секреты.
3.2. Создание секретов Docker
Секреты Docker могут хранить данные практически любого типа, которые могут быть представлены в виде строки или в двоичном виде:
- Имена пользователей и пароли
- Имена хостов и порты
- SSH-ключи
- TLS-сертификаты
Единственным реальным ограничением является размер данных не более 500 КБ .
При создании секрета команда принимает ввод из командной строки:
docker secret create my_secret -
В таком виде команда позволяет нам вводить значение секрета и даже поддерживает многострочные данные. Чтобы закончить ввод данных, мы должны дать ему сигнал EOF (Ctrl+D в системах на базе Unix).
Однако ручной ввод с клавиатуры чреват ошибками и нецелесообразен в сочетании с автоматическими потоками. Следовательно, мы также можем использовать содержимое файла для создания секрета :
docker secret create my_secret /path/to/secret/file
3.3. Отображение секретов Docker
Как только мы создали секрет, мы можем подтвердить, что он был успешным:
docker secret ls
ID NAME DRIVER CREATED UPDATED
2g9z0nabsi6v7hsfra32unb1o my_secret 30 minutes ago 30 minutes ago
Это показывает все наши секреты, а также уникальные идентификаторы, которые были назначены им. Мы также можем проверять отдельные секреты:
docker secret inspect my_secret
[
{
"ID": "2g9z0nabsi6v7hsfra32unb1o",
"Version": {
"Index": 15
},
"CreatedAt": "2022-05-13T00:34:41.2802246Z",
"UpdatedAt": "2022-05-13T00:34:41.2802246Z",
"Spec": {
"Name": "my_secret",
"Labels": {}
}
}
]
3.4. Удаление секретов Docker
Считается лучшей практикой удалить секрет, когда он больше не нужен. Например, мы можем навсегда удалить секрет из командной строки:
docker secret rm my_secret
Обратите внимание, что эта команда не работает, если секрет используется какой-либо службой .
4. Использование секретов Docker
Теперь, когда мы понимаем, как управлять секретами, мы можем посмотреть, как их использовать в наших приложениях. Как и в большинстве случаев в экосистеме Docker, это можно сделать несколькими способами.
4.1. Докер Сервис
Поскольку секреты Docker требуют, чтобы наш кластер был в режиме роя, мы не можем получить доступ к секретам из обычной команды запуска
Docker . Вместо этого нам нужно создать службы, и мы можем указать один или несколько секретов с помощью командной строки:
docker service create --name my_app --secret my_secret openjdk:19-jdk-alpine
4.2. Докер Сочинять
В Docker Compose версии 3 и выше у нас есть два варианта использования секретов. Ниже приведен простой пример определения службы и секретов:
version: '3.1'
services:
my_app:
image: my_app:latest
secrets:
- my_external_secret
- my_file_secret
secrets:
my_external_secret:
external: true
my_file_secret:
file: /path/to/secret/file.txt
В этом примере мы определяем два секрета. Первый является внешним, то есть он относится к секрету, созданному с помощью секретной
команды Docker. Второй относится к файлу и не требует первоначальной настройки с помощью Docker.
Имейте в виду, что использование файлового подхода обходит большинство преимуществ использования секретов Docker . Кроме того, файл должен быть доступен для всех хостов, на которых может работать служба, и мы должны позаботиться о защите его содержимого с помощью механизмов, отличных от Docker.
4.3. Доступ к секретам
Docker делает секреты доступными для наших приложений в виде файлов . Поведение по умолчанию состоит в том, чтобы сделать каждый секрет отдельным файлом в каталоге /run/secrets
. В нашем предыдущем примере содержимое my_secret
будет доступно в файле /run/secrets/my_secret
.
Мы можем изменить расположение файла, указав его с помощью нашего сервиса:
docker service create
--name my_app
--secret source=my_secret,target=/different/path/to/secret/file,mode=0400
Это полезно, если секрет содержит информацию, которую наше приложение ожидает в определенном месте. Например, мы можем использовать секрет для хранения файла конфигурации Nginx, а затем сделать его доступным в стандартном расположении ( /etc/nginx/conf.d/site.conf
).
5. Вывод
Секреты — важный инструмент для любой архитектуры на основе контейнеров, поскольку они помогают нам достичь цели разделения кода и конфигурации. Кроме того, секреты Docker позволяют безопасно хранить конфиденциальные данные и делать их доступными для приложений, которым они нужны.