搭建docker镜像私服registry:

搭建docker镜像私服,最简单的方式,就是使用 registry镜像了

docker run -d -p 5000:5000 --restart=always --name registry -v /opt/registry:/var/lib/registry registry

然后访问http://localhost:5000/v2/_catalog,

查看一下其中所有的镜像:

#yyds干货盘点# docker 镜像服务器:registry_linux



上传本地镜像:

docker push 镜像地址:/镜像名字:版本

我们创建的镜像,名字需要有一些注意,那就是镜像地址:开头,如果不是呢?那就要在push上传之前需要先打个tag,如下

给要上传的镜像打标签,打标签以镜像地址:开头:

docker tag myApp:latest localhost:5000/myApp:v1

然后才可以推送镜像

docker push localhost:5000/myApp:v1


注意打标签一定要以镜像地址:开头 才能执行push,为什么,否则的话就,docker 怎么知道你想要push 到那个docker 镜像私服? 因为push 默认地址是官方的那个。 显然,我们需要指定一个地址。 那么我们是不是可以在config.json 文件里面进行指定呢?这样的话使用它作为默认值镜像地址,覆盖官方的,就不用每次都 先tag了啊。—— 可惜的是,没有找到这样的配置。




从私服下载镜像:

很简单,就是 docker pull 镜像地址:/镜像名字:版本号

那么, 如果本地已经存在同名的镜像,pull 有效吗? 测试发现是有效的。不过呢, 最好还是先删除本地镜像, 保险起见。

使用安全协议https

默认其实是走http 协议,如果走http是也是可以的,那就需要配置证书。这里不展开了。

另外,如果是http,那么需要在/etc/docker/daemon.json 增加 insecure-registries  .. 参数


登录认证:

有时候想进行登录认证,进行权限控制,怎么搞呢?可以在创建registry 容器的时候增加一些认证参数,如下:

docker run -itd -p 5000:5000 --restart=always --name docker-registry -v /mydisk/docker/auth:/auth -v /mydisk/docker/registry:/var/lib/registry -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" registry:2.7.0



关于登录认证的一个错误:

想拉取docker 私服镜像,但是报了错:

...

Unable to find image '192.169.2.234:5001/kcpx/umc-fileserver:v3.7.0.52' locally

docker: Error response from daemon: Get http://192.169.2.234:5001/v2/kcpx/umc-fileserver/manifests/v3.7.0.52: no basic auth credentials.

从私服拉取任何镜像之前,私服都会先进行认证, 即使本地存在那个镜像。


估计是没有登录,查看一下 认证文件,果然如此

[root@localhost ~]# cat ~/.docker/config.json

{

"auths": {},

"HttpHeaders": {

"User-Agent": "Docker-Client/19.03.9 (linux)"

}

}[root@localhost ~]#


login 一下:

[root@localhost ~]# docker login -u deployment -p dep123456 192.169.2.234:5001

WARNING: Error loading config file: /root/.docker/config.json: unexpected EOF

WARNING! Using --password via the CLI is insecure. Use --password-stdin.

WARNING! Your password will be stored unencrypted in /root/.docker/config.json.

Configure a credential helper to remove this warning. See

https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded


 正常的login 之后,应该是这样:

[root@localhost aufs]# cat ~/.docker/config.json

{

"auths": {

"192.169.2.234:5001": {

"auth": "ZGVwbG95bWVudDpkZXAxMjM0NTY="

}

},

"HttpHeaders": {

"User-Agent": "Docker-Client/19.03.13 (linux)"

}

}[root@localhost aufs]#

#yyds干货盘点# docker 镜像服务器:registry_linux_02


logout 之后, 再看看

[root@localhost ~]# docker logout 192.169.2.234:5001

Removing login credentials for 192.169.2.234:5001

[root@localhost ~]#

[root@localhost ~]# cat /root/.docker/config.json

{

"auths": {},

"HttpHeaders": {

"User-Agent": "Docker-Client/19.03.9 (linux)"

}



后面发现,手动修改 ~/.docker/config.json , 好像不行, 需要重启 docker ?

更正,手动修改 ~/.docker/config.json 也是ok的。



这看起来很安全,密码似乎是一堆乱码。你们会想,这些密码肯定是加密的吧?

其实,Docker所做的只是使用base64对密码进行编码。正如David Rieger在​​Hacker Noon​​上指出的那样,

Base64乍一看可能看起来像加密,但事实并非如此。Base64是一种编码方案,不是加密方案。你只需复制Base64字符串,然后在几秒钟内将其转换为ASCII。


#yyds干货盘点# docker 镜像服务器:registry_容器私服_03




--------------------------------------------------------------------


Docker1.11版本前,Docker配置文件config.json通过auths字段来存储凭据,直到2016年1.11版本才能够使用外部凭据存储。

每当你登录私有仓库时,Docker都会将auths的值设置为你的密码。你的配置文件可能包含以下内容:

因此在采用credsStore后,当你使用docker login进行登录时,你的凭据还会被存储,但其中的字段auths不包含用户名或密码。结果看起来像这样:


但Docker拉取镜像时从auths 和 credsStore两者同时获取凭据。因此,Docker拉取镜像时会有两份凭据,一份具有正确的用户名和密码,而一份则完全没有密码。

不幸的是,Docker偏爱使用auths中的https://的凭证,并尝试使用空凭证拉取镜像。因此,会有no basic auth credentials错误。

通过上文,我们确定了问题是一个空凭证被添加到 Docker配置文件config.json 中,我们就很容易​​解决该问题​​。我们需要做的就是添加一条if语句以跳过空凭据:


参考: ​​https://github.com/kelda/blimp/blob/master/cli/up/up.go​