目的:用Nexus搭建一个docker私有仓库(栈类型为hosted),实现自建镜像的上推下载。
背景:后台架构升级相关,没有运维只能get my hands dirty…
具体配置:
节点一(假设为example.com):
安装运行Nexus 3:这个直接使用了sonatype/nexus3 镜像。
登陆Nexus控制台admin页面,新建Docker (hosted)栈:Repository Connector 选HTTP并填写系统空闲端口、假设为10001(用docker时要记得将这个端口也一并开放)。
节点二(假设为proxy.com):
准备证书:证书的host应该是docker push/pull时使用的域名,proxy情况下是Nginx节点而不是Nexus节点。有认证的就最好,但目前只是测试所以用的是自签名的,生成操作如下:
先参考了Sonatype Knowledge Base的这篇Using Self-Signed Certificates with Nexus Repository Manager and Docker Daemon,生成创建java keystore文件;
然后参考了这个SE提问导出证书和密钥文件,假设命名成:proxy.com.cert 和 proxy.com.key(只是清楚起见)。
其实self-signed证书应该是可以用openssl直接生成的,只是开始时先试了Nexus直接暴露ssl端口的方法、就按上面的教程往后走了(ssl这块还是有太多不了解的…….)。安装运行Nginx:Nginx需要启用https模块,下载src包configure的话可以参考这篇文章:
./configure --with-http_ssl_module --with-openssl={openssl的源码文件夹位置}
用docker/nginx的话至少tag alpine的就已经有引入。
增加Nginx反向代理:
server { listen 1234 ssl; # 假设1234端口未占用 server_name proxy.com; ssl_certificate /path/to/proxy.com.crt; ssl_certificate_key /path/to/proxy.com.key; location / { proxy_pass http://example.com:10001; # 前面设置的port } client_max_body_size 100M; }
Nginx默认
client_max_body_size
只有1M,调大目的是支持镜像上推,避免client intended to send too large chunked body
错误。
节点三/开发环境等:
安装运行docker:按官方文档照做就行。
自签名证书的话,需要添加docker信任:参考Insecure Registry的说明步骤、将前面的proxy.com.crt放至相应的
/etc/docker/certs.d/proxy.com:1234
文件夹下并重命名成ca.crt
,**无需重启**docker。验证使用:这个可以参考Nexus文档的10.7节往后,例如:
docker login proxy.com:1234 # 输入nexus登入账号 docker tag hello-world:latest proxy.com:1234/hello-world:latest docker push proxy.com:1234/hello-world:latest docker pull proxy.com:1234/hello-world:latest
其他:
用Nexus而不是Docker Registry/Docker Hub?
其实开始时并不知道Docker Registry,然后boss说他们以前就用Nexus挺好用,再加上前面刚搭好maven私有栈的惯性,再看到Nexus3官方说明书提到的一些好处…..总之三方工具可能更方便快速使用,原生框架可能更有助于技术学习,看实际需求吧。用Nginx proxy而不是Nexus HTTPS Connector?
实际试下来确实是反向代理更清晰灵活(Using A Reverse Proxy Server小节的There are a few advantages….),然后在“了解Nginx https配置是很有必要的”前提下、proxy方式用页面创建完栈就好、无需修改Nexus具体配置文件、显得更加简便。