基础操作
运行如下命令安装
docker run -d \
-p 5000:5000 \
-v /usr/local/registry:/var/lib/registry \
--restart=always \
--name registry \
registry:2
这是一条典型的run命令,不出意外的话,Registry就在5000端口启动了。
为了验证,读者可以拉取一个busybox镜像(因为体积小),进行实验。
docker pull busybox
拉取最新的busybox镜像后,再给其打标,准备发布到Registry中。
docker tag busybox localhost:5000/bosybox:v1.0
最后再推送给Registry。
docker push localhost:5000/bosybox:v1.0
此时,Registry就有了busybox:v1.0镜像了,这时可以不用再去Docker Hub上面拉取了,通过自建的Registry即可。
docker pull localhost:5000/bosybox:v1.0
如果想查看远程仓库有哪些镜像,可以运行如下命令:
curl http://localhost:5000/v2/_catalog
窥一斑而见全豹,通过以上命令,我们能得出一个重要的结论:
对Registry的访问都是通过一系列REST API完成的。
到此为止,我们已经搭建了一个Docker Registry的“半成品”,说是“半成品”是因为这个Registry只能在本机正常工作,如果在其他主机上试图推送镜像上来,结果是失败的。
如果要做到externally-accessible,就必须使用CA安全证书。
基于SSL证书改造Registry
前置条件
1、一台安装了CentOS_7_64bit操作系统的主机(或者虚拟机);
2、申请一个域名。不然,可以改HOST文件,但不保证能成功;
3、如果申请了域名,顺便拿一个免费的CA证书,因为需要实现HTTPS访问,SSL证书是必须的,同样,阿里云上有免费证书申请。不然,可以使用OpenSSL自己生成,这也是很多博文所提到的做法,不保证成功;
4、再装上一个nginx做代理,可选。
5、熟悉Docker的基本概念和常用命令,但不必了解Dockerfile,Compose,Swarm,Kubernetes等高阶知识。
笔者申请了一个域名:iwendao.vip,并映射出来了一个二级域名:registry.iwendao.vip,专门用来作为Docker Registry的访问,然后基于此二级域名申请CA证书。
不出意外的话,从阿里云申请的免费证书都是由Symantec颁发的,将证书下载下来后,压缩包内有两份文件:xxxxxx.pem、xxxxxx.key。
将其更名为server.key,server.pem,通过ftp工具上传至主机,假设存放的目录是:/usr/local/certs。
ll /usr/local/certs
- rw-r--r-- 1 root root 1678 May 28 13:42 server.key
- rw-r--r-- 1 root root 3662 May 28 13:42 server.pem
因为颁发的是intermediate certificate,会发现没有crt文件,可以使用如下命令得到:
cat server.pem > server.crt
直接将pem文件内作为crt文件的内容输入,生成了server.crt文件。
至此,域名及其证书已准备就绪。
如果想使用nginx做代理,需要更改一下nginx.conf文件,以下是笔者的配置内容:
user root root;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
keepalive_timeout 60;
gzip on;
server {
listen 443;
server_name i-wendao;
ssl on;
root html;
index index.html index.htm;
ssl_certificate /usr/local/certs/server.pem;
ssl_certificate_key /usr/local/certs/server.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location ~ {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass https://registry;
}
}
upstream registry {
server 127.0.0.1:5000;
}
}
在nginx.conf配置文件中,需要注意两个地方:
1、开启nginx的ssl,只需要配置之前下载好的pem和key文件,这是阿里云官方给出的示例,亲测有效;
2、因为对Registry的访问都是通过REST API完成的,而且是HTTPS的访问协议,所以location节点的配置中,proxy_pass配置的是https://registry,如果配置成http://registry,一旦Docker Registry启用了SSL后,是访问不通的。
宿主机的配置已经完成了,接下来对Docker容器进行配置。
对于Docker Registry Server的部署,官方给了两个途径:
其一,针对参数不多的情况,可以直接在docker run命令指定;
另一个是通过yaml配置文件,可以一次性配置多个参数。
在本节,笔者将使用第一种方式部署,第二种方式的部署可以参见文末的附文。
docker run -d \
-p 5000:5000 \
-v /usr/local/registry:/var/lib/registry \
-v /usr/local/certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/server.key \
--restart=always \
--name registry \
registry:2
如果没有安装nginx的读者,可运行这条命令:
docker run -d \
-p 443:443 \
-v /usr/local/registry:/var/lib/registry \
-v /usr/local/certs:/certs \
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/server.key \
--restart=always \
--name registry \
registry:2
可以看到,Docker Registry Server启用SSL的时候,用到的是crt、key两个证书文件。
接下来,我们实验一下。
docker tag busybox registry.iwendao.vip/bosybox:v1.0
最后再推送给Registry。
docker push registry.iwendao.vip/bosybox:v1.0
查看远程仓库有哪些镜像。
curl https://registry.iwendao.vip/v2/_catalog
在另外一台主机,重复上述步骤,依然可以成功,说明已经搭建成功了。
参考:https://blog.csdn.net/egworkspace/article/details/80518647