docker中实现 push到私有仓库
作者:IT杂人
参考官方文档:https://docs.docker.com/registry/spec/api/
1.安装docker-registry
略
2.配置nginx访问(不设置https加密)
upstream docker_registry_pool{ server registry:5000; #nginx与registry都用docker,所以直接使用别名和docker内网端口 } server { listen 80; server_name registry.xxx.com; location / { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://docker_registry_pool; proxy_read_timeout 900; } }
3.测试本地push
--注意,打tag时,直接用完整访问路径作为前缀
如:
docker tag myservice:v1.1 localhost:5000/tang/myservice:v1.1 #把myservice:v1.1 打上带绝对路径的v1.1tag
push时:
docker push localhost:5000/tang/myservice:v1.1
查看是否存在:curl后查看json字符串是是否包括myservice镜像
curl http://registry.xxx.com/v2/_catalog
查看存在的tag:curl后查看json字符串是是否包括myservice镜像
curl http://registry.xxx.com/v2/tang/myservice/tags/list
4.测试远程push(现启动时默认是https,所以会报错)
打上tag,目前是http请求
docker tag myservice:v1.1 registry.xxx.comtang/myservice:v1.1 #把myservice:v1.1 打上带绝对路径的v1.1tag
push时:
docker push registry.xxx.comtang/myservice:v1.1
http: server gave HTTP response to HTTPS client #报错
5.修改配置(切记,一定是客户端,而且非服务端)
支持http:两种方式,选择其中一种即可,不可重复,假如是80端口,也要写上,因为docker-client默认使用443端口。
切记,一定是客户端,而且非服务端,如在B机器推送或者在公司电脑推送到远程A服务器上
5.1 方式一:修改docker客户端的配置
vim /usr/lib/systemd/system/docker.service
配置项后增加配置:
--insecure-registry=registry.xxx.com:80,后面是你的域名或者ip,如果有端口也要带上,坑爹一定要指定加上80端口
ExecStart=/usr/bin/dockerd-current \ --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current \ --default-runtime=docker-runc \ --exec-opt native.cgroupdriver=systemd \ --userland-proxy-path=/usr/libexec/docker/docker-proxy-current \ --init-path=/usr/libexec/docker/docker-init-current \ --seccomp-profile=/etc/docker/seccomp.json \ $OPTIONS \ $DOCKER_STORAGE_OPTIONS \ $DOCKER_NETWORK_OPTIONS \ $ADD_REGISTRY \ $BLOCK_REGISTRY \ $INSECURE_REGISTRY \ $REGISTRIES \ --insecure-registry=registry.xxx.com:80 \ --insecure-registry=你的ip:5000
5.2 方式二:添加docker客户端配置
修改 /etc/docker/daemon.json
文件(如果没有就创建新的),并写入如下内容:
{ "insecure-registries":[ "xxx.xxx.xxx.xxx:5000", "registry.xxx.com:80" ] }
5.3 如果是window客户端
修改:C:\Users\左右手公用\AppData\Roaming\Docker\daemon.json
或者修改Docker Desktop配置
5.4 修改后重启docker服务
#linux下 systemctl daemon-reload systemctl restart docker
6.再次测试远程push
重新打上tag,目前nginx配置的是80端口的http请求,一定要坑爹的显示加上80端口80!80!80!80!
因为docker-client默认使用443端口
docker tag myservice:v1.1 registry.xxx.comtang:80/myservice:v1.1 #把myservice:v1.1 打上带绝对路径的v1.1tag
push时:
docker tag myservice:v1.1 registry.xxx.comtang:80/myservice:v1.1 #把myservice:v1.1 打上带绝对路径的v1.1tag
成功!!!!
7.既然https是默认的,那就配置https吧
想一想,为什么我们打tag时不需要写上http或者https的标记,因为docker-client就是默认使用443端口,傲娇吧!
为了避免上面这些坑,其实建议nginx配置https的,那么docker-client发送https请求,nginx能接收处理
push带用户名密码的仓库
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。