docker registry v2 ssl 环境搭建

先说下为什么要写这篇文章

因为 docker registry 认证机制特别重要,如果没有认证机制,任由任何用户 push pull 也是比较尴尬的一件事,不仅浪费带宽,而且说不定还会遭遇恶意 push 操作,所以该篇博客主要介绍docker registry 操作之前的认证过程, 通过 nginx 做一个反向代理及 ssl 证书和登录认证

去年有搭建过 docker registry v1 版本,不过 registry v2 之后发生了点变化,所以又折腾了下,在此记录步骤

这边我主要说下 nginx-registry ssl 代理配置

一、准备基础镜像 centos7

docker 官网下载 image 实在太慢了,所以我一般下载都是通过 daocloud 的hub来下载的,地址 https://hub.daocloud.io/

docker 下载命令:
docker pull daocloud.io/centos:7


二、准备定制 centos7-nginx-registry

我个人倾向于自己通过 centos7 基础镜像之上再进行 Dockerfile 来完成其他镜像,感觉可定制化比较高

所以我的 centos7-nginx-registry 镜像是将所有需要的东西全都 COPY 进去

2、安装nginx

你可以先编译生成 nginx,certs 证书文件,nginx.conf 配置文件,htpasswd.txt 认证文件。我们先一步一步来做吧

下载 nginx http://nginx.org/en/download.html,并且 ./configure 的时候启用ssl功能,接着 make && make install 即可

3、编辑 nginx 配置

我直接在下图中贴出配置

[root@centos7-200 nginx]# cat docker.wanglei.net.conf 
upstream docker.wanglei.net {
    server 192.168.151.200:5000;
}

server {
    listen 443;
    server_name docker.wanglei.com;

    ssl on;
    ssl_certificate /usr/local/nginx/certs/docker.wanglei.net.crt;
    ssl_certificate_key /usr/local/nginx/certs/docker.wanglei.net.key;

    proxy_set_header Host       $http_host;
    proxy_set_header X-Real-IP  $remote_addr;
    client_max_body_size 0; # disable any limits to avoid HTTP 413 for large image uploads
    chunked_transfer_encoding on;
    add_header 'Docker-Distribution-Api-Version' 'registry/2.0' always; 

    location / {
        auth_basic              "Restricted";
        auth_basic_user_file    /usr/local/nginx/auth/htpasswd.txt;
        proxy_pass http://docker.wanglei.net;
        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.wanglei.net;
    }

    location /v2/_ping {
        auth_basic off;
        proxy_pass http://docker.wanglei.net;
    }

    location /v2/_catalog {
        auth_basic off;
        proxy_pass http://docker.wanglei.net;
    }

}

4、生成 ssl 证书文件

1) 生成私钥文件
mkdir -p /usr/local/nginx/certs/
cd /usr/local/nginx/certs/
openssl genrsa -out docker.wanglei.net.key 2048

2) 生成根证书文件
openssl req -newkey rsa:2048 -nodes -keyout docker.wanglei.Net.key -x509 -days 3650 -out docker.wanglei.net.pem -subj “/C=CN/ST=state/L=city/O=xxx/OU=docker.wanglei.net3) 下面将pem编码格式的证书转换成crt扩展名证书,放到系统证书目录(用户访问registry之前需要这一步)
cat docker.wanglei.net.pem | tee -a /etc/ssl/certs/docker.wanglei.net.crt

5、生成用户认证文件

mkdir -p /usr/local/nginx/auth/
cd /usr/local/nginx/auth/
htpasswd -c htpasswd.txt wanglei

三、定制 centos7-nginx-registey 镜像

前面关于 nginx 的配置都已经差不多了,那么接下来准备 Dockerfile 来定制镜像

cat Dockerfile

FROM centos7:latest

ENV nginx_path /usr/local/nginx

RUN yum -y install supervisor
RUN mkdir -p /root/.ssh
RUN mkdir -p $nginx_path/auth
RUN mkdir -p $nginx_path/conf/vhost
RUN echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDihpDzUoq3xIPOg+2GZfLpCIh+JCVXeYOTFsTCx+qh0Q+6kJ8BacjEzLvIDkuQXDi9r5uFxrAi5Ao6ZPPQgNyk4M2SCDrMWH/+NNxSz4QjRLrHh55l99A7D1IEgVTiBDGo23Xlv9P5qJSEyWE65JKI3hu86v7YR/cNLeszjaZr0gbmLQ9ID4RNSKbj6ez4RotEgq/QAYJNA5VBJ/7oBpqW7KRLIBjHF8pAizAlCndp87gMbXqaRAMDdNkS00mJVFGSdbixClrSnMzHoMnwVIANR6vnMMhQIfzuMEyYnxddDn1lJdaVg49hNOayv0cJdubMDQVdG4BS8w5Z4Ju8RKj3" >> /root/.ssh/authorized_keys

COPY nginx $nginx_path
COPY certs $nginx_path/certs
COPY docker.wanglei.net.conf $nginx_path/conf/vhost/docker.wanglei.net.conf 
COPY nginx.conf $nginx_path/conf/nginx.conf
COPY htpasswd.txt $nginx_path/auth/htpasswd.txt
COPY supervisor.conf /etc/supervisord.conf

EXPOSE 22 80 443

CMD ["/usr/bin/supervisord"]

细心的同学会发现我 Dockerfile 中有 COPY supervisor.conf 和 yum -y install supervisor 参数

对supervisor 有兴趣的可以去这边看看:http://wiki.jikexueyuan.com/project/docker-technology-and-combat/supervisor.html

然后这里再贴一下 supervisor.conf 配置

[root@centos7-200 nginx]# cat supervisor.conf 

[supervisord]
nodaemon = true
childlogdir = /tmp
logfile = /tmp/supervisord.log
pidfile = /tmp/supervisord.pid

[program:sshd]
command = /usr/sbin/sshd -D

[program:crond]
command = /usr/sbin/crond -n

[program:nginx]
command = /usr/local/nginx/sbin/nginx

开始构建镜像

docker build -t centos7-nginx-registry .

接着在 run 起来就可以啦

docker run \
       -d \
       -p 224:22 \
       -p 80:80 \
       -p 443:443 \
       --name nginx-registry \
       --restart always \
       -e TZ=Asia/Shanghai \
       centos7-nginx-registry

那现在呢,nginx ssl 代理已经准备完成,这时候你再 run 一个 registry ,映射 5000 端口, 之后命令进行 docker login docker.wanglei.net 即可登录,只要域名可以成功解析或者说在/etc/hosts中添加主机记录。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值