Docker部署私有仓库

基础操作

运行如下命令安装

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。