注:针对ubuntu 14.04版,所有的操作都是在root用户下进行的
1.准备
已经安装好docker。
2.拉取registry镜像
拉取registry镜像的命令可以直接用:
# docke pull registry
3.运行registry
运行registry时,要对registry进行相关的设置,首先在自己的本机上创建一个目录来保存上传的镜像,这个目录我们将要挂载到registry上:
# mkdir -p /opt/docker-registry
创建好目录就可以运行把registry放到容器里运行了,执行下面的命令:
# docker run -d \
--restart=always \
--name docker-registry \
-e SETTINGS_FLAVOR=dev \
-e STORAGE_PATH=/tmp/registry \
-v /opt/docker-registry:/tmp/registry \
-p 5000:5000 \
registry
我对这个命令的有些地方解释一下,“-e STORAGE_PATH=/tmp/registry \” 这个参数设置了推送到registry上的镜像保存路径,“-v /opt/docker-registry:/tmp/registry \”这个参数就是把本机上的刚才建的目录挂载到registry上,这样推送到registry上的镜像就被保存到本机上了,这样方便管理,“-p 5000:5000 \”指定了端口的映射,“:”前是本机上的端口,后面是registry自身监听的端口,也就是说当访问本机的5000端口是,会被映射到registry的5000端口,就相当于访问registry,最后的“registry”就是要用哪个镜像来运行容器,也可以在后面添加“:<版本号>”来指定使用镜像的版本,如果不写默认是“latest”最新版的。
4.安装Nginx和apache2-utils包
通过该包,可以轻松创建Nginx能够读取的权限文件
# apt-get install nginx apache2-utils
5.添加用户
安装完成过后通过下面的命令来创建第一个用户
# htpasswd -c /etc/nginx/docker-registry.htpasswd $user
参数“-c”的意思重新创建“docker-registry.htpasswd”文件,并添加用户。如果只是增加用户,你可以用下面的命令:
# htpasswd /etc/nginx/docker-registry.htpasswd $user
添加新的用户成功,如下图所示:
6.修改nginx的配置
在“/etc/nginx/sites-available/ ”下有一个文件名为“default”的文件,先把它移动到上一级目录做个备份,也可以直接删除(记住“sites-available”目录下千万不要放目录或者文件什么的,除了 nginx 的配置文件),然后再回到“sites-available/”目录下,创建一个新文件,文件名为“docker-registry“并添加如下内容:
upstream docker-registry {
server localhost:5000;
}
server {
listen 8080; # 设置nginx服务器监听的端口
server_name my.registry.com; # 设置服务器名
# ssl on;
# ssl_certificate /etc/ssl/certs/docker-registry/my-registry.com.crt;
# ssl_certificate_key /etc/ssl/private/docker-registry/my-registry.com.key;
proxy_set_header Host $http_host; # required for Docker client sake
proxy_set_header X-Real-IP $remote_addr; # pass on real client IP
client_max_body_size 0;
# disable any limits to avoid HTTP 413 for large image uploads
# required to avoid HTTP 411: see Issue #1486 ()
chunked_transfer_encoding on;
location / {
# let Nginx know about our auth file
auth_basic "Restricted";
# 这里要写的参数就是刚才创建的文件
auth_basic_user_file docker-registry.htpasswd;
proxy_pass ;
}
location /_ping {
auth_basic off;
proxy_pass http://docker-registry;
}
location /v1/_ping {
auth_basic off;
proxy_pass http://docker-registry;
}
}
保存文件后,对该文件建立链接,这样 nginx 就可以使用该配置文件了,建立链接使用命令如下:
ln -s /etc/nginx/sites-available/docker-registry /etc/nginx/sites-enabled/docker-registry
7.重启nginx服务
# service nginx restart
如果之前已经把nginx服务停了(service nginx stop),可以直接启动服务就行
# service nginx start
8.测试nginx代理registry认证
首先验证 registry 是否正常:
# curl localhost:5000
正常的情况下会有下面的输出:
如果 registry 正常,在验证一下 nginx:
# curl localhost:8888
正常的情况下nginx是不会让你访问的,它会有如下的输出:
现在看来 registry 和 nginx 都是正常的,那么就行一下 nginx 代理 registry 认证的测试:
# docker login localhost:8888
执行这个命令后,他会让你输入用户名、密码,以及邮箱(邮箱随便输入),验证通过后会有如下的输出:
9.配置ssl
上面的验证是在本机上进行的,如果你通过另外一台机器来登录 registry,是不成功的,会出现下面的错误提示:
所以为了让我们的 registry 在别的机器上也可以访问,我们就需要给 nginx 配置 ssl,这样是的回话更加安全。
9.1生成根密钥
创建目录,并进入:
# mkdir ~/certs && cd $_
生成根密钥:
# openssl genrsa -out dockerCA.key 2048
生成的过程中有如下输出,并可以在该目录下有“dockerCA.key”文件生成:
9.2生成根证书
在相同目录下生成根证书,生成根证书用到了刚才生成的根密钥,当要求输入“Common Name”时,确保输入的是你给自己的服务器起的域名,我的域名是“my.registry.com”。使用下面的命令生成根证书:
# openssl req -x509 -new -nodes -key dockerCA.key -days 10000 -out dockerCA.crt
生成过程如下图所示:
9.3为服务器生成密钥
# openssl genrsa -out my-registry.com.key 2048
为服务器生成密钥与生成根密钥的过程一样,如下图:
9.4生成证书签名请求
在生成证书签名请求时,它会要求你输入“A challenge password”和“An optional company name”,你都不要输入,直接“Enter”,如下图所示:
penssl req -new -key my-registry.com.key -out my-registry.com.csr
9.5对证书的请求进行签名
# openssl x509 -req -in my-registry.com.csr -CA dockerCA.crt -CAkey dockerCA.key -CAcreateserial -out my-registry.com.crt -days 10000
签名过程如下图所示:
9.6将证书和秘钥拷贝到相应的路径
在“/etc/ssl/certs/”创建目录“docker-registry”,并拷贝“my-registry.com.crt”到该目录下:
# mkdir /etc/ssl/certs/docker-registry
# cp ~/certs/my-registry.com.crt /etc/ssl/certs/docker-registry/
在“/etc/ssl/private/”创建目录“docker-registry”,并拷贝“my-registry.com.key”到该目录下:
# mkdir /etc/ssl/private/docker-registry
# cp ~/certs/my-registry.com.key /etc/ssl/private/docker-registry/
9.7修改nginx的配置
把“/etc/nginx/sites-available/docker-registry”中原来关于 ssl 注释的部分打开,也就是去掉前面的“#”,而且一定要注意,这里配置的证书和秘钥路径一定要和上面你创建的路径一样。如下图所示:
9.8客户端配置
可以先在同一台机器上,配置一下如何登录到本机上的registry。首先在目录“/usr/local/share/ca-certificates/”下创建目录“docker-dev-cert”,然后把“dockerCA.crt”拷贝到该目录下,并更新证书。
# mkdir /usr/local/share/ca-certificates/docker-dev-cert
# cp ~/certs/dockerCA.crt /usr/local/share/ca-certificates/docker-dev-cert
# update-ca-certificates
更行完成如下所示:
同时可以在“/etc/ssl/certs/”看到生成的“dockerCA.pem”文件。如果你想在另一个远程机器上登录到这台机器上的 registry,可以对该远程机器进行8.8所述的相同配置。
9.9测试
在测试前,还得进行一些配置,我是在IP为135.125.119.74的机器上搭的服务,称它为“本机”,在本机上的“/etc/hosts”文件中添加域名和IP地址的映射,添加如下映射:
127.0.0.1 my.registry.com
我的远程机的IP是135.125.119.12,称它为“远程机”,在远程机上的“/etc/hosts”文件中添加域名和IP地址的映射,添加如下映射:
135.125.119.74 my.registry.com
测试时都用下面的命令:
# curl https://zongxingh:<密码>@my.registry.com:8888
本机测试结果如下图:
远程机测试结果如下图: