弄了一天,在网上查了很多资料,感觉都好复杂好复杂,一步一步踩坑踩出来就好了。

 


 

一、使用https的nginx

 

因为已经在阿里云有了域名,申请了免费的CA证书,具体的申请方法参考阿里云的文档就行

 

1、在nginx的配置目录下创建cert免费,存放秘钥,我的是在/usr/local/nginx/conf目录下

mkdir cert

 

2、把在阿里提供的证书全部拷贝,放到此目录

docker取证 docker registery_docker

 

3、修改nginx的配置文件 添加有关CA证书的内容

 

1)在nginx.conf配置文件中的http{ } 段添加

include /usr/local/nginx/conf/conf.d/*;

 

2)创建conf.d文件夹

mkdir /usr/local/nginx/conf/conf.d

 

3)在conf.d下创建docker.conf配置文件

upstream docker-registry{
server localhost:5000;
}
 
server {
listen 80;
listen 443 ssl;
 
server_name www.lereun.com;
 
charset utf8;
ssl_certificate cert/214501762340334.pem;
ssl_certificate_key cert/214501762340334.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM- SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
 
 
location / {
 
root html;
index index.html;
 
proxy_pass http://docker-registry;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
client_max_body_size 0;
chunked_transfer_encoding on;
}
}

 

这段配置里需要注意的是:

 

1) proxy_pass http://docker-registry; 这里的反向代理,一定要看自己的配置文件nginx.conf,对localhost:5000是否支持https;若不支持那么只能写http://docker-registry; 这个地方弄了好久,一直报502,所以一定要注意

 

2)client_max_body_size 0;#表示客户端连接的最大请求实体大小;为0表示不限制

chunked_transfer_encoding on; #响应时是否启用chunked编码

 

这里是不设置的话,等上传镜像的时候,会报错:

 

docker取证 docker registery_nginx_02

 

4)重启nginx

 

/usr/local/nginx/sbin/nginx -s reload

 

5)测试,使用https访问是可以的

 

docker取证 docker registery_docker取证_03

 

 

二、部署Registry

 

1、先搜索docker的registry镜像,然后拉取下来

 

docker search registry

 

docker取证 docker registery_nginx_04

 

2、拉取registry镜像

 

docker pull docker.io/registry

 

docker取证 docker registery_docker_05

 

3、启动一个容器

 

docker run -v 宿主机目录:容器目录

 

docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry

 

-d 表示后台进程

 

-v /opt/registry:/var/lib/registry registry服务默认会将上传的镜像保存到/var/lib/registry,将该目录挂载到/opt/registry,这样就可以将镜像保存在/opt/registry目录

 

 

docker取证 docker registery_nginx_06

 

 

4、修改镜像的tag

 

docker tag用法:

docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]

 

docker tag centos www.lereun.com/centos

 

docker取证 docker registery_上传_07

 

5、把打了tag的镜像上传到自己的Docker Registry

 

docker push用法:

docker push [OPTIONS] NAME[:TAG]

 

docker push www.lereun.com/centos

 

docker取证 docker registery_docker取证_08

 

可以根据我们挂在的目录查看,里面有已经上传的镜像

 

docker取证 docker registery_上传_09

 

 

6、从另外的客户端测试从自己刚刚搭建的Docker Registry拉取刚刚上传的镜像

 

1)查看仓库中的镜像情况

 

curl www.lereun.com/v2/_catalog

 

docker取证 docker registery_nginx_10

 

2)测试能否拉下来

 

从服务本机拉取:

 

docker取证 docker registery_nginx_11

 

从其他客户端拉取,报这个错:

 

docker取证 docker registery_nginx_12

 

解决办法:修改客户端的配置文件 vim /etc/sysconfig/docker

 

other_args="--insecure-registry www.lereun.com:5000"

 

然后,再一次尝试,就可以了

 

docker取证 docker registery_nginx_13

 

7、其他报错

 

启动的容器的时候如果报错

 

docker取证 docker registery_docker_14

 

看他提示的要把容器的删除,才能启动

 

docker取证 docker registery_docker_15

 

 

三、使用身份验证的功能

       如果是自己公司内部使用的话,前两步基本上可以了,但是我如果放在外网,不做认证措施的话,那么谁都可以下载,谁都可以上传,所以得把身份验证操作加上,这又是一个大坑,花了一个晚上加一个上午的时候

 

1、安装httpd工具

yum -y install httpd-tools

 

2、创建存放密码文件的目录

mkdir /etc/docker/auth

 

3、生成账号密码文件

htpasswd -Bbn username password >> /etc/docker/auth/registry.htpasswd

 

4、启动registry容器,这里在第二部的基础上,需要先把原来的容器删掉再启动

 

先停掉容器、再删除

docker stop 560445a00194
docker rm 560445a00194

docker取证 docker registery_nginx_16

 

 

6、启动registry容器(这一串看着很多,实则很简单,本来我也以为很难,不想看但是最终还是得看,很容易理解很容易理解)

docker run -d -p 5000:5000 --restart=always --name registry \
-v /opt/registry:/var/lib/registry \
-v /etc/docker/auth:/auth \
-e REGISTRY_AUTH=htpasswd \
-e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/registry.htpasswd \
-v /etc/docker/certs.d/registry:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/214501762340334.pem \
-e REGISTRY_HTTP_TLS_KEY=/certs/214501762340334.key \
registry

说明:

1)-v /opt/registry:/var/lib/registry 镜像目录上传的位置挂载

2)-v /etc/docker/auth:/auth 将宿主机的/etc/docker/auth挂载在容器的/auth下

3)-e REGISTRY_AUTH=htpasswd 告诉Registry容器使用htpasswd模式验证

4)-e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" 指定注册中心领域

5)-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/registry.htpasswd 告诉容器账号密码文件的路径,因为把宿主机的目录挂载在容器的目录上了,这样就可以直接访问这个目录里的文件(这句话懂了的话,这段很容易就懂了

6)-v /etc/docker/certs.d/registry:/certs CA认证的目录挂载

7)-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/214501762340334.pem 说明秘钥的路径

8)-e REGISTRY_HTTP_TLS_KEY=/certs/214501762340334.key 说明公钥的路径

 

8、进行push,报错没登录 (这里要注意的是tag的时候要把端口号带上,登录也一样,push也一样,要不然会出现一大堆稀奇古怪的错误

 

 

docker取证 docker registery_nginx_17

 

9:push之前需先login登录

 

 

docker取证 docker registery_nginx_18

 

10)再上传就可以了

 

 

docker取证 docker registery_docker_19

 

上传成功

 

 

docker取证 docker registery_docker取证_20