1. 简介

在云应用开发中,我们经常会使用到 私有 Docker 仓库(Private Docker Repositories)。这些仓库可能包含了一些我们不方便公开的内容,或者是一些仅限内部使用的镜像。

本文将介绍如何通过 docker login 命令,让 docker-compose 成功访问这些私有仓库。

2. 使用 docker login

在使用 Docker 时,我们经常拉取和运行公共镜像,这种情况下无需登录。但当我们需要访问私有仓库时,就需要先进行登录。

我们可以通过交互式命令进行登录:

$ 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 会将凭证保存在本地,下次无需再次输入

我们也可以登录到非默认的 Docker Registry:

$ docker login some-other-docker-registry.io

登录之后,Docker 也会保存该 Registry 的凭证。我们可以同时登录多个 Registry。

之后拉取对应仓库的镜像时,需要带上完整的仓库地址:

$ docker pull some-other-docker-registry.io/hello-world

3. docker-compose 是如何利用登录凭证的

docker-compose 是一个非常方便的工具,可以用来快速启动一个 多容器的 Docker 应用。即使这些容器镜像分布在不同的 Registry 中,也可以通过 docker-compose.yml 文件统一管理。

假设我们的服务需要访问多个不同 Registry 的镜像,那么 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

⚠️ 在运行 docker-compose up 前,必须先完成所有涉及 Registry 的登录操作

$ 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 up,所有服务都能正常启动:

$ 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
...

只要登录过对应 Registry,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

❌ 由此可见,未登录就访问私有仓库会导致拉取失败

4. 总结

  • ✅ 私有仓库必须先通过 docker login 登录后才能访问
  • docker-compose 会自动使用已保存的登录凭证
  • ✅ 每个 Registry 需要单独登录一次即可
  • ❌ 未登录访问私有仓库会导致拉取失败,服务无法启动

因此,在使用 docker-compose 启动包含私有镜像的服务前,务必确保已经完成对应 Registry 的登录操作,否则会踩坑。


原始标题:Using docker-compose With Private Repositories