使用docker-compose和私有仓库
1. 简介
出于多种原因,私有 Docker 存储库经常用于云应用程序。图像可能包含我们无法共享的内容,或者它们可能对其他人没有用。
在本教程中,我们将讨论docker-compose 如何使用docker login 命令访问私有存储库。
2. 使用docker login
我们在使用Docker的时候经常拉取并运行公共镜像 ,不需要登录,只有在需要访问私有仓库的时候才需要登录。
让我们看看如何使用docker login命令以交互方式执行此操作:
$ docker login
...
Username: myuser
Password:
Login Succeeded
$
$ docker pull myuser/hello-world
Using default tag: latest
latest: Pulling from myuser/hello-world
Digest: sha256:...
Status: Downloaded newer image for myuser/hello-world:latest
docker.io/myuser/hello-world:latest
我们稍后可以在不再次提供我们的凭据的情况下进行docker login。这是因为它们已经存储在我们的机器上。
我们可以使用任何 Docker 注册表来保存我们的图像,而不仅仅是默认的。我们可以在许多作为服务提供的 Docker 注册表中进行选择,通常是免费的。
要登录到不同的注册表,我们只需要在docker login命令之后添加它:
$ docker login some-other-docker-registry.io
登录后,我们用于此新注册表的凭据存储在我们的机器中。然后我们同时登录到两个注册表。
稍后,当我们想要访问映像时,我们需要明确提及 repo:
$ docker pull some-other-docker-registry.io/hello-world
3. login如何帮助docker-compose
docker-compose是启动多容器 docker 应用程序的 便捷工具。它允许我们在单个文件中定义所有图像,即使它们存储在不同的注册表中。
假设我们需要处理不同的注册管理机构和不同的访问级别。在这种情况下,我们的docker-compose.yml文件可能开始:
version: '3'
services:
public:
image: hello-world
private:
image: myuser/hello-world
other-registry:
image: some-other-docker-registry.io/myuser/hello-world
我们使用hello-world映像来简化我们的示例。这是一个官方映像,只打印如何开始使用 Docker 并在之后立即完成。
前两个服务引用默认 Docker 注册表中的映像。第一个是公共映像,第二个是私人映像。第三个映像存储在不同注册表的私有存储库中。
我们应该在第一次使用docker-compose之前登录到这两个注册表。这样我们的凭据将存储在我们的机器中:
$ docker login
Login with your Docker ID ...
Username: myuser
Password:
Login Succeeded
$
$ docker login some-other-docker-registry.io
Username: myuser
Password:
Login Succeeded
只有这样我们才能使用docker-compose启动所有服务:
$ docker-compose up
Creating network "login_default" with the default driver
...
public_1 | Hello from Docker!
public_1 | ...
other-registry_1 | Hello from Docker!
other-registry_1 | ...
login_public_1 exited with code 0
private_1 | Hello from Docker!
private_1 | ...
login_private_1 exited with code 0
login_other-registry_1 exited with code 0
$
$ docker-compose down
...
就是这样!我们让docker-compose访问不同注册表中的私有存储库。
现在让我们将上面的成功输出与我们未登录时得到的错误进行比较。首先,我们必须注销并删除本地下载的映像才能看到错误:
$ docker logout
Removing login credentials for https://index.docker.io/v1/
$ docker image rm myuser/hello-world
...
$
$ docker-compose up
Creating network "login_default" with the default driver
Pulling private (myuser/hello-world:latest)...
ERROR: pull access denied for myuser/hello-world, repository does not exist or may require 'docker login':
denied: requested access to the resource is denied