Docker-registry官方文档说明:Docker Registry | Docker Documentation
记录通过 docker-registry 搭建集群节点可访问的私有镜像仓库过程。 注意:文中所有的 your-ip、your-domain 需要替换成自己对应的值
- https 访问
- 用户名密码认证
- 构建发布镜像到自建仓库
软件版本
| 软件 | 版本 |
|---|---|
| ubuntu | 20.04.3 LTS |
| docker | 20.10.12 |
| registry | 2 |
| LibreSSL | 2.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