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 的登录操作,否则会踩坑。