docker私有仓库记录

在自己服务器上如何搭建docker私有仓库?

docker hub官方提供了registry镜像用于搭建私有仓库。

搭建私有仓库

创建仓库文件夹

1
mkdir -p /opt/docker-hub/registry

获取registry镜像

1
docker pull docker.io/registry

重命名

1
docker tag docker.io/registry registry

启动仓库

1
docker run --name docker-registry -d -p 5000:5000 --restart=always registry

配置nginx

打算把仓库地址应用到https://registry.dillonliang.cn 上。 首先获取证书,阿里云提供免费SSL证书,具体可参考 https://yq.aliyun.com/articles/637307

获取证书后,在服务上配置nginx

1
cd /etc/nginx && mkdir -p cert

把证书里的文件重命名registry.key 和 registry.pem并放到cert文件夹下。

编辑nginx.conf

新增一段nginx配置,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server {
listen 443 ssl;
server_name registry.dillonliang.cn;

ssl_certificate cert/registry.pem;
ssl_certificate_key cert/registry.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on;

client_max_body_size 0;
chunked_transfer_encoding on;

location / {
proxy_pass http://localhost:5000/;
proxy_read_timeout 900;
}
}

转发请求到服务器的5000端口上,其中

1
2
client_max_body_size 0;
chunked_transfer_encoding on;

控制上传镜像的大小限制。

检查nginx配置并重启

1
2
nginx -t
nginx -s reload

推送镜像到私有仓库

获取一个以前打包的镜像,是个node.js程序,大小是74MB左右。

1
docker pull dillonliang/hello-node

重新打一个tag,路径一定是前面配置的域名开头,eg: registry.dillonliang.cn/IMAGE

1
docker tag dillonliang/hello-node:latest registry.dillonliang.cn/hello-node:latest

然后推送镜像

1
docker push registry.dillonliang.cn/hello-node:latest

如何验证呢?

  1. 再换一台机器,然后docker pull registry.dillonliang.cn/hello-node:latest即可
  2. 删除本地的相关镜像,然后执行docke pull registry.dillonliang.cn/hello-node:latest

开启账号密码登录

在服务器上创建文件夹

1
mkdir -p /opt/docker-hub/auth

然后创建账号密码

1
docker run --entrypoint htpasswd registry -Bbn USERNAME PASSWORD > /opt/docker-hub/auth/htpasswd

替换掉USERNAME和PASSWORD即可。

删除原有registry容器,之后重新启动,如下

1
2
3
4
5
6
7
docker run -d -p 5000:5000 --restart=always --name registry \
-v /opt/docker-hub/registry:/var/lib/registry \
-v /opt/docker-hub/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
registry

然后在本机重现推送镜像的时候,会告诉你authentication required。登录私有仓库:

1
docker login registry.dillonliang.cn

根据提示,输入账号密码即可,会提示Login Succeeded

todo

  1. docker-registry web,私有仓库web界面,使用konradkleine/docker-registry-frontend:v2镜像
  2. 私有仓库TLS配置

参考资料: