• 隐藏侧边栏
  • 展开分类目录
  • 关注微信公众号
  • 我的GitHub
  • QQ:1753970025
Chen Jiehua

如何搭建私有的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;
	}
}

 

参考:

码字很辛苦,转载请注明来自ChenJiehua《如何搭建私有的docker registry》

评论