Docker

S3:镜像上传

2020-01-13  本文已影响0人  睦月MTK

声明:所有的实验示例大部分来自《learn-docker-in-a-month-of-lunches》的作者Elton Stoneman,但运行结果并不都是照搬,大部分实验结果可能与原书不同


一、前言

前面几节讲述了如何去创建镜像和容器,现在是时候讲述如何将镜像上传到Image Registry(镜像仓库)了,但千万不要认为上传镜像是一件随便的事,所以本节将会讲述如何标准的给镜像打标签,如何上传镜像到镜像仓库(公有或者私有,云端或者本地)以及如何正确使用镜像等内容。


二、镜像标签命名规则
major release : minor version : patch number
1.2.3

patch number主要是和补丁相关的版本号,如果该项目修复了bug或者打了补丁(没有大的影响的)则增加该版本号
minor version的增加表示该项目添加了新的功能和特点
major release的增加表示该项目发生了极大的变化


三、上传镜像到Docker Hub
  1. 注册Docker Hub账号
  2. 本地使用docker login命令登录你的Docker Hub账号
  3. 以上节的diamol/registry为例,重新给该镜像的标签命名
$ docker image tag diamol/registry snmutsuki/registry:1.0.0

注意:docker image tag是重新给镜像打标签的命令,该命令并不会删除源镜像标签,源镜像标签与重新命名的标签都会存在,只是它们拥有同一个镜像ID

  1. push你的镜像到Docker Hub
$ docker image push snmutsuki/registry:1.0.0

如果你发现你的镜像修改后,每次上传需要的时间都很久,你得好好考虑一下Dockerfile的问题了。
其实你也可以手动在Docker Hub上创建仓库。
如果直接用命令push的话,对于不存在的仓库,Docker Hub将会自动为你创建

  1. 在Docker Hub上查看你的镜像


    docker-hub

左下角Tags是该镜像的版本标签,左上角显示所在的镜像仓库


四、创建本地的镜像仓库(基于容器)
  1. 下拉Elton Stoneman制作的镜像,当然你也可以自己下拉dockr维护在github上的registry服务的代码(docker/distribution)并自己制作一个镜像
$ docker container run --detach --publish 5000:5000 diamol/registry

registry服务默认端口是5000

  1. 这一步你当然可以选择直接给你的镜像打标签为localhost:5000/xxx/xxx:xxx,然后push,但是这样会出现一个问题,这个镜像和localhost绑定啦!不管怎么弄,它都只会寻找上传镜像的那台机器的本地仓库,本次我们以前述的docker.registry.local:5000/gallery/ui:1.0.0来作为例子,去解决这个问题。假设我们现在有docker.registry.local:5000/gallery/ui:1.0.0镜像,如何把它正确上传到本地的镜像仓库呢,假设本地镜像仓库地址为172.0.0.1(这是本机地址,使用它仅仅是为了方便讲解)
  2. 修改host文件
    • windows
    $ echo "`n127.0.0.1 docker.registry.local" >> C:\Windows\System32\drivers\etc\hosts
    
    • Linux
    $ echo "\n127.0.0.1 docker.registry.local" >> /etc/hosts
    
  3. ping测试
$ ping docker.registry.local

正在 Ping docker.registry.local [127.0.0.1] 具有 32 字节的数据:
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64

ping测试通过

  1. 离成功解决问题还差一步,现在出现了一个新问题,该本地仓库使用的是Http协议去上传和下拉镜像,而不是加密的Https协议,而Docker默认是不会与使用Http协议的仓库进行通讯的,所以我们的镜像还是上传不了,但是Docker提供一个非安全仓库白名单的设置,我们可以将我们这个仓库注册在这个白名单里
  2. Windows用户直接在任务栏中右击Docker图标 -> settings -> Daemon在Insecure registries中按提示填写你本地仓库的信息


    Insecure-registries.PNG
  3. Linux用户需要修改/etc/docker/daemon.json(如果没有该文件,请自行创建),并添加以下条目,如果是新创建的记得首尾加上大括号(毕竟是Json格式的文件啊)
"insecure-registries" : [
     "docker.registry.local:5000"
]
  1. 重启Docker
    • windows右键Docker图标 -> restart
    • Linux
    $ systemctl restart docker
    
  2. 查看设置是否应用
$ docker info
...
 Insecure Registries:
  docker.registry.local:5000
  127.0.0.0/8
...
  1. 上传你的镜像(记得重启一下你的容器哦,因为重启了Docker)

五、其他

GET /v2/_catalog

//powershell
$ curl.exe -X GET "Http://docker.registry.local:5000/v2/_catalog"
{"repositories":["gallery/api","gallery/logs","gallery/ui"]}

GET /v2/<imageName>/tags/list

//powershell
$ curl.exe -X GET "http://docker.registry.local:5000/v2/gallery/ui/tags/list"
{"name":"gallery/ui","tags":["v1"]}

参考文档:
[1] learn-docker-in-a-month-of-lunches
[2] 官方文档


附:
[1] Elton Stoneman的github项目

上一篇 下一篇

猜你喜欢

热点阅读