Перейти к основному содержимому

Введение в секреты Docker

· 5 мин. чтения

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