一、准备工作

1. 安装Docker

详细安装可以查看 Linux安装Docker

2. 创建目录

我们装所有数据都放到/home/registry目录下

mkdir /home/registry
cd /home/registry
mkdir auth conf data db
  • auth:验证目录,存放账号密码文件或证书文件
  • conf:配置文件目录
  • data:仓库数据存放目录
  • db:docker-registry-web数据存放目录,若不安装这个Web管理页面可以忽略

二、安装registry容器

docker run -d \
--name registry-srv \
--restart=always
-v /home/registry/auth:/etc/docker/registry/auth \
-v /home/registry/data:/var/lib/registry/docker/registry \
-v /home/registry/conf/registry-srv.yml:/etc/docker/registry/config.yml:ro \
-p 5000:5000 \
registry   
  • -d:指定 Registry 容器在后台运行;
  • --restart=always:设置开机运行
  • --name registry-srv:指定容器的名称
  • -v:将主机目录或文件映射到容器中;
  • -p:指定 Registry 容器监听的宿主机中的端口号以及在容器中使用的端口号

三、无Web页面使用Basic Realm验证配置

安装web页面,跳过第三步;不安装web页面跳过第四步。

1. 安装htpasswd 工具

  • Ubuntu/Debian
sudo apt install apache2-utils -y
  • CentOS/RHEL
sudo yum install httpd-tools -y
# 创建密码
htpasswd -Bbn username password >/home/registry/auth/htpasswd

# 添加其他账号
htpasswd -Bb /home/registry/auth/htpasswd another_user another_password

# 设置权限
chmod 600 /home/registry/auth/htpasswd
  • 账号密码文件:/home/docker/auth/htpasswd
  • user:账号
  • password:密码

2. 编辑/home/registry/conf/registry-srv.yml配置文件

version: 0.1    
log:
  fields:
    service: registry
storage:
  delete:           # 默认是不能删除的,添加删除支持
    enabled: true
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
 
http:
  addr: :5000   
  
auth:
  htpasswd:
    realm: basic-realm
    path: /etc/docker/registry/auth/htpasswd

3. 重启registry-srv服务使配置生效

docker restart registry-srv

四、安装docker-registry-web使用token验证

1. 生成私钥和证书

openssl req -new -newkey rsa:4096 -days 365 -subj "/CN=localhost" \
        -nodes -x509 -keyout /home/registry/auth/auth.key -out /home/registry/auth/auth.cert

2. 编辑/home/registry/conf/registry-srv.yml配置文件

version: 0.1    
log:
  fields:
    service: registry
storage:
  delete:           # 默认是不能删除的,添加删除支持
    enabled: true
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
 
http:
  addr: :5000   
  
auth:
  token:
    realm: https://dockerhub.zengwu.com.cn/api/auth
    service: localhost:5000
    issuer: 'my issuer'
    rootcertbundle: /etc/docker/registry/auth/auth.cert

3. 重启registry-srv服务使配置生效

docker restart registry-srv

4. 编辑/home/registry/conf/registry-web.yml配置文件

registry:
  # 私有仓库地址.
  url: http://registry-srv:5000/v2
  # 私有仓库命名.
  name: localhost:5000
  # 是否只读设置.
  readonly: false
  auth:
    # 是否进行鉴权处理.
    enabled: true
    # 需要与私有仓库定义的名称一致.
    issuer: 'my issuer'
    # 容器内私钥证书路径,容器启动时通过数据卷参数指定.
    key: /conf/auth.key

5. 安装docker-registry-web

docker run -d \
--name registry-web \
--link registry-srv \
-v /home/registry/conf/registry-web.yml:/conf/config.yml:ro \
-v /home/registry/auth/auth.key:/conf/auth.key \
-v /home/registry/db:/data \
-p 8080:8080 \
hyper/docker-registry-web

五、安装Nginx配置 SSL

  • CentOS 安装 nginx
yum install -y nginx
  • Ubuntu 安装 nginx
apt install -y nginx

配置 vim /etc/nginx/conf.d/dockerhub.conf

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name dockerhub.zengwu.com.cn;
    #ssl on;
    ssl_certificate /etc/nginx/conf.d/key/dockerhub.zengwu.com.cn.pem;
    ssl_certificate_key /etc/nginx/conf.d/key/dockerhub.zengwu.com.cn.key;
    ssl_session_timeout  5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;     #指定SSL服务器端支持的协议版本
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers   on;    #在使用SSLv3和TLS协议时指定服务器的加密算法要优先于客户端的加密算法

    error_page 497 301 =307 https://$host:$server_port$request_uri;

    location /v2/ {
        proxy_pass         http://localhost:5000/v2/;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        #下面这一项设置上传大小。默认设置是5G,有需要自己改。
        client_max_body_size 0;
        proxy_connect_timeout 300s;
        proxy_read_timeout 300s;
        proxy_send_timeout 300s;
        send_timeout 300s;
        #开启websocket 
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Ssl on;
    }
    
    # 如果不安装web页面,这个配置可以不用
    location / {
        proxy_pass         http://localhost:8080;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        client_max_body_size 0;
    }
}

六、使用

找另一台docker测试机

1、 登录

root@zngw:~# docker login dockerhub.zengwu.com.cn
Username: 用户名
Password: 密码
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores

Login Succeeded

2、 查询、推送、拉取镜像

  • 查看镜像仓库
curl -XGET -u 账号:密码 https://dockerhub.zengwu.com.cn/v2/_catalog

输出格式为json,如:

{"repositories":["redis","registry"]}
  • 查看私有仓库镜像的tag
curl -XGET -u 账号:密码 https://dockerhub.zengwu.com.cn/v2/redis/tags/list

输出:

{"name":"redis","tags":["latest"]}
  • 标志镜像
docker tag my-image dockerhub.zengwu.com.cn/my-image
  • 推送镜像
docker push dockerhub.zengwu.com.cn/my-image
  • 拉取镜像
docker pull dockerhub.zengwu.com.cn/my-image

3. web页面访问

输入域名,使用默认账号:admin,默认密码:admin登录,然后进入Users管理账号密码