如何搭建私有的docker registry
目录
最近在使用docker,官方提供了开放的中央仓库DockerHub给所有人使用,但是涉及内部信息的私有镜像并不适合提交到dockerhub。因此决定来搭建一个私有的docker仓库,顺便折腾练习一下……
安装docker
为了搭建docker registry,我们首先需要在服务器上安装Docker。这里以Ubuntu 16.04为例:
卸载旧版本
旧版本的Docker叫做 docker 或者 docker-engine,如果安装过了的话,先将其卸载:
$ sudo apt-get remove docker docker-engine docker.io
关于存储驱动:
- Linux内核版本大于4支持使用 overlay2,同时比 aufs 更好;
- Linux内核版本3使用 aufs,因为 overlay/overlay2 不支持;
安装Docker CE
$ sudo apt-get update $ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common # 添加官方的GPG秘钥 $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - # 可以选择stable,edge或者test版本进行安装 $ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" $ sudo apt-get update $ sudo apt-get install docker-ce
如果需要安装特定版本的Docker:
# 查看可用的版本 $ apt-cache madison docker-ce # 安装指定版本的Docker $ sudo apt-get install docker-ce=<VERSION>
跑个hello-world镜像试试看:
$ sudo docker run hello-world
部署本地仓库
docker registry实际上就是官方 regsitry镜像的一个实例,所以可以通过docker直接运行:
# 目前latest版本是2[.6[.2]] # -v 将我们本地的目录映射到docker,这样push上来的镜像就存储在该目录了 $ docker run -p 5000:5000 --name docker-registry -v /home/ubuntu/docker:/var/lib/registry --rm registry:2
然后我们就可以使用本地的docker仓库了,先从Dokcer Hub拉取Ubuntu:16.04镜像:
$ docker pull ubuntu:16.04
打个标签,提交到我们本地仓库:
$ docker tag ubuntu:16.04 localhost:5000/ubuntu $ docker push localhost:5000/ubuntu
删除本地缓存的镜像,注意提交到仓库的镜像并不会被删除:
$ docker image remove ubuntu:16.04 $ docker image remove localhost:5000/ubuntu
然后我们可以再从自己的docker仓库拉取镜像:
$ docker pull localhost:5000/ubuntu
配置外部访问
我们上面的操作都只是在本地进行,因此我们还需要额外配置一下使得该docker仓库可以给外部使用。
获取HTTPS证书
为了支持外部访问,我们需要获取一个证书,可以使用Let’s Encrypted签发证书。
Nginx反向代理
配置一下nginx,这里我们docker仓库的域名设置为 https://docker.chenjiehua.me
# docker registry server { listen 80; server_name docker.chenjiehua.me; return 301 https://$host$request_uri$is_args$args; } server { listen 443 ssl; index index.html index.htm; server_name docker.chenjiehua.me; root /var/www; ssl on; ssl_certificate /etc/letsencrypt/live/docker.chenjiehua.me/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/docker.chenjiehua.me/privkey.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4"; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; access_log /home/ubuntu/log/nginx/docker.log main; error_log /home/ubuntu/log/nginx/docker-err.log; client_max_body_size 512M; location / { proxy_pass http://127.0.0.1:5000; include proxy_params; } }
限制访问
使用 basic auth限制访问权限,在nginx的配置中添加:
auth_basic "Restricted Access"; auth_basic_user_file /home/ubuntu/htpasswd.users; location / { ...
登陆docker仓库:
$ docker login docker.chenjiehua.me
部署Docker Web
为了方便我们查看私有docker仓库中的镜像情况,我们可以使用docker-frontend来作为web界面:
# ENV_DOCKER_REGISTRY_HOST: 本地 docker 地址 # ENV_DOCKER_REGISTRY_PORT: 本地 docker 端口 $ docker run -e ENV_DOCKER_REGISTRY_HOST=192.168.0.1 -e ENV_DOCKER_REGISTRY_PORT=5000 -p 5001:80 --rm konradkleine/docker-registry-frontend:v2
配置一下nginx:
# docker registry frontend server { listen 80; server_name docker-web.chenjiehua.me; return 301 https://$host$request_uri$is_args$args; } server { listen 443 ssl; index index.html index.htm; server_name docker-web.chenjiehua.me; root /var/www; ssl on; ssl_certificate /etc/letsencrypt/live/docker.chenjiehua.me/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/docker.chenjiehua.me/privkey.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4"; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; access_log /home/ubuntu/log/nginx/docker-web.log main; error_log /home/ubuntu/log/nginx/docker-web-err.log; auth_basic "Restricted Access"; auth_basic_user_file /home/ubuntu/htpasswd.users; location / { proxy_pass http://127.0.0.1:5001; include proxy_params; } }
参考:
评论