Docker secrets – это сущности Docker, которые предназначены для хранения конфиденциальной информации, такой как имя пользователя, пароль, SSL-сертификаты и любые защищенные файлы.
Docker Secret был создан и широко использовался в Docker Swarm, а затем был распространен на docker compose начиная с версии 3.
Если вы беспокоились о защите своих конфиденциальных данных, Docker Secret будет одним из решений!
Только представьте, мы никогда не захотим хранить конфигурационный файл со всеми нашими паролями на GitHub/любом репозитории,публичном или даже частном.
В этом руководстве мы рассмотрим различные аспекты настройки и использования секретов Docker.
Прежде чем мы перейдем к практике, вот некоторое введение, как это используется в сервисах docker swarm.
Сначала мы создаем и добавляем секрет в swarm, а затем предоставляем нашим сервисам доступ к необходимым им секретам.
Когда создается сервис (или обновляется), секрет устанавливается в контейнер в каталог /run/secrets.
Теперь ваше приложение имеет доступ к необходимым ему секретам.
Создание секрета
Просто предположим, что ваш swarm уже запущен или для проверки, пожалуйста, выполните команду “docker swarm init”, которая инициирует ваш docker sworm ноде.
Теперь вы можете использовать команду docker secret create, чтобы добавить новый секрет в swarm
Вот базовый пример:
echo "mypassword" | docker secret create mypass -
Теперь давайте воспользуемся командой “docker secret ls”, чтобы подтвердить, что наш секрет был добавлен:
docker secret ls
должно получиться что-то вроде этого:
ID NAME CREATED UPDATED rkxav7s9rvnc9d7ct6dhkrsyn mypass 3 minutes ago 3 minutes ago
Давайте посмотрим, что еще можно сделать c Docker secret, прежде чем мы перейдем к добавлению secret в сервис.
Просмотр секрета Docker
Вы можете использовать команду inspect и для Docker secret:
docker secret inspect secret_name
в нашем случае это будет “mypass”.
Удаление секрета Docker
Вы можете удалить секрет с помощью следующей команды
docker secret rm secret_name
Добавление секрета в службу
Теперь, когда вы добавили секрет в swarm, необходимо предоставить службе доступ к нему.
Это можно сделать при создании или обновлении службы.
Вот пример того, как добавить секрет при создании службы:
docker service create --secret mypass --name secret alpine ping itsecforu.ru
В этом примере я добавляю секрет mypass, который мы создали в предыдущем шаге, в службу, запускающую образ alpine.
🐧 Как обновить Alpine Linux до последней версии
Если служба уже запущена, и мы хотим добавить (или изменить) секрет, можно воспользоваться опцией -secret-add.
docker service update --secret-add mypass existing_service_name
Как это работает в реальном времени
Существует несколько различных способов использования этого в реальном времени, и, исходя из потребностей вашего приложения, вы можете выбрать способ, который лучше всего подходит для вас.
Секрет для каждого пароля
В приведенном выше примере я показал, как можно хранить один пароль в секрете.
Это может быть уместно, если вы не управляете большим количеством секретов.
В этом случае вы вручную создаете каждый секрет и добавляете их в соответствующую службу при создании или обновлении.
При использовании этого метода следует учитывать некоторые моменты.
Если у вас много секретов, есть возможность ошибки при ручном управлении, и это может занять много времени.
Секрет для каждой службы
Другим возможным методом может быть хранение всех секретов, необходимых каждой службе, в одном файле – возможно, в json-файле под названием “service.json”.
Теперь вы добавляете один секретный файл для каждой службы, а все пароли хранятся в файле, который может быть быстро прочитан вашим приложением.
Это обеспечивает гораздо более чистый и быстрый способ настройки секретов, а также упрощает работу на уровне приложения.
Но очевидным недостатком является то, что службы часто используют общие секреты, поэтому некоторые конфиденциальные данные могут быть продублированы.
Как Docker Secret может использоваться в Docker Compose:
вы можете использовать секреты, если вы используете файл compose. (Вам не нужно запускать Swarm).
🐳 Управление Docker контейнерами с помощью Docker Compose
Я перешел на docker-compose, потому что хотел использовать секреты.
Каждый сервис сопоставляется с контейнером.
Примечание: секреты не загружаются в окружение контейнера, они монтируются в /run/secrets/.
Вот пример:
Структура файла:
| |--- docker-compose.yml |--- mysecret.txt
docker-compose.yml содержит:
version: “3.6” services: my_service: image: ubuntu:18.04 entrypoint: “cat /run/secrets/mysecret” secrets: – mysecret secrets: mysecret: file: ./mysecret.txt
mysecret.txt содержит:
this is my secret text
Выполните эту команду от имени root, чтобы убедиться, что контейнер имеет доступ к вашему секрету (Docker должен быть запущен и установлен docker-compose):
docker-compose up --build myservice
Вы должны увидеть, что ваш контейнер выводит ваш секрет в следующем виде,
Creating network "secret_default" with the default driver Pulling myservice (centos:7)... 7: Pulling from library/centos 524b0c1e57f8: Pull complete Digest: sha256:e9ce0b76f29f942502facd849f3e468232492b259b9d9f076f71b392293f1582 Status: Downloaded newer image for centos:7 Creating secret_myservice_1 ... done Attaching to secret_myservice_1 myservice_1 | this is my secret text secret_myservice_1 exited with code 0
см. также:
- 🐳 Как определить DNS в контейнерах Docker
- 🐳 Как отредактировать конфигурационный файл внутри Docker контейнера?
- 🐳 Где хранятся образы, контейнеры и тома Docker в хост-системе Linux?
- 🐳 3 довольно неизвестных команды Docker, которые помогут вам в самых различных ситуациях
- 🐳 Как подключиться к контейнеру Docker по ssh
- 🐳 Контейнер Docker: резервное копирование и восстановление