现在dockerhub访问经常出现timeout的问题,导致每在一台新的机器上拉取镜像要么timeout要么需要自己架梯子,非常麻烦,而且下载次数太多了还会受限制。所以希望自己在一台服务上搭建一个私有仓库,其余的机器能够通过私有仓库来进行镜像的拉取推送。
生成拉取docker registry镜像
docker提供了一个镜像registry用来搭建本地镜像。首先先本地拉取此镜像:
docker pull registry
生成自签名证书
在当前路径创建一个目录用来存放证书文件
mkdir -p certs
cat << EOF > ssl.conf
[ req ]
prompt = no
distinguished_name = req_subj
x509_extensions = x509_ext
[ req_subj ]
CN = Localhost
[ x509_ext ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
basicConstraints = CA:true
subjectAltName = @alternate_names
[ alternate_names ]
DNS.1 = localhost
IP.1 = 10.0.x.x
EOF
注意:上文中DNS.1可以换为其他的域名,IP地址换为自己本机的IP
接下来生成证书
openssl req -config ssl.conf -new -x509 -nodes -sha256 -days 365 -newkey rsa:4096 -keyout ./certs/server-key.pem -out ./certs/server-crt.pem
配置用户认证
为了用户的安全可以给私有仓库配置用来登录的账号密码。
mkdir auth
htpasswd -Bbn testuser testpassword > ./auth/htpasswd
#生成后可以用cat查看
cat ./auth/htpasswd
启动registry镜像
包含签名证书的本地目录./certs
挂载包含持久存储的本地目录./registry
挂载用户密码登录的本地目录./auth
注意:需要保证这些目录都存在,若不存在则自行创建
docker run -d \
-p 5001:5000 \
--name registry \
--restart=always \
-v ./registry:/var/lib/registry \
-v ./auth:/auth \
-v ./certs:/certs \
-e REGISTRY_COMPATIBILITY_SCHEMA1_ENABLED=true \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server-crt.pem \
-e REGISTRY_HTTP_TLS_KEY=/certs/server-key.pem \
-e REGISTRY_AUTH=htpasswd \
-e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
registry
登录测试
此时使用
docker login -u testuser -p testpassword localhost:5001
是可以登录的,但是如果将localhost换为自己的ip则无法登录成功,因为还没有把自签名的证书加入本机信任。
签名证书加入本机信任
Ubuntu系统:
手动添加证书方式
sudo cp ./certs/server-crt.pem /usr/local/share/ca-certificates/
sudo cat /usr/local/share/ca-certificates/server-crt.pem >> /etc/ssl/certs/ca-certificates.crt
检查是否将证书server-crt.pem 添加到信任列表中
ls /etc/ssl/certs/
若不存在还可以手动创建软连接
sudo ln -s /usr/local/share/ca-certificates/server-crt.pem /etc/ssl/certs/
使用本机ip登录测试
docker login -u testuser -p testpassword 10.x.x.x:5000
Centos系统:
sudo cp ./certs/server-crt.pem /etc/pki/ca-trust/source/anchors/
sudo cat /etc/pki/ca-trust/source/anchors/server-crt.pem >> /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt
sudo update-ca-trust
sudo systemctl restart docker
完成后登录测试。
推送镜像测试:
给先有的镜像打标签:
docker tag registry:latest 10.20.x.x:5001/registry:latest
推送打好的镜像
docker push 10.20.x.x:5001/registry
其他机器使用该私有仓库
其他机器如果想使用该私有仓库,首先需要确保该机器能够访问私有仓库所在的ip,然后将私有仓库的证书加入本机信任之后就可以使用了。加入本机信任的方式参考上述步骤。
注意:docker中添加代理的时候可能会出现net/http: TLS handshake timeout问题,主要问题是在访问私有仓库的时候会转到代理的服务并不会访问到5000端口,因此需要在代理配置的no-proxy中设置好私有仓库的端口
解决办法:
sudo vi /etc/docker/daemon.json
{
"experimental": true,
"proxies": {
"http-proxy": "http://127.0.0.1:7890",
"https-proxy": "http://127.0.0.1:7890",
"no-proxy": "127.0.0.0/8,10.10.101.xx:5001"
}
}
sudo systemctl daemon-reload
sudo systemctl restart docker