nexus搭建本地docker仓库

亡羊补牛
亡羊补牛 2019-04-25 10:02
阅读需:0

harbor 1.7.5 的docker容器多达10个,虽然好用,但太占用资源了,nexus3版本就已经支持docker仓库了,而且设置简单,我们就化繁为简,用nexus来搭建我们的docker私服仓库,本文不介绍太多理论知识,只是快速搭建docker私服并提供https访问,更多技术细节可以参考官方文档,网络也有很多详细介绍的文章。

以下以nexus主机IP地址 192.168.1.68 为例,

docker-compose部署方便快捷,挂载本地文件可以选择本地文件夹,也可以创建volume,我习惯创建volume,这样docker部署方便,也方便以后扩展swarm模式或者k8s集群部署,先创建卷:

docker volume create nexus_data

脚本映射了2个端口,8081 提供nexus对外web访问,8082留给docker仓库访问,volumes添加 external: true,这样在删除容器的时候不会删除volume里的本地保存数据,docker-compose脚本如下:


version: '3.7'
services:
  nexus3:
    container_name: nexus3
    hostname: nexus3
    image: sonatype/nexus3
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - nexus_data:/nexus-data
    ports:
      - 8081:8081
      - 8082:8082
    restart: always
    networks:
      - nexus
networks:
   nexus:
     driver: bridge
volumes:
  nexus_data:
    external: true


直接执行:

docker-compose up -d


稍等一会儿,提示 创建容器成功,我们就可以通过IP地址 + 端口号访问 nexus了,默认用户名:admin ,密码:admin123,登录nexus之后,点击 Server Administratoin and Configuration, 点击 Repositories 进入仓库列表页面:



点击 Create Repository 创建仓库:


选择 docker(hosted) 创建本地托管仓库,


必输项有2个地方,Name 仓库名称自定义填写,HTTP Port,因为之前映射了主机的8082,这里我们选中 HTTP项下的复选框,后面文本填写 8082:



然后点击最下面的按钮 Create Repository 创建仓库:




到这里,我们的docker私服就创建完成了,测试一下,因为是http协议访问,要在docker客户端主机上添加注册主机信任,编辑 /etc/docker/daemon.json,没有这个文件就创建一个,如果已经有内容,就按照如下格式添加:

"192.168.1.68:8082"

信任主机地址是一个数组,别忘记结尾的","

{
  "registry-mirrors": [
     "https://ssssssp.mirror.aliyuncs.com"
   ],
   "insecure-registries": [     
     "192.168.1.67",
     "192.168.1.68:8082"
   ]
}


保存,重启docker服务:

systemctl restart docker

客户端登录docker私服,输入用户名和密码,没修改的话就是 admin,admin123:

docker login 192.168.1.68:8082

试一下push和pull是否成功,先随便pull个镜像回来,就nginx吧,然后修改tag,push到我们搭建的docker私服,再pull下来看是否正常:


docker pull nginx                                                                      #docker hub 拉取一个nginx镜像
docker tag nginx:latest 192.168.1.68:8082/nginx:test              #修改tag
docker push  192.168.1.68:8082/nginx:test                              #上传到我们搭建的私服
docker rmi nginx:latest                                                             #删除本地镜像
docker rmi 192.168.1.68:8082/nginx:test                                 #删除本地修改tag的镜像
docker images                                                                          #查看是否删除成功
docker pull  192.168.1.68:8082/nginx:test                               #从我们搭建的私服拉取nginx镜像
docker images                                                                          #查看是否拉取成功


再看看私服上的样子,我们修改tag的nginx镜像成功的上传到了私服:



到此http模式的访问就完成了,可以正常使用了,但现在https是一个趋势,并且非https形式的docker login还需要在客户端的  daemon.json 中添加注册主机信任,这样比较麻烦,我们还是来个方便快捷的nginx反向代理实现https访问 docker私服吧。

实现https访问当然需要ca证书,获取ca证书目前有如下几个途径:


  1. 从ca根证书颁发机构购买,商业应用的话建议直接购买,证书可以有更强大的功能;

  2. 自签证书,证书有效期、域名等都可以随意设置,但部署起来麻烦,所有访问的客户端都需要添加信任,不推荐;

  3. 单域名免费ca证书,可以从阿里云、腾讯云等服务商处免费申请,有效期一年;

  4. letsencrypt 签发的免费ca,可以支持多域名、泛域名,有效期自证书签发之日起90天,可以使用acme.sh脚本自动申请,并自动续期,acme.sh使用文档地址:acme.sh 官方中文说明文档


具体申请证书网上太多文章,自己搜索吧,以下假设申请完毕ca证书,直接贴上nginx 反向代理脚本:

server {
    listen 80;
    server_name docker.域名;  #你的域名
    rewrite ^(.*)$  https://$host$1 permanent;  # 直接跳转https
}
server {
    listen 443 ssl http2; #如果你源码安装没有编译http2 模块,请去掉 http2
    server_name docker.域名;  #你的域名
    ssl_certificate cert/fullchain.cer;
    ssl_certificate_key cert/你的域名.key;
    ssl_trusted_certificate  cert/ca.cer;
    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    access_log logs/你的域名.cn.log;
    error_log logs/你的域名.err.log;
    location / {
        proxy_pass http://192.168.1.68:8082;
    } 
}
server {
    listen 80;
    server_name nexus.域名;  #你的域名
    rewrite ^(.*)$  https://$host$1 permanent;  # 直接跳转https
}
server {
    listen 443 ssl http2; #如果你源码安装没有编译http2 模块,请去掉 http2
    server_name nexus.域名;  #你的域名
    ssl_certificate cert/fullchain.cer;
    ssl_certificate_key cert/你的域名.key;
    ssl_trusted_certificate  cert/ca.cer;
    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    access_log logs/你的域名.cn.log;
    error_log logs/你的域名.err.log;
    location / {
        proxy_pass http://192.168.1.68:8081;
    } 
}


然后重新载入nginx 配置:

nginx -t          #测试配置文件是否正确
service nginx forece-reload   #重新加载配置文件,nginx 1.16版本之后支持 ssl证书动态加载,可以参考具体更新说明


现在我们就可以通过我们的域名用https访问 docker私服和 nexus服务了,daemon.json也不用添加注册主机信任,docker镜像也不用添加个端口号的尾巴了,再测试下https拉取镜像,就变成了以下这样子:

docker pull nginx                                                                      #docker hub 拉取一个nginx镜像
docker tag nginx:latest domain.com/nginx:test              #修改tag
docker push  domain.com/nginx:test                              #上传到我们搭建的私服
docker rmi nginx:latest                                                             #删除本地镜像
docker rmi domain.com/nginx:test                                 #删除本地修改tag的镜像
docker images                                                                          #查看是否删除成功
docker pull  domain.com/nginx:test                               #从我们搭建的私服拉取nginx镜像
docker images

一切都安静了。。

评论
  • admin
    2019-04-25 10:09
    666
    6 回复
  • 单调路过
    2019-04-25 16:17
    前面再来一个docker搭建安装 就配套了 小白都可以上手了 不用再另外找了
    5 回复