• Docker Registry


    一个registry是一个存储和内容交付系统,其中维护着若干命名的Docker镜像,这些镜像有不同的标记版本。(例如:有一个镜像名字叫 hello/world,它有两个tags分别是2.0和2.1)

    用户通过使用 docker push 和 docker pull 命令与 registry 进行交互。(例如:docker pull registry-1.docker.io/hello/world:2.1)

    A registry is a storage and content delivery system, holding named Docker images, available in different tagged versions.
    Users interact with a registry by using docker push and pull commands.

    前面说了,registry是一个存储系统,它存储的是Docker镜像。那么,镜像到底存到哪里呢?存储本身委托给驱动程序。默认的存储驱动程序是本地posix文件系统,还支持其它基于云的存储驱动程序,例如 Aliyun OSS

    由于保护对托管映像的访问至关重要,因此Registry本身支持TLS和基本身份验证。

    1.1. 理解镜像命名

    docker pull ubuntu 指示docker从官方Docker Hub中拉取一个名字叫ubuntu的镜像。这条命令其实是docker pull docker.io/library/ubuntu的简写

    docker pull myregistrydomain:port/foo/bar 指示docker拉取位于myregistrydomain:port的镜像foo/bar 

    1.2. 用例

    运行你自己的Registry是与CI/CD系统集成并对其进行补充的绝佳解决方案。在典型的工作流程中,对源版本控制系统的提交将触发在CI系统上的构建,如果构建成功,则将新镜像推送到你的Registry。然后,来自Registry的通知将触发在暂存环境上的部署,或者通知其它系统有一个新镜像可用。

    如果要在大型计算机集群上快速部署新镜像,它也是必不可少的组件。

    这也是在隔离的网络中分发镜像的最佳方法。 

    2. 部署一个registry server

    1. # Run a local registry
    2. docker run -d -p --restart=always --name registry registry:2

    2.1. Copy an image from Docker Hub to your registry

    你可以从Docker Hub上拉取一个镜像,并把它推送到你自己的Registry上。下面的例子中,从Docker Hub上拉取镜像ubuntu:16.04,并将其重新打标记为my-ubuntu,然后将其推送到本地registry,最后,再将ubuntu:16.04和my-ubuntu删除。

    1. # 1. Pull the ubuntu:16.04 image from Docker Hub
    2. docker pull ubuntu:16.04
    3. # 2. Tag the image as localhost:5000/my-ubuntu
    4. # (注意,当tag的第一部分是主机名和端口时,push时Docker会将其解释为registry的位置)
    5. docker tag ubuntu:16.04 localhost:5000/my-ubuntu
    6. # 3. Push the image to the local registry running at localhost:5000
    7. docker push localhost:5000/my-ubuntu
    8. # 4. Remove the locally-cached ubuntu:16.04 and localhost:5000/my-ubuntu images, so that you can test pulling the image from your registry. This does not remove the localhost:5000/my-ubuntu image from your registry.
    9. docker image remove ubuntu:16.04
    10. docker image remove localhost:5000/my-ubuntu
    11. # 5. Pull the localhost:5000/my-ubuntu image from your local registry
    12. docker pull localhost:5000/my-ubuntu 

    停止本地registry

    1. # stop the registry
    2. docker container stop registry
    3. # remove the container
    4. docker container stop registry && docker container rm -v registry

    3. 基本配置

    为了配置container,可以给docker run命令指定额外的选项参数 

    1. # 自动重启registry
    2. # -p选项的值,第一个是主机端口,第二个是容器端口。在容器中,registry默认监听端口是5000
    3. docker run -d -p 5000:5000 --restart=always --name registry registry:2
    4. # 自定义存储位置
    5. docker run -d -p 5000:5000 --restart=always --name registry -v /mnt/registry:/var/lib/registry registry:2

    3.1. 运行一个外部可访问的registry

    运行一个仅在本地主机上可访问的registry没有什么用处,为了使你的registry可供外部主机访问,必须首先使用TLS保护registry。

    下面是一个将registry作为服务来运行的例子:

    首先,获得一个证书

    假设你的registry的URL是https://myregistry.domain.com/,同时假设的DNS,路由和防火墙设置允许通过端口443访问registry的主机,再假设你已经从CA那里获得一个证书。

    那么,接下来

    创建一个certs目录

    从CA那里复制.crt和.key文件到certs目录,假设分别重命名为domain.crt和domain.key

    重启registry,将其指向使用TLS证书

    1. docker run -d \
    2. --restart=always \
    3. --name registry \
    4. -v "$(pwd)"/certs:/certs \
    5. -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
    6. -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
    7. -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
    8. -p 443:443 \
    9. registry:2 

    现在Docker客户端就可以通过registry的外网地址进行pull和push了

    1. docker pull ubuntu:16.04
    2. docker tag ubuntu:16.04 myregistry.domain.com/my-ubuntu
    3. docker push myregistry.domain.com/my-ubuntu
    4. docker pull myregistry.domain.com/my-ubuntu

    将registry作为一个服务运行

    与独立容器相比,swarm services具有多个优点。它们使用声明式模型,这意味着你定义了所需的状态,而Docker则将服务保持在该状态。服务提供了自动负载平衡扩展,并具有控制服务分配的能力以及其他优势。服务还允许你秘密存储敏感数据,例如TLS证书。 

    下面这个例子将registry作为单副本服务启动,可以在端口80上的任何群集节点上访问该registry,并假定使用的是与前面示例相同的TLS证书。

    1. # 首先,保存TLS证书和key作为secret
    2. docker secret create domain.crt certs/domain.crt
    3. docker secret create domain.key certs/domain.key
    4. # 接下来,将你想要在上面允许registry的node添加一个标签
    5. docker node update --label-add registry=true node1
    6. # 再接着,创建一个服务,并授权它可以访问两个secret,并将其限制为仅在标签为registry=true的节点上运行
    7. docker service create \
    8. --name registry \
    9. --secret domain.crt \
    10. --secret domain.key \
    11. --constraint 'node.labels.registry==true' \
    12. --mount type=bind,src=/mnt/registry,dst=/var/lib/registry \
    13. -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
    14. -e REGISTRY_HTTP_TLS_CERTIFICATE=/run/secrets/domain.crt \
    15. -e REGISTRY_HTTP_TLS_KEY=/run/secrets/domain.key \
    16. --publish published=443,target=443 \
    17. --replicas 1 \
    18. registry:2
    现在你可以在任何swarm节点的443端口上访问服务。Docker会将请求发送到运行该服务的节点。 

    4. 文档

    1. # 启动registry
    2. docker run -d -p 5000:5000 --name registry registry:2
    3. # 从Docker Hub上拉取镜像
    4. docker pull ubuntu
    5. # 给镜像打tag
    6. docker image tag ubuntu localhost:5000/myfirstimage
    7. # 推送至你自己的registry
    8. docker push localhost:5000/myfirstimage
    9. # 再次从你自己的registry拉取镜像
    10. docker pull localhost:5000/myfirstimage
    11. # 停止registry并删除所有数据
    12. docker container stop registry && docker container rm -v registry

    Docker Registry - 废物大师兄 - 博客园

  • 相关阅读:
    薄盒借周杰伦IP卖藏品 车翻在奈雪的茶
    运放电压跟随器为什么要加电阻
    c语言数据结构,你可能还不知道的顺序表
    C++:类的封装
    9、ajax和json
    java3、异常
    pytorch PythonAPI torch.....................
    Java练习题1
    数据库的基础概念和代码例子(增删改查和其他操作-约束)
    Leetcode 高频算法题
  • 原文地址:https://blog.csdn.net/qq_36733838/article/details/127697703