部署基于域名访问的私有仓库
制作站点证书
# 创建 CA 私钥
openssl genrsa -out "root-ca.key" 4096
# 利用私钥创建 CA 根证书 请求文件
# -subj 参数里的 /C 表示国家,如 CN;/ST 表示省;/L 表示城市或者地区;/O 表示组织名;/CN 通用名称
openssl req \
-new -key "root-ca.key" \
-out "root-ca.csr" -sha256 \
-subj '/C=CN/ST=BJ/L=DongCheng/O=FourLeaf/CN=FourLeaf Docker Registry CA'
# 新建 root-ca.cnf 文件,配置 CA 根证书
nano root-ca.cnf
# {
[root_ca]
basicConstraints = critical,CA:TRUE,pathlen:1
keyUsage = critical, nonRepudiation, cRLSign, keyCertSign
subjectKeyIdentifier=hash
# }
# 签发 根证书
openssl x509 -req -days 3650 -in "root-ca.csr" \
-signkey "root-ca.key" -sha256 -out "root-ca.crt" \
-extfile "root-ca.cnf" -extensions \
root_ca
# 生成 站点 SSL 私钥
openssl genrsa -out "dockerhub.FourLeaf.poc.key" 4096
# 用私钥生成证书请求文件
openssl req -new -key "dockerhub.FourLeaf.poc.key" -out "site.csr" -sha256 \
-subj '/C=CN/ST=BJ/L=DongCheng/O=FourLeaf/CN=dockerhub.FourLeaf.poc'
# 新建 site.cnf 文件,配置证书
nano site.cnf
# {
[server]
authorityKeyIdentifier=keyid,issuer
basicConstraints = critical,CA:FALSE
extendedKeyUsage=serverAuth
keyUsage = critical, digitalSignature, keyEncipherment
subjectAltName = DNS:docker.domain.com, IP:127.0.0.1
subjectKeyIdentifier=hash
# }
# 签署站点 SSL 证书
openssl x509 -req -days 750 -in "site.csr" -sha256 \
-CA "root-ca.crt" -CAkey "root-ca.key" -CAcreateserial \
-out "dockerhub.FourLeaf.poc.crt" -extfile "site.cnf" -extensions server
# 创建 私有仓库配置文件 及 SSL 文件夹
mkdir -p /etc/docker/registry/ssl/
# 将 dockerhub.FourLeaf.poc.crt dockerhub.FourLeaf.poc.key root-ca.csr 这三个文件 复制到 ssl 文件夹
cp ~/{dockerhub.FourLeaf.poc.crt,dockerhub.FourLeaf.poc.key,root-ca.csr} /etc/docker/registry/ssl
创建 CA 私钥
利用私钥创建 CA 根证书 请求文件
新建 root-ca.cnf 文件,配置 CA 根证书
签发 根证书
生成 站点 SSL 私钥
私钥生成证书请求文件
新建 site.cnf 文件,配置证
签署站点 SSL 证书
配置私有仓库
# 创建 私有仓库 配置文件
nano /etc/docker/registry/config.yml
# 修改 配置文件 内容
# {
version: 0.1
log:
accesslog:
disabled: true
level: debug
formatter: text
fields:
service: registry
environment: staging
storage:
delete:
enabled: true
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
auth:
htpasswd:
realm: basic-realm
path: /etc/docker/registry/auth/nginx.htpasswd
http:
addr: :443
host: https://dockerhub.FourLeaf.poc
headers:
X-Content-Type-Options: [nosniff]
http2:
disabled: false
tls:
certificate: /etc/docker/registry/ssl/dockerhub.FourLeaf.poc.crt
key: /etc/docker/registry/ssl/dockerhub.FourLeaf.poc.key
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
# }
生成http认证文件
# 创建 认证文件 文件夹
mkdir -p auth
# 生成 认证文件 命令 规则
$ docker run --rm \
--entrypoint htpasswd \
httpd:alpine \
-Bbn {用户名} {密码} > auth/nginx.htpasswd
# 生成 认证文件 命令 执行 (注意修改用户名密码)
$ docker run --rm \
--entrypoint htpasswd \
httpd:alpine \
-Bbn srover P@ssw0rd > auth/nginx.htpasswd
编辑 docker-compose.yml 文件
# 创建 docker-compose.yml 文件
nano docker-compose.yml
# 编辑 docker-compose.yml 文件
# {
version: '3'
services:
registry:
image: registry
ports:
- "443:443"
volumes:
- ./:/etc/docker/registry
- registry-data:/var/lib/registry
volumes:
registry-data:
# }
复制 自发行 CA根证书
# 由于 CA根证书 是自发行的,不被系统信任,所以需要手工拷贝 CA根证书
# 复制 CA根证书
sudo mkdir -p /etc/docker/certs.d/dockerhub.FourLeaf.poc
sudo cp ssl/root-ca.crt /etc/docker/certs.d/dockerhub.FourLeaf.poc/ca.crt
修改 Host 文件
# 修改 Host 文件
echo 172.16.28.124 dockerhub.FourLeaf.poc >> /etc/hosts
# 本机由于有自建 DNS 其实不需要这步,已经可以解析该域名
开放 防火墙
# 开放宿主机 TCP 443 端口
sudo firewall-cmd --permanent --zone=public --add-port=443/tcp
sudo firewall-cmd --reload
# 或者 直接开放 https 服务
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload
启动 私有仓库
# 使用 docker-compose.yml 文件 启动 私有仓库
sudo docker compose up -d
登录 私有仓库
# 登录到 私有仓库
sudo docker login dockerhub.FourLeaf.poc
# 输入 {用户名}
# 输入 {密码}
测试 私有仓库
# 拉取 测试用镜像 ubuntu:18.04
sudo docker pull ubuntu:18.04
# 列出所有镜像 (查看是否下载成功)
sudo docker image ls
# 修改镜像标记 规则
sudo docker tag {镜像名} {私有库URL}/{用户名}/{镜像名}
# 修改镜像标记
sudo docker tag ubuntu:18.04 dockerhub.FourLeaf.poc/srover/ubuntu:18.04
# 列出所有镜像 (查看是否改名成功)
sudo docker image ls
# 将 镜像 上传到 私有仓库
sudo docker push dockerhub.FourLeaf.poc/srover/ubuntu:18.04
# 删除 本地 镜像
sudo docker image rm dockerhub.FourLeaf.poc/srover/ubuntu:18.04
# 列出所有镜像 (查询是否删除成功)
sudo docker image ls
# 从 私有仓库 下载 镜像
sudo docker pull dockerhub.FourLeaf.poc/srover/ubuntu:18.04
# 列出所有镜像 (查看是否下载成功)
sudo docker image ls
退出 私有仓库
# 退出 私有仓库
sudo docker logout dockerhub.FourLeaf.poc
目前遇到的问题
几个配置文件的含义和编写方式还不理解,需要再研究
如何查询私有仓库的内容,按照以前IP地址的私有仓库查询方法失败了,须要再研究
如何部署网页版的私有仓库,之前部署过一次,但是没有做HTTPS,登录遇到了问题,需要研究两个问题
如何登录非HTTPS的私有仓库
如何部署HTTP的网页版私有仓库
以上问题在接下来的文档中解决