Как использовать команду docker login для аутентификации в реестрах

DockerBeginner
Практиковаться сейчас

Введение

В этом практическом занятии (лабораторной работе) вы научитесь аутентифицироваться в реестрах Docker с помощью команды docker login. Мы рассмотрим аутентификацию в Docker Hub с использованием стандартного веб-логина, аутентификацию в собственном (самостоятельно развернутом) реестре с использованием имени пользователя и пароля, а также передачу пароля через STDIN для сценариев без интерактивного взаимодействия. Этот практический опыт предоставит вам необходимые навыки для безопасного доступа к и управления образами в различных средах реестров Docker.

Аутентификация в Docker Hub с использованием веб-метода входа

На этом этапе вы научитесь аутентифицироваться в Docker Hub с помощью веб-логина. Это самый распространенный способ входа в Docker Hub и подходит для интерактивных сессий.

Docker Hub - это облачная служба реестра, предоставляемая Docker, которая позволяет хранить и делиться вашими Docker-образами. Чтобы отправлять или получать приватные образы, вам нужно пройти аутентификацию в Docker Hub.

Команда docker login используется для аутентификации в реестре Docker. По умолчанию она выполняет аутентификацию в Docker Hub.

Откройте терминал в среде LabEx. Вы находитесь в директории ~/project.

Чтобы войти в Docker Hub, выполните следующую команду:

docker login

При выполнении этой команды вас попросят ввести имя пользователя и пароль от Docker Hub.

Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com/ to create one.
Username: your_docker_username
Password: your_docker_password

Введите имя пользователя и пароль от Docker Hub по запросу. Если аутентификация прошла успешно, вы увидите сообщение, похожее на следующее:

WARNING! Your password will be stored unencrypted in /home/labex/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-helpers

Login Succeeded

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

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

Давайте попробуем получить публичный образ, чтобы убедиться, что команды Docker работают после входа. Мы получим образ hello-world, который является небольшим образом, используемым для тестирования.

docker pull hello-world

Вы должны увидеть вывод, указывающий, что образ скачивается и извлекается:

Using default tag: latest
latest: Pulling from library/hello-world
...
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest

Это подтверждает, что вы можете взаимодействовать с Docker Hub после аутентификации.

Аутентификация в собственноручно развернутом реестре с использованием имени пользователя и пароля

На этом этапе вы научитесь аутентифицироваться в собственном (самостоятельно развернутом) реестре Docker с использованием имени пользователя и пароля. Хотя Docker Hub является реестром по умолчанию, вам может понадобиться взаимодействовать с приватными реестрами, размещенными в вашей организации или на облачном провайдере.

Самостоятельно развернутый реестр - это Docker-реестр, который вы настраиваете и управляете самостоятельно, вместо использования публичной службы, такой как Docker Hub. Это часто делается по соображениям безопасности, соответствия стандартам или производительности.

Для аутентификации в собственном реестре вы используете ту же команду docker login, но вам нужно указать адрес реестра. Формат команды: docker login <registry_address>.

В рамках этой практической работы мы будем симулировать собственноручно развернутый реестр. Мы будем использовать заглушку myregistry.local. В реальной ситуации это был бы фактическое доменное имя или IP-адрес вашего реестра.

Откройте терминал в директории ~/project.

Чтобы войти в наш симулированный собственный реестр, выполните следующую команду, заменив your_registry_username и your_registry_password гипотетическими учетными данными, которые вы бы использовали для этого реестра:

docker login myregistry.local

Вас попросят ввести имя пользователя и пароль для реестра myregistry.local:

Login with your Docker ID to push and pull images from myregistry.local. If you don't have a Docker ID, head over to https://hub.docker.com/ to create one.
Username: your_registry_username
Password: your_registry_password

Введите гипотетическое имя пользователя и пароль. Поскольку myregistry.local не является реальным работающим реестром в этой среде, вход, скорее всего, завершится с ошибкой, указывающей, что реестр недоступен или аутентификация не удалась. Это ожидаемо для данной симуляции. Основное здесь - понять синтаксис команды и процесс указания другого реестра.

Error response from daemon: Get "http://myregistry.local/v2/": dial tcp: lookup myregistry.local on 127.0.0.53:53: no such host

Даже несмотря на то, что вход не удался из-за того, что реестр не существует, синтаксис команды docker login <registry_address> является правильным для попытки аутентификации в собственном реестре.

