Skip to content

Docker - 私有仓库

Docker Hub 对于公共镜像来说非常出色,但组织通常需要一个私有仓库来存储专有或敏感的容器镜像。Docker 提供了一个官方的 registry 镜像,您可以将其作为容器运行来托管您自己的私有仓库。

步骤 1:使用 docker run 启动仓库容器。

docker run -d -p 5000:5000 --restart=always --name local-registry registry:2

命令解释:

  • -d:在分离模式下运行容器(后台运行)。
  • -p 5000:5000:将 Docker 主机上的 5000 端口映射到容器内的 5000 端口(仓库默认监听的端口)。
  • --restart=always:确保仓库容器在停止或 Docker 守护进程重启时自动重启。
  • --name local-registry:为容器指定一个方便的名称。
  • registry:2:指定官方 Docker registry 镜像,版本 2(最新稳定版)。

步骤 2:使用 docker ps 验证仓库容器是否正在运行。

docker ps

您应该会看到 local-registry 容器被列出。

要使用您的私有仓库,您需要适当地为您的镜像打标签 (tag),然后推送它们。

步骤 3:为一个现有镜像打标签 (tag) 以指向您的私有仓库。假设您有一个本地镜像名为 my-app:1.0。

# 为 'my-app:1.0' 打标签使其指向 'localhost:5000/my-private-app:1.0'
docker tag my-app:1.0 localhost:5000/my-private-app:1.0

为私有仓库打标签的格式是:<仓库主机>:<仓库端口>/<镜像名称>:<标签>。由于我们的仓库运行在同一主机上并监听 5000 端口,因此我们使用 localhost:5000。

步骤 4:将打好标签的镜像推送到您的私有仓库。

docker push localhost:5000/my-private-app:1.0

Docker 会将镜像层 (image layers) 上传到您正在运行的 local-registry 容器。

步骤 5:为了测试拉取,首先删除镜像的本地副本(可选)。

# 删除指向私有仓库的特定标签
docker rmi localhost:5000/my-private-app:1.0
# 也可以选择删除原始标签 (如果没有其他标签指向它)
# docker rmi my-app:1.0

步骤 6:现在,从您的私有仓库拉取镜像。

docker pull localhost:5000/my-private-app:1.0

Docker 会从您的 local-registry 容器下载镜像层 (image layers)。您可以使用 docker images 验证它已恢复。

  • 安全性(HTTP vs HTTPS): 默认情况下,registry 容器运行在 HTTP 上。Docker 客户端默认期望 registry 使用 HTTPS 以确保安全。要从像 localhost:5000 这样的非安全 registry 推送/拉取,您通常需要在 Docker 守护进程(在 Linux 上通过 /etc/docker/daemon.json 或 Docker Desktop 设置)中配置信任此 registry。请在 Docker 文档中搜索 insecure-registries。
  • 存储: 基本的 registry:2 容器将镜像层存储在容器的文件系统内。如果容器被移除,镜像会丢失。为了持久化存储,您应该将卷 (volume) 挂载到容器内的 /var/lib/registry 路径下:docker run -d -p 5000:5000 --restart=always --name local-registry -v registry-data:/var/lib/registry registry:2(这使用了一个命名卷 registry-data)。
  • 身份验证/授权: 默认的 registry 没有身份验证。对于生产环境使用,您需要配置 TLS (HTTPS),并且可能需要添加身份验证(例如 Basic Auth、Token Auth)。
  • UI: 基本的 registry 没有 Web UI。Portus、Harbor 或 Docker Trusted Registry(商业版)等工具提供了 UI 和额外功能。
  • 网络访问: 如果您需要从其他机器访问该 registry,请在打标签、推送和拉取时将 localhost 替换为 Docker 主机的 IP 地址或一个可解析的主机名,并确保防火墙规则允许访问 5000 端口。