Изменение учетных данных в Docker Swarm Services
Этот пост даст вам обзор того, как Docker выполняет аутентификацию в реестрах образов,
и как изменения учетных данных изменяют рабочий процесс, когда задействовано несколько узлов.
В первой части этого поста дается обзор того, что такое докер, где хранятся образы докеров и что docker login
делает.
Если вы уже знакомы с основами работы Docker и Docker Swarm, можете сразу пропустить их.
здесь.
Основы докера
Docker имеет клиент-серверную архитектуру и большую часть docker
команды взаимодействуют с демоном докера через некоторый REST-ish API.
Бег docker -H tcp://1.2.4.5:2375 run --rm nginx
свяжется с демоном докеров на 1.2.4.5
хозяин и
даст указание загрузить и запустить nginx
изображение.
Рой докеров
Docker Swarm — это оркестратор контейнеров, который позволяет запускать контейнеры Docker на нескольких узлах.
Это позволяет вам также абстрагироваться от узлов, на которых работает Swarm, вы сами решаете желаемое состояние
а Docker Swarm будет распределять нагрузку по узлам, образующим кластер.
Реестр образов Docker
Образы Docker хранятся в «реестре», и образы могут быть загружены и загружены из/в него с помощью демона docker.
Большинство реестров требуют аутентификации.
Вход в докер
Чтобы аутентифицировать клиент Docker в реестре образов Docker, вы можете запустить:
docker login
Эта команда попытается аутентифицировать нас в hub.docker.com (коммерческий реестр докеров),
спрашивая у нас логин и пароль.
вы также можете войти в другие реестры (предлагаемые другими компаниями или размещающие наши собственные реестры)
указав имя хоста реестра в качестве третьего параметра.
Как пример docker login registry.gitlab.com
попытается аутентифицировать нас в реестре Gitlab.
По умолчанию учетные данные сохраняются в $HOME/.docker/config.json
на компьютере под управлением docker login
команда
(это также Другой хранилища).
Чтобы заметить, что docker login
является «клиентской» командой и не взаимодействует с демоном docker.
Загрузка личных изображений
Что происходит, когда вы создаете/обновляете службу Docker Swarm с помощью --with-registry-auth
вариант
(или развернуть стек Docker с той же опцией)?
Докер-клиент будет:
- Соберите список образов докеров для загрузки
- Прочитайте информацию об аутентификации из хранилище учетных данных для загрузки изображений (например, чтение
$HOME/.docker/config.json
с компьютера, на котором установлен клиент) - Создайте (или обновите) сервис в Swarm ПЛОТ государство.
Информация о состоянии включите также информацию аутентификации о том, как загрузить изображение.
Таким образом, когда контейнер будет запланирован на каком-то узле,
демон докера прочитает состояние RAFT и перешлет сохраненные учетные данные на этот узел, что позволит ему автономно загрузить образ докера.
Изменение учетных данных
Если вы обновите свои учетные данные (например, измените свой пароль),
учетные данные, хранящиеся в состоянии Swarm RAFT, больше не верны, и новые узлы не смогут загружать изображения.
В качестве решения вы должны повторно аутентифицироваться в реестре образов, используя docker login
команда
и обновите учетные данные, хранящиеся в состоянии Swarm RAFT, выполнив:
docker login
docker service update SERVICE_NAME --with-registry-auth
Эта команда оставит службу как есть, она просто обновит учетные данные.
Ту же стратегию можно использовать для стека Docker.
но это более рискованно, так как может вызвать нежелательные обновления контейнера, поскольку в некоторых случаях Docker может попытаться загрузить более новый
образ (если вы обновляете тег образа докера) или повторно запускаете службы, настроенные как restart: never
.
Другие вещи, которые следует учитывать
Какие службы мне следует обновить?
Если у вас много сервисов (возможно, с использованием разных реестров), может быть сложно отслеживать, какие учетные данные
следует обновить.
Услуги могут быть помечены (используя --label
или же --label-add
параметры), а позже вы сможете обновить только сервисы, имеющие определенную метку.
docker login -u "me" -p "xxxxxx" registry.gitlab.com
for i in $(docker service ls --filter=label=gitlab-registry); do docker service update "$i" --with-registry-auth -d; done
Этот сценарий обновит учетные данные для всех служб, имеющих gitlab-registry
этикетка.
Примечание. Небезопасно указывать пароль в качестве аргумента командной строки.
найти здесь некоторые альтернативы.
Учетные данные с истекающим сроком действия
Некоторые реестры Docker (AWS или Azure) имеют учетные данные, срок действия которых автоматически истекает через указанное время.
Также в этом случае учетные данные, хранящиеся в состоянии Swarm RAFT, больше не будут правильными, и новые узлы
не сможет загрузить изображения.
В качестве решения можно настроить cronjob для периодического выполнения обновления.
Есть ловушка!
Если у тебя есть ДокерХаб учетная запись (коммерческий реестр докеров), и вы вошли в нее, используя
в docker login
команда, и вы создали/обновили сервис или стек, используя команду --with-registry-auth
вариант,
эти учетные данные БУДУТ использоваться для получения общедоступных изображений (в противном случае это могло быть загружено анонимно).
Это означает, что если вы измените учетные данные на DockerHub, ваши узлы не смогут загружать общедоступные образы.
Чтобы смягчить эту проблему, не используйте --with-registry-auth
вариант
при создании или обновлении сервиса, использующего общедоступные образы.
К сожалению, если вы развертываете стек Docker, содержащий смешанные сервисы (с частными и общедоступными образами),
в --with-registry-auth
является глобальным и не может быть указан для отдельной службы.
В качестве альтернативы вы можете использовать ту же стратегию маркировки, описанную ранее, и также обновить учетные данные для общедоступных служб.
Этот пост был опубликован первым на https://www.goetas.com/blog/change-credentials-on-docker-swarm-services/.