文档章节

docker registry nginx 安全访问控制

 雪地花露
发布于 2015/12/02 17:48
字数 1021
阅读 545
收藏 2
点赞 0
评论 0

系统环境准备

centos7 

[root@docker-130 etc]# docker -v

Docker version 1.9.1, build a34a1d5

nginx 版本需要1.7.5以后的,因为需要一个add_header功能,我这里用的1.9

registry 2.1.1

安装部署

192.168.10.130 

192.168.10.128

nginx 和 registry都是跑在容器里面 宿主机为 192.168.10.130

首先启动一个registry容器,保证registry功能正常,

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

修改docker配置文件 /etc/sysconfig/docker 在需要从registry服务器下载image的客户端

添加参数

OPTIONS= '--insecure-registry 192.168.10.130:5000',这个参数后面的client试验中可加可不加,服务器需要加

docker pull 和push没有问题,在看后面的

然后启动一个nginx容器,

docker run -d --name nginx --link registry:registry -p 443:443 -v /data/etc:/tmp nginx:1.9

这里使用-v的原因是从官网下载的镜像所起的容器是不让修改内容的,所以可以把需要修改的文件移动到/tmp中,修改好后再cp回去,这里也可以使用docker cp命令

如果不准备为此花钱去购买一个SSL密钥,可以使用自己授权的 SSL key让registry支持HTTPS加密访问。
生成SSL证书只要两行命令,将signdomain的值换成实际域名即可

在nginx容器中执行

signdomain=registry.example.com

openssl req -nodes \

-subj "/C=CN/ST=BeiJing/L=Dongcheng/CN=$signdomain" \

-newkey rsa:4096 -keyout $signdomain.key -out $signdomain.csr

然后再执行

openssl x509 -req -days 3650 -in $signdomain.csr -signkey $signdomain.key -out $signdomain.crt

把生成的key和crt文件配给nginx就可以提供https访问了,只是因为是没有权威认证的自签名证书

创建授权用户,第一次需要加-c参数

#htpasswd -c /etc/nginx/docker-registry.htpasswd sun

New password:
Re-type new password:
Adding password for user sun

修改nginx.conf

添加

upstream docker-registry {

    server 192.168.10.130:5000;

}

修改vhost里的default.conf

