「Docker Registry」- 登录镜像仓库

问题描述

如果想要拉取私有镜像,需要先登录到镜像仓库,这是件相当简单的事情。

但是(凡事走有但是),却会遇到各种问题。比如 Cannot autolaunch D-Bus without X11 $DISPLAY 错误。

该笔记将记录:登录 Docker 镜像仓库的方法,以及常见问题处理。

解决方法

登录镜像仓库的方法很简单:

docker login # 登录 DockerHub 仓库

# 登录私有镜像仓库
docker login http://registry.example.com

# 命令行的登录方式
echo "<password>" | docker login --username "<username>" --password-stdin registry.example.com

凭证存储方式

在 Docker 中,有很多凭证(在该案例中,指 docker login 凭证)存储的方式。这包括我们已知的:以 base64 编码保存在 ~/.docker/config.json 文件的 auths 字段中。除此之外,还有很多其他存储方式(比如 pass、osxkeychain 等等)。

凭证存储的默认行为

Docker == 调用 ==> Credentials Helper == 调用 ==> External Credentials Store

Credentials Helper:在系统 $PATH 中搜索到的二进制程序。每种操作系统都有与之对应的二进制程序(docker-credential-helpers/Release),比如 macOS 的 docker-credential-osxkeychain 程序,Windows 的 docker-credential-wincred 程序。

External Credentials Store:后端的凭证存储服务。比如 macOS 的 Apple macOS keychain 服务、Windows 的 Microsoft Windows Credential Manager 服务。Linux 比较特殊,后面将详细说明。

我们以 macOS 为例,在存储凭证时,Docker 调用 docker-credential-osxkeychain(可在 $PATH 中搜索到的二进制程序),然后 docker-credential-osxkeychain 将调用系统的 Apple macOS keychain 来存储凭证。

我们以 Windows 为例,在存储凭证时,Docker 调用 docker-credential-wincred(可在 $PATH 中搜索到的二进制程序),然后 docker-credential-wincred 将调用系统的 Microsoft Windows Credential Manager 来存储凭证。

我们以 Linux 为例,在存储凭证时,Docker 调用 docker-credential-pass(可在 $PATH 中搜索到的二进制程序),然后 docker-credential-pass 将调用系统的 pass 命令来存储凭证。如果 pass 命令不存在,Docker 将使用 docker-credential-secretservice 来调用系统的 D-Bus Secret Service 服务来存储凭证。

当然,还可实现自己的 Credentials Helper 程序,这里就不再说明(因为我们基本用不到),参考 Credentials store/CREDENTIAL HELPER PROTOCOL 文档。

常见问题处理(凭证存储相关)

对于在 Linux 下的,Cannot autolaunch D-Bus without X11 $DISPLAY 问题,有以下几种解决方法:
1)卸载所有的 Credentials Helper 程序,迫使 Docker 使用配置文件存储凭证(Basic Auth);
2)安装对应的 Credentials Helper 程序,比如 Linux 下,安装 pass 命令:apt-get install pass
3)或者,因为 ~/.docker/config.json 使用错误的存储方式,修改 credsStore 配置;

Cannot autolaunch D-Bus without X11 $DISPLAY

docker login fails while docker-compose is installed on Ubuntu 18.04
docker login fails on a server with no X11 installed – Stack Overflow

问题描述

执行 docker 命令时,产生如下错误:

Cannot autolaunch D-Bus without X11 $DISPLAY

原因分析

在 Docker 中,有很多凭证(在该案例中,指 docker login 凭证)存储的方式。这包括我们已知的:以 base64 编码保存在 ~/.docker/config.json 文件的 auths 字段中。除此之外,还有很多其他存储方式(比如 pass、osxkeychain 等等)。

产生错误是因为:由于错误的默认配置,导致 Docker 使用需要在图形界面下才能运行的凭证存储工具,而我们处于命令行下,无法以图形界面来提示用户输入密码,因此产生上述错误。

解决方案

虽然导致该问题的本质原因是相同的,但是错误配置却是多种多样的,我们无法一一列举。如果想要彻底解决此类问题,需要明白 Docker 凭证存储机制,参考 docker login (Using Registry) 笔记。

参考文献

docker login | Docker Documentation
Releases · docker/docker-credential-helpers
docker login fails while docker-compose is installed on Ubuntu 18.04 · Issue #6023 · docker/compose
docker login fails on a server with no X11 installed – Stack Overflow
Windows7 配置 docker 配置 registry-mirrors 国内镜像地址,运行 hello-world
Releases · docker/docker-credential-helpers