Centos7 搭建Docker V2 支持SSL认证


 系统环境:

版本:CentOS Linux release 7.2.1511 (Core)  64位
PIP:pip 8.1.2
Docker版本:1.11.2
Docker-compose 版本:1.7.0rc1
 

实验机器:

主机名                   IP地址                 用途
test.registry.com 192.168.18.54         Docker 仓库
docker                 192.168.18.51         Docker客户端
 
备注:
仓库主机名配置为域名方便下面创建SSL认证,如果没有DNS解析就直接在/etc/hosts文件添加解析即可。
 

1、添加Docker官方源;

 

  1. cat /etc/yum.repos.d/docker.repo<<EOF 
  2. [dockerrepo] 
  3. name=Docker Repository 
  4. baseurl=https://yum.dockerproject.org/repo/main/centos/7/ 
  5. enabled=1 
  6. gpgcheck=1 
  7. gpgkey=https://yum.dockerproject.org/gpg 
  8. EOF 

2、yum方式安装Docker

  1. yum install docker-engine -y 
  2.  
  3. 配置开机启动: 
  4. systemctl enable docker 

3、安装Docker-compose

Docker-compose是一个非常有用的Docker运行,管理的工具。你可以通过定义compose文件,使用简单的一条命令同时起多个Docker Container运行不同的服务。Docker-compose对于开发,测试,环境保存以及CI都提供了非常大的便利。

Docker-compose是用Python开发的一个工具,所以可以用pip直接安装。

由于Centos7 自带的pip版本有点低,所以要升级一下,不然会报错或无法安装上docker-compose。

  1. pip install --upgrade pip 
  2. pip install docker-compose 

4、创建一个工作目录用来存放相关配置:

  1. mkdir -p /data/docker/{nginx,data}  

进入目录:cd /data/docker

  1. cat >docker-compose.yml<<EOF 
  2. nginx:   
  3.   image: "nginx:1.9"                    #使用nginx:1.9的镜像 
  4.   ports:   
  5.     - 443:443   
  6.   links:   
  7.     - registry:registry                     #连接一个容器 
  8.   volumes:   
  9.     - /data/docker/nginx:/etc/nginx/conf.d  
  10. registry:   
  11.   image: registry:2.2                   #使用registry:2.2镜像 
  12.   ports:   
  13.     - 127.0.0.1:5000:5000               #此处如果加上了127.0.0.1只允许本地连接5000端口; 
  14.   environment:   
  15.     REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data   
  16.   volumes:   
  17.     - /opt/docker/data:/data 
  18.  
  19. EOF 

#说明:

此配置文件定义了两个Container; 

一个名为nginx使用镜像为:nginx:1.9;映射了443端口到宿主机上,同时连接了另一个容器registry;

并挂载了一个数据卷目录为:/data/docker/nginx挂载到容器中的/etc/nginx/conf.d 目录;

 

另一个名为registry使用的镜像为:registry:2.2;映射了端口5000到宿主机,并定义了镜像的存储位置:/data

【此目录为容器内的目录】;挂载一个数据卷:/data/docker/data到容器的/data目录;

5、进入nginx目录添加nginx的配置文件:【最终配置】

  1. cat >registry.conf <<EOF 
  2.  
  3. upstream docker-registry {   
  4.   server registry:5000;   
  5. }   
  6.  
  7. server {   
  8.   listen 443;   
  9.   server_name localhost;   
  10.  
  11.   # SSL   
  12.    ssl on;   
  13.    ssl_certificate /etc/nginx/conf.d/domain.crt;   
  14.    ssl_certificate_key /etc/nginx/conf.d/domain.key;   
  15.  
  16.   client_max_body_size 0;   
  17.  
  18.   chunked_transfer_encoding on;   
  19.  
  20.   location /v2/ {   
  21.     # Do not allow connections from docker 1.5 and earlier   
  22.     # docker pre-1.6.0 did not properly set the user agent on ping, catch "Go *" user agents   
  23.     if ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*$" ) {   
  24.       return 404;   
  25.     }   
  26.  
  27.     # To add basic authentication to v2 use auth_basic setting plus add_header   
  28.      auth_basic "registry.localhost";   
  29.      auth_basic_user_file /etc/nginx/conf.d/registry.password;   
  30.      add_header 'Docker-Distribution-Api-Version' 'registry/2.2' always;   
  31.  
  32.     proxy_pass                          http://docker-registry;   
  33.     proxy_set_header  Host              $http_host;   # required for docker client's sake   
  34.     proxy_set_header  X-Real-IP         $remote_addr; # pass on real client's IP   
  35.     proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;   
  36.     proxy_set_header  X-Forwarded-Proto $scheme;   
  37.     proxy_read_timeout                  600;   
  38.   }   
  39.  
  40.  
  41. EOF 