server {
 listen 443;
 server_name registry.example.com; ##这里如果要用域名,就得在/etc/hosts中添加相应的解析
 ssl on;
 ssl_certificate /etc/ssl/certs/registry.example.com.crt;
 ssl_certificate_key /etc/ssl/private/registry.example.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 (https://github.com/dotcloud/docker/issues/1486)
 chunked_transfer_encoding on;
 add_header 'Docker-Distribution-Api-Version' 'registry/2.0' always; 
 location / {
     # let Nginx know about our auth file
     auth_basic              "Restricted";
     auth_basic_user_file    docker-registry.htpasswd;
     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;
}
 location /_ping {
     auth_basic off;
     proxy_pass http://docker-registry;
 }
 location /v2/_ping {
     auth_basic off;
     proxy_pass http://docker-registry;
 }
}

修改好后记得重启nginx服务

此时我们在192.168.10.128去访问

curl -i -k https://sun:123456@registry.example.com:443/v2/_catalog

HTTP/1.1 200 OK

Server: nginx/1.9.4

Date: Wed, 02 Dec 2015 09:18:36 GMT

Content-Type: application/json; charset=utf-8

Content-Length: 46

Connection: keep-alive

Docker-Distribution-Api-Version: registry/2.0

Docker-Distribution-Api-Version: registry/2.0


{"repositories":["lashou/centos","v2/swarm"]}

然后我们去登录

因为没有权威认证的自签名证书,使用docker longin 访问时会提示下面的错误:

docker pull docker.webmaster.me/centos:centos6
Error: Invalid registry endpoint https://docker.webmaster.me/v1/: Get https://docker.webmaster.me/v1/_ping: x509: certificate signed by unknown authority. If this private registry supports only HTTP or HTTPS with an unknown CA certificate, please add `--insecure-registry docker.webmaster.me` to the daemon's arguments. In the case of HTTPS, if you have access to the registry's CA certificate, no need for the flag; simply place the CA certificate at /etc/docker/certs.d/docker.webmaster.me/ca.crt

根据提示把我们之前生的.crt 文件放在/etc/docker/certs.d/docker.webmaster.me/ 下,这里的路径要根据提示写

如果还没有解决这个问题

那我们就需要执行  cat $signdomain.crt >> /etc/pki/tls/certs/ca-bundle.crt

 Error response from daemon: Login: 404 page not found
 (Code: 404; Headers: map[Server:[nginx/1.8.0] Date:[Thu, 03 Dec 2015 10:52:03 GMT] Content-Type:[text/plain; charset=utf-8] Content-Length:[19] Connection:[keep-alive] Docker-Distribution-Api-Version:[registry/2.0]])

如果报这个错,就需要在nginx配置文件里加上add-header 

这是正确登录后的返回信息
[root@docker-128 ~]# docker login registry.example.com:443
Username (sun): sun
WARNING: login credentials saved in /root/.docker/config.json
Login Succeeded

在config.json文件中记载了登录用户的信息

到这里我们做的加密认证功能已经实现了,可是有一个问题,那就是我们还可以通过原来的方式访问registry仓库

这里需要做iptables设置,但是后来我咨询别人,说不需要这样,所以我也没有加。目前先这样


© 著作权归作者所有

共有 人打赏支持
粉丝 6
博文 62
码字总数 35317
作品 0
朝阳
系统管理员
Docker 镜像及Docker仓库配置 [四]

Docker 镜像及Docker仓库配置 [四] Docker 镜像及Docker仓库配置 [四] 一、Docker 镜像介绍 Docker镜像构建分为两种,一种是,另一种是Dockerfile() Docker镜像手动构建案例: 我们基于镜像...

Abcdocker
06/26
0
0
在 ubuntu 搭建需要签名认证的私有 docker registry 仓库

前言 在前面的一篇博客《在 ubuntu 搭建 docker registry 私有仓库》介绍了一种简单的搭建 docker 私有仓库了的方法。但是当时使用的是修改“--insecure-registry”参数的办法,这种办法在局...

hello_cjq
02/23
0
0
Harbor仓库介绍与搭建过程

一:介绍 Harbor,是一个英文单词,意思是港湾,港湾是干什么的呢,就是停放货物的,而货物呢,是装在集装箱中的,说到集装箱,就不得不提到Docker容器,因为docker容器的技术正是借鉴了集装...

腿快抖断了
05/18
0
0
知乎十万级容器规模的分布式镜像仓库实践

知乎在 2016 年已经完成了全量业务的容器化,并在自研容器平台上以原生镜像的方式部署和运行,并在后续陆续实施了 CI、Cron、Kafka、HAProxy、HBase、Twemproxy 等系列核心服务和基础组件的容...

云学习小组
07/05
0
0
企业级 Docker Registry--harbor安装和简单使用

1.什么是harbor 简单的说,Harbor 是一个企业级的 Docker Registry,可以实现 images 的私有存储和日志统计权限控制等功能,并支持创建多项目(Harbor 提出的概念),基于官方 Registry V2 实现...

双月通天
2016/06/28
2.2K
0
Docker Registry企业级私有镜像仓库Harbor管理WEB UI, 可能是最详细的部署

摘要:是公司开源的企业级项目,其目标是帮助用户迅速搭建一个企业级的服务。 它以公司开源的为基础,提供了管理,基于角色的访问控制(),集成、以及审计日志() 等企业用户需求的功能,通过添...

souyunku
01/08
0
0
企业级容器Registry开源项目Harbor架构简介

企业级容器Registry开源项目Harbor架构简介 作者:姜坦 张海宁 (本文作者为Harbor项目组核心成员,于2016年9月5日作了更新。) 1. Harbor项目 VMware公司最近开源了企业级Registry项目Harbo...

project_harbor
2016/03/31
3K
4
使用harbor配置docker registry

前面连说了几篇与kubernetes相关的内容,这篇我们来说说docker registry。docker的registry与kubernetes本身并没有太直接的关系。但是任何使用到docker的地方,总少不了这玩艺儿。所以这篇博...

msj0905
06/27
0
0
构建docker高可用私有仓库基于Harbor开源系统

操作系统及相关软件版本说明: 测试服务器IP地址: IP 1 = 192.168.85.158,简称A仓库 IP 2 = 192.168.85.157,简称B仓库 一、Harbor项目介绍 1、Harbor来源 VMware公司最近开源了企业级Reg...

msj0905
06/27
0
0
Docker 学习笔记(二) Docker实战之Registry以及持续集成

学习资料 Git https://git.oschina.net/dockerf/second fork一下 视频 http://study.163.com/course/courseLearn.htm?courseId=1273002#/learn/video?lessonId=1515025&courseId=1273002 Do......

vincent927
2016/04/17
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

代码生成利器:IDEA 强大的 Live Templates

代码生成利器:IDEA 强大的 Live Templates

qwfys
18分钟前
1
0
spring boot使用通用mapper(tk.mapper) ,id自增和回显等问题

最近项目使用到tk.mapper设置id自增,数据库是mysql。在使用通用mapper主键生成过程中有一些问题,在总结一下。 1、UUID生成方式-字符串主键 在主键上增加注解 @Id @GeneratedValue...

北岩
21分钟前
0
0
告警系统邮件引擎、运行告警系统

告警系统邮件引擎 cd mail vim mail.py #!/usr/bin/env python#-*- coding: UTF-8 -*-import os,sysreload(sys)sys.setdefaultencoding('utf8')import getoptimport smtplibfr......

Zhouliang6
24分钟前
0
0
日常运维--rsync同步工具

rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而...

chencheng-linux
28分钟前
1
0
Java工具类—随机数

Java中常用的生成随机数有Math.random()方法及java.util.Random类.但他们生成的随机数都是伪随机的. Math.radom()方法 在jdk1.8的Math类中可以看到,Math.random()方法实际上就是调用Random类...

PrivateO2
40分钟前
1
0
关于java内存模型、并发编程的好文

Java并发编程:volatile关键字解析    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在...

DannyCoder
昨天
0
0
dubbo @Reference retries 重试次数 一个坑

在代码一中设置 成retries=0,也就是调用超时不用重试,结果DEBUG的时候总是重试,不是0吗,0就不用重试啊。为什么还是调用了多次呢? 结果在网上看到 这篇文章才明白 https://www.cnblogs....

奋斗的小牛
昨天
0
0
数据结构与算法3

要抓紧喽~~~~~~~放羊的孩纸回来喽 LowArray类和LowArrayApp类 程序将一个普通的Java数组封装在LowArray类中。类中的数组隐藏了起来,它是私有的,所以只有类自己的方法才能访问他。 LowArray...

沉迷于编程的小菜菜
昨天
0
0
spring boot应用测试框架介绍

一、spring boot应用测试存在的问题 官方提供的测试框架spring-boot-test-starter,虽然提供了很多功能(junit、spring test、assertj、hamcrest、mockito、jsonassert、jsonpath),但是在数...

yangjianzhou
昨天
0
0
rsync工具介绍/rsync通过ssh同步

rsync工具介绍 数据备份是必不可少,在Linux系统下数据备份的工具很多,其中重点介绍就是rsync工具,rsync不仅可以远程同步数据,还可以本地同步数据,且不会覆盖以前的数据在已经存在的数据...

Hi_Yolks
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部