搭建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,
查看一下其中所有的镜像:
上传本地镜像:
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]#
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。
--------------------------------------------------------------------
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