完成上面后可以直接测试一下:

cd /data/docker 【在docker-compose.yml配置文件目录下】

 启动容器:

  1. docker-compose up 

docker ps -a  可以看到两个容器已经在运行了,如果你没有配置文件中的镜像就会自动下载,很慢的。

#如果执行下面命令都是返回{},说明正常;但是此时未没有启动SSL认证;

curl http://localhost:5000/v2/ 

curl http://localhost:443/v2/ 

 

#添加用户名和密码,用于SSL登陆认证时使用;

默认系统没有安装:htpasswd

  1. yum install httpd-tools -y 

在/data/docker/nginx目录下执行下面命令创建用户名和密码;-c选项只创建一个用户。

  1. htpasswd -c registry.password docker 

然后修改Registry.conf文件,取消下面三行的注释。【分解步骤】

  1. auth_basic "registry.localhost";   
  2.  
  3. auth_basic_user_file /etc/nginx/conf.d/registry.password;   
  4.  
  5. add_header 'Docker-Distribution-Api-Version' 'registry/2.2' always; 

加入SSL验证

如果你有经过认证机构认证的证书,则直接使用将证书放入nginx目录下即可。如果没有,则使用openssl创建自己的证书。

进行/opt/docker/nginx目录

设置环境变量:localdomain=test.registry.com

生成根证书:

  1. openssl req -nodes -subj "/C=CN/ST=GuangDong/L=DongGuan/CN=$localdomain" -newkey rsa:2048 -keyout $localdomain.key -out $localdomain.csr 
  2.  
  3. openssl x509 -req -days 3650 -in $localdomain.csr -signkey $localdomain.key -out $localdomain.crt 

运行Registry

执行docker-compose up -d 在后台运行Registry,并使用curl验证结果。

客户端测试上传镜像:

安装ca-certificates包:

  1. [root@docker ~]# yum install ca-certificates 

使能动态CA配置功能

  1. update-ca-trust force-enable 

将key拷贝到/etc/pki/ca-trust/source/anchors/

【此步在Registry上把文件传过来】

  1. scp test.registry.com.crt 192.168.18.51:/etc/pki/ca-trust/source/anchors/ 

 

使新拷贝的证书生效

  1. update-ca-trust extract 

证书拷贝后,需要重启docker以保证docker能使用新的证书

  1. service docker restart 

 

 

需要在/etc/hosts文件中添加域名解析:

  1. echo "test.registry.com   192.168.18.54" >>/etc/hosts 

客户端SSL登陆到仓库:

客户端上传镜像:

 

 

查看仓库上java镜像列表:【会要求输入用户名和密码】

 

命令行下查看方法:

 

 

 


#查看仓库中保存的镜像:

方法一:【5000端口】

  1. [root@test nginx]# curl test.registry.com:5000/v2/_catalog 
  2.  
  3. {"repositories":["java","registry"]} 
  4.  
  5. WEB查看: 
  6.  
  7. http://test.registry.com:5000/v2/_catalog 

 

方法二:【SSL认证】

  1. [root@test nginx]# curl -k https://docker:123456@test.registry.com:443/v2/_catalog 
  2.  
  3. {"repositories":["java","registry"]} 

#说明仓库中保存了两个镜像:java和registry

 

#查看仓库中镜像有哪几个版本:

 

  1. http://test.registry.com:5000/v2/registry/tags/list 
  2.  
  3. [root@test nginx]# curl test.registry.com:5000/v2/registry/tags/list 
  4.  
  5. {"name":"registry","tags":["latest","v3"]} 
  6.  
  7. [root@test nginx]# curl -k https://docker:123456@test.registry.com:443/v2/registry/tags/list 
  8.  
  9. {"name":"registry","tags":["latest","v3"]} 

 

#查看仓库中镜像的详细信息:

  1. curl http://test.registry.com:5000/v2/registry/manifests/v3 

#registry:为镜像名

#v3:为该镜像的版本号