使用 Docker 官方的 Registry 创建的仓库面临一些维护问题。比如某些镜像删除以后空间默认是不会回收的,需要一些命令去回收空间然后重启 Registry 程序。在企业中把内部的一些工具包放入 Nexus 中是比较常见的做法,最新版本 Nexus3.x 全面支持 Docker 的私有镜像。所以使用 Nexus3.x 一个软件来管理 Docker , Maven , Yum , PyPI 等是一个明智的选择。

1、启动 Nexus 容器

  1. $ docker run -d --name nexus3 --restart=always \
  2. -p 8081:8081 \
  3. -p 8082:8082 \
  4. -p 8083:8083 \
  5. --mount src=nexus-data,target=/nexus-data \
  6. sonatype/nexus3

这里配置了3个端口,是为后续做准备,如果只是为了启动浏览,启动一个8081即可:

  1. $ docker run -d --name nexus3 --restart=always \
  2. -p 8081:8081 \
  3. --mount src=nexus-data,target=/nexus-data \
  4. sonatype/nexus3

image.png
等待 3-5 分钟,如果 nexus3 容器没有异常退出,那么你可以使用浏览器打开 http://YourIP:8081 访问 Nexus 了。
第一次启动 Nexus 的默认帐号是 admin 密码在容器内部 的 /nexus-data/admin.password
image.png

登录Nexus 3 后,进行相关安全性配置

  1. 设定新密码
    image.png
  2. 关闭匿名访问。启用匿名访问意味着默认情况下,用户可以在没有凭据的情况下从存储库搜索,浏览和下载组件。 请考虑对您的组织的安全隐患。禁用匿名访问应谨慎选择,因为它将需要所有用户和/或构建工具的凭据
    image.png
  3. 完成配置
    image.png

    2、创建 Hosted类型 Docker 仓库

创建一个私有仓库的方法: 设置->Repositories 点击左上角 Create repository 选择 docker (hosted)

  1. 创建 Blog Stores
    image.png
  2. 创建 Hosted 类型的 Docker 仓库
    image.png
    image.png
    Storage配置:
    image.png
  • Name: 仓库的名称
  • HTTP: 仓库单独的访问端口
  • Enable Docker V1 API: 如果需要同时支持 V1 版本请勾选此项(不建议勾选)。
  • Hosted -> Deployment pollcy: 请选择 Allow redeploy 否则无法上传 Docker 镜像。

在/etc/docker/daemon.json 文件中加上私有仓库的地址:

  1. {
  2. "registry-mirrors": ["https://z1h5tgiv.mirror.aliyuncs.com"],
  3. "insecure-registries": ["192.168.22.3:8082","192.168.22.3:8083"]
  4. }

刷新配置,重启 docker:

  1. $ systemctl daemon-reload
  2. $ systemctl restart docker.service

其它的仓库创建方法请各位自己摸索,还可以创建一个 docker (proxy) 类型的仓库链接到 DockerHub 上。再创建一个 docker (group) 类型的仓库把刚才的 hosted 与 proxy 添加在一起。主机在访问的时候默认下载私有仓库中的镜像,如果没有将链接到 DockerHub 中下载并缓存到 Nexus 中。

3、添加访问权限

菜单 Security->Realms 把 Docker Bearer Token Realm 移到右边的框中保存。

添加用户规则:菜单 Security->Roles->Create rolePrivlleges 选项搜索 docker 把相应的规则移动到右边的框中然后保存。

添加用户:菜单 Security->Users->Create local userRoles 选项中选中刚才创建的规则移动到右边的窗口保存。

登录测试:

  1. $ docker login -u admin -p 你的密码 192.168.22.3:8082
  2. WARNING! Using --password via the CLI is insecure. Use --password-stdin.
  3. WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
  4. Configure a credential helper to remove this warning. See
  5. https://docs.docker.com/engine/reference/commandline/login/#credentials-store
  6. Login Succeeded

4、创建 Proxy 类型 Docker 仓库

上面我们只是配置了docker(host),这个相当于我们的私有仓库,但是我们现在使用docker login 我们自己的仓库,如果我们需要的镜像我们仓库没有,就会很麻烦,需要重新登录到公共仓库上下载下来,再上传到我们的私有仓库,那有没有办法可以一步到位呢?

上面我们已经配置好了私有仓库的不用动,下面我们来配置代理仓库 docker(proxy):

  1. 创建 docker(proxy)
    image.png
    image.png
    Proxy 配置:Docker Hub 的URL:https://registry-1.docker.io (https://registry-1.docker.io)
    image.png
    Storage 配置:
    image.png

5、创建 Group 类型 Docker 仓库

Group类型的docker仓库,是一个聚合类型的仓库。它可以将前面我们创建的3个仓库聚合成一个URL对外提供服务,可以屏蔽后端的差异性,实现类似透明代理的功能。

  1. 创建 Group Docker
    image.png
    image.png
    Storage、Group 配置:
    image.png