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

因为 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中添加主机记录。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