Contents

使用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