美文网首页Docker
S3:镜像上传

S3:镜像上传

作者: 睦月MTK | 来源:发表于2020-01-13 15:06 被阅读0次

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


一、前言

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


二、镜像标签命名规则
  • 镜像仓库?
    镜像仓库就是一个集中存储镜像的服务器,当然并不是直接存储镜像啦,而是像本地缓存镜像一样,存储的是镜像层。Docker Hub是目前最流行的镜像仓库,并且也是默认的镜像仓库,如果用户上传是未在标签指定镜像仓库,则默认上传到Docker Hub,同样地,如果用户下拉镜像时,没有指定下拉地址,则默认从Docker Hub中下拉。

  • 镜像标签解析

    docker.registry.local:5000/gallery/ui:1.0.0
    docker.io/snmutsuki/registry:latest
    

    上述两个标签里
    docker.registry.local:5000docker.io都是镜像仓库的地址,区别在于前者是本地的仓库,后者是Docker Hub的地址且可以省略
    gallerysnmutsuki一般是组织名字或者用户名
    uiregistry则是你定义的镜像名字(Docker Hub上为仓库,其实也可以理解为镜像,一个仓库一个种类的镜像)
    1.0.0latest为镜像的版本标签,后者是默认的,可以不加,前者是通用的版本号。注意,版本标签实际上可以是任何字符

  • 通用版本号的命名规则

major release : minor version : patch number
1.2.3

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

  • 更高效的指定版本号
    • 问题:
      如果有这么一个镜像标签testUserName/testRep:2.1.0,该镜像比2.0版本添加了新的功能但存在很多潜在bug,某位用户正好需要2.1版本添加的新功能,随后他在他的Dockerfile中指定了该镜像的2.1.0版本。刚写完他发现一个问题,2.1.0版本可能存在比较多的bug,如果将来bug修复了,他将不得不修改他的Dockerfile以重新指定版本。那么如何解决这个问题呢?
    • 解决方案:为同一个镜像指定多个版本标签,比如2.1.3发布了,便给这个镜像同时指定2.1.3、2.1、2、latest四个标签,这样用户只要在他的Dockerfile中指定版本号2.1就可以了,因为此时的2.1版本对应的就是2.1.3版本。

三、上传镜像到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)

五、其他
  • 请注意Docker Hub是一个开放的平台,任何人都可以在上面上传或者下载镜像,所以你得小心非法之徒放一些不安全的东西在上面,最好的做法是使用官方的镜像
  • 使用本地仓库时,如何查看本地仓库拥有的镜像?

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. 找到要删除的镜像的Digest

    GET /v2/<imageName>/manifests/<versionTag>

    //powershell
    $ curl.exe --head `
     http://docker.registry.local:5000/v2/gallery/ui/manifests/v1 `
     -H "Accept:application/vnd.docker.distribution.manifest.v2+json"
    HTTP/1.1 200 OK
    Content-Length: 1364
    Content-Type: application/vnd.docker.distribution.manifest.v2+json
    Docker-Content-Digest:     sha256:4060ff398874fa42b1b575e58d321b3554aa54541a63613bdc274835934a71a7
    Docker-Distribution-Api-Version: registry/2.0
    Etag: "sha256:4060ff398874fa42b1b575e58d321b3554aa54541a63613bdc274835934a71a7"
    X-Content-Type-Options: nosniff
    Date: Mon, 13 Jan 2020 09:27:27 GMT
    
    1. 删除镜像

    DELETE /v2/<imageName>/manifests/<digest>

    //powershell
    $ curl.exe -X DELETE "http://docker.registry.local:5000/v2/gallery/ui/manifests/sha256:4060ff398874fa42b1b575e58d321b3554aa54541a63613bdc274835934a71a7"
    

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


附:
[1] Elton Stoneman的github项目

相关文章

网友评论

    本文标题:S3:镜像上传

    本文链接:https://www.haomeiwen.com/subject/vgtbactx.html