1. 环境准备
Linux版本:Centos7docker版本:17.05.0-ce
2. 部署Registry
2.1 使用docker pull命令获取registry的image# sudo docker pull registry:latest
2.2 使用docker run使用下载的registry的image启动一个容器(这里做成脚本registry.sh)
#!/bin/bash
echo "restart registry..."
docker stop registry && echo "停止服务成功!" || echo "停止服务失败!"
docker rm registry && echo "销毁服务成功!" || echo "销毁服务失败!"
docker run --detach \
--name registry \
--publish 5000:5000 \
--restart always \
--volume /home/docker/registry/:/var/lib/registry/ \
registry:latest
执行registry.sh 私有仓库registry即可允许起来。
2.3. 测试
curl http://localhost:5000/v2/
3.运行Registry Container并使用Nginx做代理安全代理
3.1 安装htpasswd因为需要使用nginx提供安全验证的功能,需要一个地方放置用户名和密码对。
使用由httpd-tools提供的htpasswd工具生成用户名密码对。
安装httpd-tools.
$ yum install httpd-tools
3.2 设置授权账户(账户:docker)
htpasswd -c registry.htpasswd docker
3.3 加入SSL验证
如果你有经过认证机构认证的证书,则直接使用将证书放入nginx目录下即可。如果没有,则使用openssl创建自己的证书。
a) 生成一个新的root key
$ openssl genrsa -out dockerRootCA.key 2048
b) 生成根证书(一路回车即可)
$ openssl req -x509 -new -nodes -key dockerRootCA.key -days 10000 -out dockerRootCA.crt
c) 为server创建一个key。(这个key将被nginx配置文件registry.conf中ssl_certificate_key域引用)
$openssl genrsa -out docker.weipaiku.com.key 2048
d) 为server生产证书
openssl req -new -key docker.weipaiku.com.key -out docker.weipaiku.com.csr
制作证书签名请求。注意在执行下面命令时,命令会提示输入一些信息,”Common Name”一项一定要输入你的域名(docker.weipaiku.com),其他项随便输入什么都可以。不要输入任何challenge密码,直接回车即可。
f) 签署认证请求
$ openssl x509 -req -in docker.weipaiku.com.csr -CA dockerRootCA.crt -CAkey dockerRootCA.key -CAcreateserial -out docker.weipaiku.com.crt -days 10000
3.4.配置nginx使用证书
a)编辑registry.conf
upstream docker-registry {
server 192.168.0.210:5000;
}
server {
listen 443;
server_name docker.weipaiku.com;
# SSL
ssl on;
ssl_certificate /etc/nginx/conf.d/cert/registry/docker.weipaiku.com.crt;
ssl_certificate_key /etc/nginx/conf.d/cert/registry/docker.weipaiku.com.key;
# disable any limits to avoid HTTP 413 for large image uploads
client_max_body_size 0;
# required to avoid HTTP 411: see Issue #1486 (https://github.com/docker/docker/issues/1486)
chunked_transfer_encoding on;
location /v2/ {
# Do not allow connections from docker 1.5 and earlier
# docker pre-1.6.0 did not properly set the user agent on ping, catch "Go *" user agents
if ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*$" ) {
return 404;
}
# To add basic authentication to v2 use auth_basic setting plus add_header
auth_basic "registry.docker.yaok.com";
auth_basic_user_file /etc/nginx/conf.d/cert/registry/registry.htpasswd;
add_header 'Docker-Distribution-Api-Version' 'registry/latest' always;
proxy_pass http://docker-registry;
proxy_set_header Host $http_host; # required for docker client's sake
proxy_set_header X-Real-IP $remote_addr; # pass on real client's IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 900;
}
}
b)把虚拟主机配置放到nginx配置文件中
把配置文件(registry.conf) 放到nginx的conf.d目录下面,重启即可。
(nginx配置参照:https://blog.csdn.net/shgh_2004/article/details/80422896)
c) 测试
重新nginx 服务,并测试https://docker.weipaiku.com/v2/
4. Docker客户端使用Registry
a) 安装ca-certificates包$ yum install ca-certificates
b) 使能动态CA配置功能
$ update-ca-trust force-enable
c) 将key拷贝到/etc/pki/ca-trust/source/anchors/
$ cp dockerRootCA.crt /etc/pki/ca-trust/source/anchors/
d) 使新拷贝的证书生效
$ update-ca-trust extract
e)证书拷贝后,需要重启docker以保证docker能使用新的证书
$ service docker restart
f)Docker pull/push image测试
制作要push到registry的镜像
5. push 一个实例
a) 从仓库中获取imagedocker pull hello-world:latest
b) 打标签tag
docker tag hello-world:latest docker.weipaiku.com/hello-world:1.0
c) push 到私有仓库
docker push docker.weipaiku.com/hello-world:1.0
6. Docker登录与登出
登录docker login -u 用户名 -p 密码
登出
docker logout
7. 制作查看:
a) 首先安装epel扩展源:yum -y install epel-release
更新完成之后,就可安装pip:
yum -y install python-pip
安装完成之后清除cache:
yum clean all
b) request模块安装:
pip install requests
c) 创建registry.py文件,内容如下:
#!/usr/bin/env python
#-- coding:utf-8 --
import requests
import json
import traceback
repo_ip = '192.168.0.210'
repo_port = 5000
def getImagesNames(repo_ip,repo_port):
docker_images = []
try:
url = "http://" + repo_ip + ":" +str(repo_port) + "/v2/_catalog"
res =requests.get(url).content.strip()
res_dic = json.loads(res)
images_type = res_dic['repositories']
for i in images_type:
url2 = "http://" + repo_ip + ":" +str(repo_port) +"/v2/" + str(i) + "/tags/list"
res2 =requests.get(url2).content.strip()
res_dic2 = json.loads(res2)
name = res_dic2['name']
tags = res_dic2['tags']
for tag in tags:
docker_name = str(repo_ip) + ":" + str(repo_port) + "/" + name + ":" + tag
docker_images.append(docker_name)
print docker_name
except:
traceback.print_exc()
return docker_images
a=getImagesNames(repo_ip, repo_port)
#print a
d) 执行命令:
python registry.py即可。(注意,ip地址,port参数要对应实际环境)