Docker入门之push镜像至aliyun镜像仓库与自己搭建的镜像仓库
程序员文章站
2022-04-30 12:47:46
...
前言
- 所谓镜像仓库,大名鼎鼎的docker hub是家喻户晓的。除此之外还有aliyun提供的镜像仓库、自己搭建的镜像仓库等等。(鄙人知识有限,目前只熟悉这两个镜像仓库,若还有其他镜像仓库,还劳烦各位同行告知下,小弟在此多谢了!)。上篇博客中Docker入门之Dockerfile命令相关总结与基于centos镜像构建tomcat镜像,我们对构建docker的Dockerfile文件的常用指令做了总结以及构建了一个属于自己的tomcat镜像,现在我们将把此镜像push至aliyun镜像仓库和自己搭建的私有镜像仓库。
- aliyun镜像仓库能设置公开和私有的,那为什么还要自己搭建镜像仓库呢?这不是多此一举么?咱们也好得照顾下一些安全措施(不能访问外网)做的比较好的公司嘛。此时自己搭建的私有镜像仓库不久能派上用场了么?
一、aliyun镜像仓库
1.1 进入aliyun镜像仓库
- 进入aliyun镜像仓库: https://cr.console.aliyun.com/repository/cn-hangzhou
1.2 开通registry服务
- 进入并登录上述的地址后,映入眼前的是一个设置registry密码的界面, 如图所示:
1.3 设置registry密码
- 此密码要记住,将来会用来登录aliyun的镜像仓库
1.4 创建镜像仓库
1.5 查看push镜像至aliyun镜像仓库的相关操作
1.6 push上篇博客构建好的tomcat镜像至aliyun镜像仓库
- 查看镜像
* 重命名镜像tag
- push镜像至aliyun镜像仓库, 其中会看到如下界面,但速度很慢,若想加速,可以访问此链接:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors(但是要登录才能访问,因为它会为当前的aliyun账号分配一个镜像加速地址), 使用此方式可以加快镜像push和pull的速度
- push成功
1.7 运行指定镜像
- aliyun镜像仓库地址查看
然后会惊讶的发现,纳尼?为什么多了一个仓库名称。而且它还是私有的?于是我们把它的信息修改成公有并添加一些摘要和描述信息并保存:
最后,我们去aliyun镜像仓库中心搜索镜像(搜索关键字为: aliyun命名空间/具体镜像名称):
发现刚刚push的镜像安安静静的躺在这儿.我们点进去镜像看看:
发现有镜像的公网地址, 我们可以找一台其他的linux机器(有docker环境)直接run这个镜像就能启动一个容器运行该镜像了docker login --username=具体的用户名 registry.cn-hangzhou.aliyuncs.com docker run --name mytomcat -it -d -p 8081:8080 registry.cn-hangzhou.aliyuncs.com/avengereug/mytomcat:v1 curl -i localhost:8081
1.8 总结的几个问题
-
push镜像至aliyun镜像仓库的命令规则
docker push aliyun镜像仓库服务器地址/命名空间/镜像名:tag
- 如果按照如上的步骤来执行的话,可以发现其实我们压根不需要在aliyun的页面中去创建镜像仓库,所谓的镜像仓库其实就是对应的镜像。我们可以直接使用命令行来push一个镜像,镜像仓库的名称就是push镜像命令行中的镜像名
-
若我们在使用CI进行自动化构建docker时,经常需要登录登出docker,我们通常会使用如下命令来实现命令行传递密码登录docker仓库
docker login -u xxx -p yyy 私有docker仓库地址
二、搭建自己私有的镜像仓库
2.1 运行docker hub官网提供的镜像仓库registry
- 运行如下命令,具体可参考官方文档:https://docs.docker.com/registry/deploying/
docker run --name docker-registry --restart=always -v /mnt/registry:/var/lib/registry -it -d -p 5555:5000 registry:2
- 大致的含义下个命令参数就是:
运行一个镜像,名字叫registry。标签叫2。 -p 5555:5000 => 将宿主机的5555端口与容器暴露出来的5000端口做映射 -d => 以后台守护进程的方式运行容器 --restar=always => 假如容器异常退出会自动重启 -v /mnt/registry:/var/lib/registry => 将容器仓库中存储数据的路径(/var/lib/registry)映射到宿主机的/mnt/registry路径,保证不会因容器摧毁而丢失数据 -it => 以基本的shell脚本交互产生一个终端 --name docker-registry => 为容器添加了一个名字,方便以后操作容器
2.2 docker hub官网镜像仓库registry api
-
官网api 表格一览: https://docs.docker.com/registry/spec/api/#detail
-
就目前本人对docker的了解,估计暂且只能了解下它的查询api
url 具体操作 method 说明 /v2/_catalog?n= 查询仓库中所有的镜像 GET n为需要呈现的数量 /v2/镜像名/tags/list 查询仓库中指定镜像的所有tag GET 无
2.3 将本地镜像push至私有镜像仓库
同样的,还是操作上篇博客制作的tomcat镜像
-
修改tag
# b3668180dbfb为tomcat镜像的id docker tag b3668180dbfb 49.235.135.230:5555/avengereug/mytomcat:v1
-
以repository/tag的方式命名tag时有两个坑:
- 不允许出现大写字母
- repository不能包含http, eg: 上述的49.235.135.230:5555不能是http://49.235.135.230:5555
- push镜像
docker push 49.235.135.230:5555/avengereug/mytomcat:v1
- 所有操作结果如下所示:
- 但是好像有问题,
Get https://49.235.135.230:5555/v2/: http: server gave HTTP response to HTTPS client
是个什么鬼?https
协议?我的服务器没有开启https协议,于是经过一番搜索,发现要在**/etc/docker.daemon.json**文件中添加如下配置(配置不安全的registry地址,言外之外就是不使用https协议啦):
于是让docker重新加载并重启"insecure-registries":["49.235.135.230:5555"]
# docker重启后很多容器都会挂掉哦,如果有其他重要的容器别忘记重新启动它们 systemctl reload docker && systemctl restart docker
- 再次push镜像
运行结果如下图所示:docker push 49.235.135.230:5555/avengereug/mytomcat:v1
熟悉的进度条加载界面,看起来应该是ok了,一起静等佳音吧~
2.4 查看私有仓库中的所有镜像
- 执行如下命令
curl -i http://49.235.135.230:5555/v2/_catalog
2.5 私有仓库总结
- 关于docker私有仓库的一些功能点,可以参考官方文档-registry章节:https://docs.docker.com/registry/deploying/以及registry api官方文档:https://docs.docker.com/registry/spec/api/。比如和aliyun镜像仓库一样的需要登录等等等等
- 通常私有仓库一般就是在不能访问外网的情况下可能会搭建,其他的使用aliyun的镜像仓库基本上就ok了。