通过 Docker-registry 搭建 Docker 私有镜像仓库

701 阅读2分钟

Docker-registry官方文档说明:Docker Registry | Docker Documentation

记录通过 docker-registry 搭建集群节点可访问的私有镜像仓库过程。 注意:文中所有的 your-ip、your-domain 需要替换成自己对应的值

  • https 访问
  • 用户名密码认证
  • 构建发布镜像到自建仓库

软件版本

软件版本
ubuntu20.04.3 LTS
docker20.10.12
registry2
LibreSSL2.8.3

生成秘钥证书

需要注意的是,新版本 registry 使用 go 推荐使用 SAN 证书,Common Name 已经被废弃。

生成 domain.key 和 domain.crt

mkdir -p certs

openssl req \
  -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \
  -addext "subjectAltName = DNS:your-domain" \
  -x509 -days 3650 -out certs/domain.crt

Docker daemon 信任该证书

集群中所有需要连接到该私有仓库的节点,都需要让 Docker daemon 信任该证书

## 每一个需要连接该仓库的都需要执行以下操作
mkdir -p /etc/docker/certs.d/your-domain:5000/

cp certs/domain.crt /etc/docker/certs.d/your-domain:5000/ca.crt

## 有些版本的 Docker 需要操作系统层面也信任该证书,为了保证顺利一律执行
cp certs/domain.crt /usr/local/share/ca-certificates/your-domain.crt

update-ca-certificates

创建 htpasswd 鉴权文件

docker-registry 通过 htpasswd 进行用户名密码认证

# 生成 htpasswd
mkdir auth

docker run \
  --entrypoint htpasswd \
  httpd:2 -Bbn username password auth/htpasswd

启动 registry 仓库

# 首先在每个节点编辑 hosts 文件
echo your-ip your-domain

## 启动 registry 容器
docker run -d \
  -p 5000:5000 \
  --restart=always \
  --name registry \
  -v "$(pwd)"/auth:/auth \
  -e "REGISTRY_AUTH=htpasswd" \
  -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  -v "$(pwd)"/certs:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  -v registry:/var/lib/registry \
  registry:latest

测试 registry 仓库

### 登录仓库
docker login your-domain:5000
usernaem: 
password:

### 登录成功输出结果
### Authenticating with existing credentials...
### WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
### Configure a credential helper to remove this warning. See
### https://docs.docker.com/engine/reference/commandline/login/#credentials-store
### 
### Login Succeeded


### 尝试发布镜像到仓库

docker pull redis:latest
## 通过 Dockerfile 构建镜像
echo 'FROM redis \nCMD ["redis-server"]' >> Dockerfile

docker build -t your-domain:5000/redis-local:latest .

### 将镜像推送到自建仓库
docker push your-domain:5000/redis-local:latest

## 移除构建的镜像,尝试从本地仓库拉取
docker rmi your-domain:5000/redis-local
docker pull your-domain:5000/redis-local

## 查看结果
docker images