如何更好地管理我们团队的各种仓库呢?
使用 Docker 官方的 Registry 创建的仓库面临一些维护问题。比如某些镜像删除以后空间默认是不会回收的,需要一些命令去回收空间然后重启 Registry 程序。在企业中把内部的一些工具包放入 Nexus 中是比较常见的做法,最新版本 Nexus3.x 全面支持 Docker 的私有镜像。所以使用 Nexus3.x 一个软件来管理 Docker , Maven , Yum , PyPI 等是一个明智的选择。
1. 启动 Nexus 容器
# 启动nexus容器 # 使用默认帐号admin/admin123登录 docker run -d --name nexus3 -p 5000:8081 --restart=always -v /data/nexus-data:/nexus-data sonatype/nexus3:latest
2. 创建仓库步骤
- 当然 Nexus 不只是支持创建 Docker 仓库,还支持 APT、Pypi、Yum等。
次序 | 名称 | 执行步骤 |
---|---|---|
1 | 创建私有仓库 | Repository->Repositories->CreateRepository->docker(hosted) |
2 | 添加管理模式 | Security->Realms-> Docker Bearer Token Realm |
3 | 创建管理角色 | Security->Roles |
4 | 创建登录用户 | Security->Users |
- 除了创建 docker(hosted) 模式以外,还可以创建一个 docker(proxy) 类型的仓库链接到 DockerHub 上,用于同步上游镜像信息。再创建一个 docker(group) 类型的仓库把刚才的 hosted 与 proxy 添加在一起。主机在访问的时候默认下载私有仓库中的镜像,如果没有将链接到 DockerHub 中下载并缓存到 Nexus 中。
3. Nginx 加密代理
- 关于证书的生成,可以参考《私有仓库高级配置》里面证书生成一节。
upstream register { # 端口为上面添加的私有镜像仓库是设置的HTTP选项的端口号 server "YourHostName OR IP":5001; check interval=3000 rise=2 fall=10 timeout=1000 type=http; check_http_send "HEAD / HTTP/1.0rnrn"; check_http_expect_alive http_4xx; } server { # 如果没有DNS服务器做解析,请删除此选项使用本机IP地址访问 server_name YourDomainName; listen 443 ssl; ssl_certificate key/example.crt; ssl_certificate_key key/example.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; large_client_header_buffers 4 32k; client_max_body_size 300m; client_body_buffer_size 512k; proxy_connect_timeout 600; proxy_read_timeout 600; proxy_send_timeout 600; proxy_buffer_size 128k; proxy_buffers 4 64k; proxy_busy_buffers_size 128k; proxy_temp_file_write_size 512k; location / { proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Port $server_port; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_pass http://register; proxy_read_timeout 900s; } error_page 500 502 503 504 /50x.html; }
- 使用 SSL 加密以后程序需要访问就不能采用修改配置的访问了。修改完之后,使用 docker login YourDomainName OR HostIP 进行测试,用户名密码填写上面 Nexus 中生成的。
# 生成ssl的证书 $ openssl s_client -showcerts -connect YourDomainName OR HostIP:443 < /dev/null 2> /dev/null | openssl x509 -outform PEM > ca.crt # 添加到信任证书列表中 $ cat ca.crt | sudo tee -a /etc/ssl/certs/ca-certificates.crt # 重启服务生效 $ systemctl restart docker
- 如果不启用 SSL 加密可以通过前面章节的方法添加信任地址到 Docker 的配置文件中然后重启 Docker。
# 修改配置文件 $ sudo vim /etc/docker/daemon.json { "registry-mirror": [ "https://registry.docker-cn.com" ], "insecure-registries": [ "192.168.31.191:5000" ] }