В реальной ситуации с работающим собственным реестром успешный вход приведет к появлению сообщения "Login Succeeded", и ваши учетные данные для этого конкретного реестра будут сохранены в файле конфигурации Docker (~/.docker/config.json).

Давайте посмотрим на файл конфигурации Docker, чтобы увидеть, как хранится информация о реестре.

cat ~/.docker/config.json

Вы увидите структуру JSON. После успешного входа в Docker Hub на предыдущем этапе вы должны увидеть запись для https://index.docker.io/v1/. Если бы вы успешно вошли в myregistry.local, вы бы увидели дополнительную запись для этого адреса реестра.

{
  "auths": {
    "https://index.docker.io/v1/": {
      "auth": "..."
    }
  },
  "HttpHeaders": {
    "User-Agent": "Docker-Client/..."
  },
  "credsStore": "desktop"
}

Секция auths содержит информацию об аутентификации для различных реестров, в которые вы вошли. Каждый ключ в auths - это адрес реестра, а значение содержит детали аутентификации.

На этом этапе показано, как указать адрес собственного реестра при использовании команды docker login.

Предоставление пароля через STDIN для неинтерактивного входа

На этом этапе вы научитесь передавать пароль для Docker-реестра с использованием стандартного ввода (STDIN). Этот метод особенно полезен в неинтерактивных сценариях, таких как скриптинг или автоматизированные развертывания, когда вы не можете вручную вводить пароль по запросу.

При использовании команды docker login в интерактивном терминале вас попросят ввести пароль. Однако в скриптах вам нужно иметь возможность передать пароль без ручного вмешательства. Флаг --password-stdin позволяет прочитать пароль из STDIN.

Важное замечание по безопасности: Передача паролей непосредственно в командной строке обычно небезопасна, так как команда и ее аргументы могут быть видны в списке процессов (ps) или истории команд в оболочке. Чтение пароля из STDIN - более безопасный подход для скриптинга, так как это позволяет избежать раскрытия пароля в этих местах.

Откройте терминал в директории ~/project.

Для демонстрации этого мы будем симулировать вход в Docker Hub с использованием STDIN. Вам понадобятся ваше имя пользователя и пароль от Docker Hub.

Структура команды заключается в том, чтобы вывести пароль с помощью echo и передать его по конвейеру (pipe) в команду docker login --username <your_docker_username> --password-stdin.

Замените your_docker_username на ваше фактическое имя пользователя в Docker Hub и your_docker_password на ваш фактический пароль от Docker Hub.

echo "your_docker_password" | docker login --username your_docker_username --password-stdin

После выполнения этой команды вы должны увидеть вывод, похожий на следующий, который указывает на успешный вход:

WARNING! Your password will be stored unencrypted in /home/labex/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-helpers

Login Succeeded

Снова напомним, что предупреждение о незашифрованном пароле ожидаемо в этой лабораторной среде.

Этот метод является важным для автоматизации операций с Docker, которые требуют аутентификации. Например, в CI/CD-пайплайне вы можете хранить свои учетные данные для Docker Hub в виде переменных окружения и использовать этот метод для входа в систему перед сборкой и отправкой образов.

Вы также можете использовать этот метод для входа в собственноручно развернутый реестр, добавив адрес реестра в конце команды:

echo "your_registry_password" | docker login myregistry.local --username your_registry_username --password-stdin

Как и на предыдущем этапе, эта команда, скорее всего, завершится с ошибкой в этой лабораторной работе, так как myregistry.local не является работающим реестром. Однако синтаксис передачи пароля через STDIN для конкретного реестра является правильным.

На этом этапе показано, как выполнить неинтерактивный вход в Docker-реестр, передав пароль по конвейеру в команду docker login с использованием флага --password-stdin.

Резюме

В рамках этой лабораторной работы вы научились аутентифицироваться в Docker-реестрах с использованием команды docker login. Сначала вы практиковали аутентификацию в Docker Hub с использованием стандартного интерактивного веб-метода входа, вводя имя пользователя и пароль по запросу. Это показало базовый процесс входа в стандартный Docker-реестр.

Затем вы изучили аутентификацию в собственноручно развернутом реестре, указав URL-адрес реестра, а также имя пользователя и пароль. Наконец, вы узнали, как передавать пароль с использованием стандартного ввода (STDIN), что является более безопасным методом для неинтерактивных сценариев и скриптинга, так как предотвращает раскрытие пароля в истории команд или журналах. Эти этапы охватили различные методы обеспечения безопасности доступа к Docker-реестрам для отправки и получения образов.