一、Docker向仓库推送镜像的实现过程
docker的镜像在本地存放在:/var/lib/docker/image中。之前我保存镜像的方式都是把经过自己定制化处理的镜像另存为一个镜像,然后导出存储文件在服务器上。甚至在其它的服务器上备份,如果需要再启一个环境,只需要将镜像文件发到目标服务器上进行加载即可,不过对于一些云业务就需要将镜像提交到镜像仓库进行处理比较好。
提交镜像仓库前需要先提交镜像,之前有一篇文章涉及到这个:Docker打包容器并跨服务器传输重建加载load镜像Unable to find image :latest问题解决 及 Docker在容器未启动的情况下如何修改容器中文件_unable to find image 'root:latest' locally-CSDN博客 实际这里就只需要commit,不需要save操作。
docker commit container_id image_name:version
使用commit提交后就成了本地镜像,然后需要给本地镜像打标签,对需要推送到远程仓库的镜像标签一定要注意按照目标仓库的标准命名方式来进行,我就碰到因为命名问题导致推送不成功返回如下内容的情况:
denied: requested access to the resource is denied
#打标签的命令:
docker tag [ImageId] <仓库地址>/<镜像仓库>/<镜像名称>:[镜像版本号]
推送本地镜像
#身份验证:将本地镜像进行标记之后,我们就可以着手进行推送镜像。但一般推送前要进行身份验证。
docker login --username=name 007.cn
身份验证成功之后,我们就可以进行远程镜像的推送了。
#推送镜像:
docker pull 007.cn/responsity/jenkins:[镜像版本号]
命令执行完之后,可以查看本地镜像已经存在了之前要拉取的镜像。
#push命令后面填写的就是标记后的镜像名称
docker push <仓库地址>/<镜像仓库>/<镜像名称>:[镜像版本号]
命令执行结果:
6dcf19e06e7a: Pushed
ace0eda3e3be: Pushed
latest: digest: sh...155eb size: 73912
然后我们就可以将镜像推送到远程仓库,让别人从远程仓库中下载即可,同时还保证了镜像的安全。拉取远程镜像。在我们将本地镜像推送到远程仓库之后,项目中的其它成员就可以进行镜像的拉取。在拉取之前,我们首先需要进行身份的验证。
二、Docker配置中添加insecure-registries项之后启动报错unable to configure the Docker daemon的解决
要实现向私有仓库地址推送镜像,需要配置docker的配置文件/etc/docker/daemon.json 添加insecure-registries项:
[root@test docker]# cat /etc/docker/daemon.json
{
“insecure-registries”: [“10.13.12.13:1192”],
}
但修改后启动docker时报错启动不了。
[root@test docker]# service docker restart
unable to configure the Docker daemon with file /etc/docker/daemon.json: the following directives are specified both as a fla....21:40080])
一度怀疑是配置文件格式可能有问题,尝试多次也没有成功。网上有碰到说配置host的时候也碰到过类似的错误,认为是配置文件和docker启动文件中的配置冲突导致的,然后在docker的启动命令中删除了相关的启动项从而解决了问题,但我真不敢相信docker这么不聪明么,配置文件的数据可以当做值来覆盖启动中的参数值啊,不过虽然这个和我不是一样的问题,但其解决方法也给了我启示。我也尝试在docker的启动文件/lib/systemd/system/docker.service中添加自定义的仓库地址,在大约文件的第25行即--seccomp-profile下面增加了下面这行启动配置。
--insecure-registry=10.13.12.13:1192
然后启动docker成功了。希望这个方法对大家有用。