docker中實現 push到私有倉庫
參考官方文檔: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 文件(如果沒有就創(chuàng)建新的),并寫入如下內容:
{
"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發(fā)送https請求,nginx能接收處理
push帶用戶名密碼的倉庫
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

