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证书目前有如下几个途径:
从ca根证书颁发机构购买,商业应用的话建议直接购买,证书可以有更强大的功能;
自签证书,证书有效期、域名等都可以随意设置,但部署起来麻烦,所有访问的客户端都需要添加信任,不推荐;
单域名免费ca证书,可以从阿里云、腾讯云等服务商处免费申请,有效期一年;
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
一切都安静了。。
扫一扫访问 Blade技术社区 移动端