Registry

01-概述 阅读更多

Registry是一个无状态,高度可扩展的服务器端应用程序,可存储并允许您分发Docker镜像。 使用注册表: 严格控制镜像的存储位置 完全拥有镜像分发管道 将镜像存储和分发紧密集成到内部开发工作流程中 备选方案:Docker Hub、Docker Trusted Registry 版本要求 Registry与Docker引擎版本1.6.0或更高版本兼容。 基本命令 启动注册表 docker run -d -p 5000:5000 --name registry registry:2 从Hub中拉出(或构建)一些镜像 docker pull ubuntu 标记镜像,使其指向Registry docker image tag ubuntu localhost:5000/myfirstimage 上传镜像到Registry中 docker push localhost:5000/myfirstimage 从Registry中拉去镜像 docker pull localhost:5000/myfirstimage 停止Registry并删除所有数据 docker container stop registry && docker container rm -v registry 具体 Registry是一个存储和内容传送系统,包含名为Docker的镜像,可以使用不同的标记版本。 用户使用docker push和pull命令与Registry进行交互。 存储本身被委托给驱动程序。默认存储驱动程序是本地posix文件系统,适用于开发或小型部署。还支持其他基于云的存储驱动程序, 如S3,Microsoft Azure,OpenStack Swift和Aliyun OSS。 考虑使用其他存储后端可以通过编写自己的Storage API的驱动程序来实现。 由于保护对托管镜像的访问权限至关重要,因此Registry本身支持TLS和基本身份验证。 Registry GitHub存储库包含有关高级身份验证和授权方法的其他信息。只有非常大的或公共部署才能以这种方式扩展注册表。 Registry附带了一个强大的通知系统,响应活动调用webhooks,以及广泛的日志记录和报告,这对于想要收集指标的大型安装非常有用。 镜像命名 典型的docker命令中使用的镜像名称反映了它们的来源: docker pull ubuntu指示docker ubuntu从官方Docker Hub中提取一个镜像。这只是较长docker pull docker.io/library/ubuntu命令的快捷方式 ocker pull myregistrydomain:port/foo/bar指示docker联系位于的Registry myregistrydomain:port以查找镜像foo/bar 可以在官方Docker引擎文档中找到有关处理图像的各种Docker命令的更多信息。 用例 运行自己的Registry是与CI / CD系统集成和补充的绝佳解决方案。 在典型的工作流程中,对源修订控制系统的提交将触发CI系统上的构建,如果构建成功,则会将新映像推送到Registry。然后,来自Registry的通知将触发暂存环境中的部署,或通知其他系统新镜像可用。 如果您想在大型机器群集上快速部署新镜像,它也是必不可少的组件。 最后,这是在隔离网络中分发镜像的最佳方式。

02-部署Registry 阅读更多

在部署Registry之前,需要在主机上安装Docker。Registry是registry镜像的实例,并在Docker中运行。 运行本地Registry 使用如下命令启动Registry容器: $ docker run -d -p 5000:5000 --restart=always --name registry registry:2 Registry现在可以使用了。 警告:前几个示例显示了仅适用于测试的Registry配置。生产就绪的Registry必须受TLS保护,理想情况下应使用访问控制机制。 继续阅读配置指南以部署生产就绪的Registry。 将镜像从Docker Hub复制到Registry 从 Docker Hub中拉ubuntu:16.04镜像 $ docker pull ubuntu:16.04 将镜像标记为localhost:5000/my-ubuntu。这会为现有镜像创建一个附加标记。当标记的第一部分是主机名和端口时,Docker在推送时将其解释为Registry的位置。 $ docker tag ubuntu:16.04 localhost:5000/my-ubuntu 将镜像推送到运行于的本地Registry localhost:5000: $ docker push localhost:5000/my-ubuntu 删除本地缓存ubuntu:16.04和localhost:5000/my-ubuntu镜像,以便可以测试从Registry中提取镜像。 $ docker image remove ubuntu:16.04 $ docker image remove localhost:5000/my-ubuntu 从本地Registry拉localhost:5000/my-ubuntu。 $ docker pull localhost:5000/my-ubuntu 停止本地Registry 要停止Registry,请使用docker container stop与任何其他容器相同的命令。 $ docker container stop registry 要删除容器,请使用docker container rm。 $ docker container stop registry && docker container rm -v registry 基本配置 要配置容器,可以将其他选项或修改选项传递给 docker run命令。 以下部分提供了配置Registry的基本准则。有关更多详细信息,请看Registry配置参考。 自动启动Registry 如果要将Registry用作永久基础结构的一部分,则应将其设置为在Docker重新启动或退出时自动重新启动。此示例使用该--restart always标志为Registry设置重新启动策略。 $ docker run -d -p 5000:5000 --restart=always --name registry registry:2 自定义已发布的端口 如果已经在使用端口5000,或者希望运行多个本地Registry以分离关注的区域,则可以自定义Registry的端口设置。此示例在端口5001上运行Registry并为其命名 registry-test。 请记住,-p值的: 第一部分是主机端口, 第二部分是容器中的端口。 在容器内,Registry5000默认侦听端口。 $ docker run -d -p 5001:5000 --name registry-test registry:2 如果要更改Registry在容器中侦听的端口,可以使用环境变量REGISTRY_HTTP_ADDR进行更改。此命令使Registry侦听容器中的端口5001: $ docker run -d -e REGISTRY_HTTP_ADDR=0.0.0.0:5001 -p 5001:5001 --name registry-test registry:2 存储定制 自定义存储位置 默认情况下,Registry数据将作为主机文件系统上的docker卷保留。如果要将Registry内容存储在主机文件系统上的特定位置,例如,如果将SSD或SAN装入特定目录,则可使用绑定装入。绑定装置更依赖于Docker主机的文件系统布局,但在许多情况下更具性能。 以下示例将主机目录绑定/mnt/registry到Registry容器中/var/lib/registry/。 $ docker run -d -p 5000:5000 --restart=always --name registry -v /mnt/registry:/var/lib/registry registry:2 自定义存储后端 默认情况下,Registry将其数据存储在本地文件系统上,无论使用绑定装载还是卷。可以使用存储驱动程序将Registry数据存储在Amazon S3存储桶,Google Cloud Platform或其他存储后端。有关更多信息,请参阅下一部分的存储配置选项。 运行外部可访问的Registry 运行仅可访问localhost的Registry用途有限。为了使Registry可供外部主机访问,必须首先使用TLS保护它。 此示例在下面的“将Registry作为服务运行”中进行了扩展。 获得证书 这些示例假设如下: 注册网址是https://myregistry.domain.com/。 DNS,路由和防火墙设置允许访问端口443上的Registry主机。 已从证书颁发机构(CA)获得证书。 如果已获得中间证书,请参阅 使用中间证书。 创建一个certs目录。 $ mkdir -p certs 将CA中的.crt和.key文件复制到certs目录中。以下步骤假定文件已命名为domain.crt和 domain.key。 如果当前正在运行,请停止Registry。 $ docker container stop registry 重新启动Registry,指示它使用TLS证书。此命令将certs/目录绑定到容器中/certs/,并设置环境变量,告诉容器在哪里找到domain.crt 和domain.key文件。Registry在端口443(默认HTTPS端口)上运行。 $ docker run -d -p 5000:5000 \ --restart=always \ --name registry \ -v /home/sugoi/docker/registry/data:/var/lib/registry \ -v /home/sugoi/docker/registry/certs:/certs \ -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \ -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \ registry:2 Docker客户端现在可以使用其外部地址从Registry中获取并推送镜像。以下命令演示了这一点: $ docker pull ubuntu:16.04 $ docker tag ubuntu:16.04 myregistrydomain.com/my-ubuntu $ docker push myregistrydomain.com/my-ubuntu $ docker pull myregistrydomain.com/my-ubuntu 使用中间证书 证书颁发者可以为您提供中间证书。在这种情况下,必须将证书与中间证书连接在一起以形成证书包。可以使用以下cat命令执行此操作: cat domain.crt intermediate-certificates.pem > certs/domain.crt 可以像使用domain.crt上一个示例中的文件一样使用证书包。 支持Let的加密 Registry支持使用Let's Encrypt自动获取浏览器可信证书。有关Let's Encrypt的更多信息,请参阅 https://letsencrypt.org/how-it-works/ 以及Registry配置的相关部分 。 使用不安全的Registry(仅测试) 可以使用自签名证书,或者不安全地使用我们的Registry。除非您为自签名证书设置了验证,否则仅用于测试。请参阅运行不安全的Regill strys。 添加认证 使用密码testpassword为用户testuser创建一个包含一个条目的密码文件: $ mkdir auth $ docker run \ --entrypoint htpasswd \ registry:2 -Bbn testuser testpassword > auth/htpasswd 停止registry docker stop registry 重新运行registry $ docker run -d \ -p 5000:5000 \ --restart=always \ --name registry \ -v registry:/var/lib/registry \ -v /home/sugoi/docker/registry/auth:/auth \ -e "REGISTRY_AUTH=htpasswd" \ -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \ -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \ -v /home/sugoi/docker/registry/certs:/certs \ -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \ -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \ registry:2 远程客户端使用证书访问registry 拷贝证书到指定目录 cp domain.crt /etc/docker/certs.d/myregistrydomain.com:5000/ca.crt 这种方式不需要重启docker。 第一种不生效的时候 $ cp certs/domain.crt /usr/local/share/ca-certificates/myregistrydomain.com.crt update-ca-certificates

03-配置Registry 阅读更多

Registry配置基于YAML文件。虽然具有开箱即用的默认值,但是在将系统投入生产之前详尽地查看它。 覆盖特定的配置选项 在从官方镜像运行Registry的典型配置中,可以通过-e参数传递到docker run或者在Dockerfile中使用ENV指令来传递环境变量。 要覆盖配置选项,可以创建名为REGISTRY_variable的环境变量,其中variable为需要设置的名字,下划线表示缩进级别,如下: REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/somewhere storage: filesystem: rootdirectory: /var/lib/registry REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY环境变量将会使用/somewhere来覆盖/var/lib/registry。 注意,以上方式用于修改单个环境变量的值 覆盖整个配置文件 修改单个环境变量遇到问题,或者需要修改整个配置文件的时候,通过将YAML配置文件作为容器的卷的方式修改整个配置文件。 通常,从头开始创建一个新的配置文件,命名config.yml,然后在docker run命令中指定它: $ docker run -d -p 5000:5000 --restart=always --name registry \ -v `pwd`/config.yml:/etc/docker/registry/config.yml \ registry:2 示例YAML文件(config.yaml)如下: version: 0.1 log: fields: service: registry storage: cache: blobdescriptor: inmemory filesystem: rootdirectory: /var/lib/registry http: addr: :5000 headers: X-Content-Type-Options: [nosniff] auth: htpasswd: realm: basic-realm path: /etc/registry health: storagedriver: enabled: true interval: 10s threshold: 3 完整的配置文件参考官方文档:https://docs.docker.com/registry/configuration/

Harbor 阅读更多

使用官方安装脚本自动安装最新版 curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 手动安装 step 1: 安装必要的一些系统工具 yum install -y yum-utils device-mapper-persistent-data lvm2 Step 2: 添加软件源信息 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo Step 3: 更新并安装 Docker-CE yum makecache fast yum -y install docker-ce Step 4: 开启Docker服务 sudo service docker start 注意:官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,你可以通过以下方式开启。同理可以开启各种测试版本等。 vim /etc/yum.repos.d/docker-ce.repo将 [docker-ce-test] 下方的 enabled=0 修改为 enabled=1 安装指定版本的Docker-CE: Step 1: 查找Docker-CE的版本: yum list docker-ce.x86_64 --showduplicates | sort -r Loading mirror speeds from cached hostfile Loaded plugins: branch, fastestmirror, langpacks docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.03.1.ce-1.el7.centos @docker-ce-stable docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable Available Packages Step2 : 安装指定版本的Docker-CE: (VERSION 例如上面的 17.03.0.ce.1-1.el7.centos) yum -y install docker-ce-[VERSION] 安装Docker-Compose Docker-Compose的GitHub Docker-Compose的官方文档 step1:使用官方安装脚本自动下载最新版 sudo curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose step2:对二进制文件赋予可执行权限: chmod +x /usr/local/bin/docker-compose step3:安装完成测试一下 docker-compose --version docker-compose version 1.22.0, build 1719ceb 以上方式不行,可以切换下一种方式: step1:首先安装epel扩展源: yum -y install epel-release step2:然后安装python-pip yum -y install python-pip :- step3:安装完之后别忘了清除一下cache yum clean all setp4:最后才安装docker-compose pip install -U docker-compose 安装Harbor Harbor的Github step1:下载Harbor Harbor离线包下载地址 Harbor在线包下载地址 wget https://storage.googleapis.com/harbor-releases/release-1.6.0/harbor-offline-installer-v1.6.0.tgz wget https://storage.googleapis.com/harbor-releases/release-1.6.0/harbor-online-installer-v1.6.0.tgz step2: 解压安装包 tar xvf harbor-online-installer-<version>.tgz //在线版 tar xvf harbor-offline-installer-<version>.tgz //离线版 step3:配置Harbor vim harbor.cfg ./install.sh 安装完成后,登录配置文件中设置的IP地址,默认管理员账户密码为admin/Harbor12345 step4 : 创建私有仓库 登录到浏览器端,创建一个新的项目myproject。由于默认安装使用的是HTTP协议,需要在docker客户端加入信任私有仓库地址,编辑 vi /etc/sysconfig/docker INSECURE_REGISTRY='--insecure-registry 192.168.10.10:5000 --insecure-registry 192.168.10.10' //重启系统服务 systemctl daemon-reload systemctl restart docker.service 停止Harbor docker-compose stop Stopping nginx ... done Stopping harbor-jobservice ... done Stopping harbor-core ... done Stopping harbor-db ... done Stopping registry ... done Stopping harbor-log ... done 修改Harbor docker-compose down -v //先停止已经运行的harbor vim harbor.cfg //修改配置文件 prepare //执行prepa脚本使配置生效 docker-compose up -d //重新启动Harbor 删除Harbor 的数据 $ rm -r /data/database $ rm -r /data/registry 使用Harbor 方法一:修改Docker Client的配置文件 vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.113\ //增加--insecure-registry 192.168.1.113\ systemctl daemon-reload systemctl restart docker 方法二: 创建/etc/docker/daemon.json文件,在文件中指定仓库地址 # cat > /etc/docker/daemon.json << EOF { "insecure-registries":["rgs.unixfbi.com"] } EOF # systemctl restart docker 登录Harbor docker login 192.168.1.113 //输入账号 //输入密码

Registry 阅读更多

docker-registry 是官方提供的工具,可以用于构建私有的镜像仓库。 安装运行 docker-registry 配置Registry 默认的配置文件为(容器内)/etc/docker/registry/config.yml,可以通过命令使用本地的配置文件(如/home/user/registry-conf),执行如下命令: docker run -d -p 5000:5000 \ --restart=always \ --name=registry \ -v /home/user/registry-conf/config.yml:/etc/docker/registry/config.yml \ registry:2 默认的存储路径为(容器内)/var/lib/registry,通过-v参数来映射本地的路径(如/opt/data/registry)到容器,执行如下命令: docker run -d -p 5000:5000 \ --restart=always \ --name registry \ -v /opt/data/registry:/var/lib/registry \ registry:2 容器运行 可以通过获取官方 registry 镜像来运行。 $ docker run -d -p 5000:5000 --restart=always --name registry registry:[version] 这将使用官方的 registry 镜像来启动私有仓库。默认情况下,仓库会被创建在容器的 /var/lib/registry(或者 /tmp/registry) 目录下。你可以通过 -v 参数来将镜像文件存放在本地的指定路径。 $ docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry //将上传的镜像放到本地的/opt/data/registry目录 此时,在本地将启动一个私有仓库服务,监听端口为5000。 先在本机查看已有的镜像。 $ docker image ls REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu latest ba5877dc9bec 6 weeks ago 192.7 MB 使用 docker tag 将 ubuntu:latest 这个镜像标记为 127.0.0.1:5000/ubuntu:latest。 格式为 docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]。 $ docker tag ubuntu:latest 127.0.0.1:5000/ubuntu:latest $ docker image ls REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu latest ba5877dc9bec 6 weeks ago 192.7 MB 127.0.0.1:5000/ubuntu:latest latest ba5877dc9bec 6 weeks ago 192.7 MB 使用 docker push 上传标记的镜像。 $ docker push 127.0.0.1:5000/ubuntu:latest The push refers to repository [127.0.0.1:5000/ubuntu] 373a30c24545: Pushed a9148f5200b0: Pushed cdd3de0940ab: Pushed fc56279bbb33: Pushed b38367233d37: Pushed 2aebd096e0e2: Pushed latest: digest: sha256:fe4277621f10b5026266932ddf760f5a756d2facd505a94d2da12f4f52f71f5a size: 1568 用 curl 查看仓库中的镜像。 $ curl 127.0.0.1:5000/v2/_catalog {"repositories":["ubuntu"]} 这里可以看到 {"repositories":["ubuntu"]},表明镜像已经被成功上传了。 先删除已有镜像,再尝试从私有仓库中下载这个镜像。 $ docker image rm 127.0.0.1:5000/ubuntu:latest $ docker pull 127.0.0.1:5000/ubuntu:latest Pulling repository 127.0.0.1:5000/ubuntu:latest ba5877dc9bec: Download complete 511136ea3c5a: Download complete 9bad880da3d2: Download complete 25f11f5fb0cb: Download complete ebc34468f71d: Download complete 2318d26665ef: Download complete $ docker image ls REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE 127.0.0.1:5000/ubuntu:latest latest ba5877dc9bec 6 weeks ago 192.7 MB 注意事项 如果你不想使用 127.0.0.1:5000作为仓库地址,比如想让本网段的其他主机也能把镜像推送到私有仓库。 你就得把例如 192.168.199.100:5000这样的内网地址作为私有仓库地址,这时你会发现无法成功推送镜像。 这是因为 Docker 默认不允许非HTTPS方式推送镜像。通过Docker的配置选项来取消这个限制,或者查看下一节配置能够通过 HTTPS 访问的私有仓库。 Ubuntu 14.04, Debian 7 Wheezy 对于使用 upstart 的系统而言,编辑/etc/default/docker 文件,在其中的 DOCKER_OPTS 中增加如下内容: DOCKER_OPTS="--registry-mirror=https://registry.docker-cn.com --insecure-registries=192.168.199.100:5000" 重新启动服务。 $ sudo service docker restart Ubuntu 16.04+, Debian 8+, centos 7 对于使用 systemd 的系统,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件) { "registry-mirror": ["https://registry.docker-cn.com"], "insecure-registries": ["192.168.199.100:5000"] } 注意:该文件必须符合 json 规范,否则 Docker 将不能启动。 其他对于 Docker for Windows 、 Docker for Mac 在设置中编辑 daemon.json 增加和上边一样的字符串即可。 或者修改Docker Daemon的启动参数,添加如下参数,表示信任这个私有仓库,不进行安全证书检查: DOCKER_OPTS="--insecure-registry 192.168.199.100:5000" 然后重启Docker服务。 使用安全证书 可以从知名的CA服务时(如verisign)申请公开的SSL/TLS证书,或者使用OpenSSL等软件自动生成,见下一章节。 配置TLS证书 当本地主机运行Registry服务后,所有能访问到该主机的Docker Host都可以把它作为私有仓库使用,只需要在镜像名称签名加上具体的服务器地址。 私有仓库需要启用TLS认证,否则会报错,可以使用上一节的方式配置,或者生产TLS证书。 自行生产证书 使用OpenSSL工具,生产私人证书文件: mkdir -p certs openssl req \ -newkey rsa:4096 \ -nodes -sha256 \ -keyout certs/myrepo.key \ -x509 -days 365 \ -out certs/myrepo.crt Country Name (2 letter code) [AU]:CN State or Province Name (full name) [Some-State]:ShangHai Locality Name (eg, city) []:ShangHai Organization Name (eg, company) [Internet Widgits Pty Ltd]: Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []:myregistry.docker.com Email Address []: 生产过程中会提示输入各种信息,主要CN一栏的信息要填入跟访问的地址相同的域名,例如上例中myrepo.com,生产结果为: 密钥文件:myrepo.key 证书文件:myrepo.crt 证书文件需要发送给用户,并且配置到用户Docker Host上,路径需要和域名一致,如:/etc/docker/certs.d/myrepo.com:5000/ca.crt 如果Registry服务需要对外公开,需要申请大家都认可的证书。 知名的代理商: SSLs.com GoDaddy.com LetsEncrypt.org GlobalSign.com 启用证书 当拥有秘钥文件和证书文件后,可以配置Registry启用证书支持,主要通过REGSITRY_HTTP_TLS_CERTIFICATE和REGISTRY_HTTP_TLS_KEY参数来设置: docker run -d -p 5000:5000 \ --restart=always \ --name registry \ -v /home/sugoi/docker/registry/certs:/certs \ -v /home/sugoi/docker/registry/data:/var/lib/registry \ -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \ -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \ -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \ -p 6443:443 \ registry:2 # 不使用https的端口,继续使用5000 docker run -d -p 5000:5000 \ --restart=always \ --name registry \ -v /home/sugoi/docker/registry/certs:/certs \ -v /home/sugoi/docker/registry/data:/var/lib/registry \ -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \ -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \ registry:2 管理访问权限 通常在生产环境中,对私有仓库还需要进行访问代理,以及提供认证和用户管理。 用Compose启动Registry 一般情况下,使用Registry需要的配置包括存储路径、TLS证书和用户认证。下面是基于Docker Compose的快速启动Registry的模板: registry: restart: always image: registry:2.1 ports: - 5000:5000 environment: REGISTRY_HTTP_TLS_CERIFICATE: /certs/myrepo.crt REGISTRY_HTTP_TLS_KEY: /certs/myrepo.key REGISTRY_AUTH: htpasswd ##这是一个加密工具 REGISTRY_AUTH_HTPASSWD_PATH: /auth/docker-registry-htpasswd REGISTRY_AUTH_HTPASSWD_REALM: basic volumes: - /path/to/data: /var/lib/registry - /path/to/certs: /certs - /path/to/auth: /auth 配置Registry Docker Registry提供了一些样例配置,用户可以直接使用它们来进行开发或生产部署。示例配置文件如下: # 版本信息 version: 0.1 # log选项 log: level: debug ## 字符串类型,标注输出调试信息的级别,包括debug,info,warn,error fromatter: text ## 字符串类型,日志输出格式,包括text,json,logstash等 fields: ## 增加到日志输出消息中的键值对,可以用于过滤日志 service: registry environment: development # hooks选项 # 配置当前仓库发生异常时,通过邮件发送日志时的参数 hooks: - type: mail disabled: true levels: - panic options: stmp: addr: mail.example.com:25 uername: mailuser password: password insecure: true from: sender@example.com to: - errors@example.com # 存储选项 # 将配置存储引擎,默认支持包括本地文件系统,Google云存储,AWS S3云存储,Openstack Swift 分布式存储等 storage: filesystem: rootdirectory: /var/lib/registry azure: accountname: accountname accountkey: base64encodedaccountkey container: containername gcs: bucket: bucketname keyfile: /path/to/keyfile rootdirectory: /gcs/object/name/prefix s3: accesskey: awsaccesskey secretkey: awssecretkey region: us-west-1 regionendpoint: http://myobjects.local bucket: bucketname encrypt: true keyid: mykeyid secure: true v4auth: true chunksize: 5242880 multipartcopychunksize: 33554432 multipartcopymaxconcurrency: 100 multipartcopythresholdsize: 33554432 rootdirectory: /s3/object/name/prefix Swift: uername: username password: password authurl: https://storage.myprovider.com/auth/v1.0 or https://storage.myprovider.com/v2.0 or https://storage.myprovider.com/v3/auth tenant: tenantname tenantid: tenantid domain: domain name for Openstack Identity v3 API domainid: domain id for Openstack Identity v3 API insecureskipverify: true region: fr container: containername rootdirectory: /swift/object/name/prefix oss: accesskeyid: accesskeyid accesskeysecret: accesskeysecret region: OSS region name endpoint: optional endpoints internal: optional internal endpoint bucket: OSS bucket encrypt: optional data encrypt setting secure: optional ssl setting chunksize: optional size value rootdirectory: optional root directory inmemory: delete: ##是否允许删除镜像功能,默认关闭 enabled: true cache: ## 开启对镜像层元数据的缓存功能,默认开启 blobdescriptor: inmemory maintenance: ## 配置维护相关的功能,包括对孤立旧文件的清理、开启只读模式等 uploadpurging: enabled: true age: 168h interval: 24h dryrun: false redirect: disable: false # 认证选项,对认证类型的配置 auth: silly: ##仅供测试使用,只要请求头带有认证域即可,不做内容检查 realm: silly-realm service: silly-service token: ##基于token的用户认证,适用于生成环境,需要额外的token服务来支持 realm: token-realm service: token-service issuer: registry-token-issuer rootcetbundle: /root/certs/bundle htpasswd: ##基于Apache htpasswd密码文件的权限检查 realm: basic-realmhttp://success.docker.com/article/docker-login-to-dtr-fails-with-x509-certificate-error path: /path/to/htpasswd # HTTP选项 http: addr: localhost:5000 ##服务监听地址,必选 net: tcp prefix: /my/nested/registry/ host: https://myregistryaddress.org:5000 secret: asecretforlocaldevelopment ##与安全相关的随机字符串,用户可以自定义,必选 relativeurls: false tls: ##证书相关的文件路径信息 certificate: /path/to/x509/public key: /path/to/x509/private clientcas: - /path/to/ca.pem - /path/to/another/ca.pem letsenceypt: cachefile: /path/to/cache-file email: emailused@letsencrypt.com debug: addr: localhost:5001 headers: X-Content-Type-Options: [nosniff] http2: ##是否开启http2,默认为关闭 disabled: false # 通知选项 ## 有事件发生时的通知系统 notifications: endpoints: - name: local-5003 url: http://localhost:5003/callback headers: Authorization: [Bearer <an example token>] timeout: 1s threshold: 10 backoff: 1s disabled: true ## 上面的配置会在pull或push发生时向 http://localhost:5003/callback 发送事件,并在HTTP请求的header中传入认证信息,可以是Basic、token、Bearer等模式,主要用于接收事件方进行身认证。更新配置后,需要重启Registry服务器,如果配置正确,会在日志中看到相应的提示信息:configuring endpoint listener (http://localhost:5003/callback),timeout=1s,header=map[Authorization:[Bearer <an example token>]] - name: local-8083 url: http://localhost:5003/callback timeout: 1s threshold: 10 backoff: 1s disabled: true # redis选项 ##用redis来缓存文件块 redis: addr: localhost:6379 password: asecret db: 0 dialtimeout: 10ms readtimeout: 10ms writetimeout: 10ms pool: maxidle: 16 maxactive: 64 idletimeout: 300s # 健康健康选项 ## 对配置服务进行检测判断系统状态,默认不开启 health: storagedriver: enabled: true interval: 10s threshold: 3 file: - file: /path/to/checked/file interval: 10s http: - addr: redis-server.domain.com:6379 timeout: 3s interval: 10s threshold: 3 # 代理选项 ## 配置Registry作为一个pull代理,从远端(目前仅支持官方仓库)下拉Docker镜像 ## 也可通过如下命令来配置代理 `docker --registry-mirror=https://myrepo.com:5000 daemon` proxy: remoteurl: https//registry-1.docker.io username: [usernamen] password: [password] # 验证选项 ## 限定来自指定地址的客户端才可以执行push操作 validation: enabled: true manifests: urls: allow: - ^https?://([^/]+\.)*example\.com/ deny: - ^https?://www\.example\.com/ 配置文件中的选项都是以yaml文件的格式提供的,可以直接进行修改,也可以自定义添加,默认情况下,变量可以从环境变量中读取,例如:log.level:debug 可以配置为 export LOG_LEVEL=debug 。 通知的使用场景 每个事件触发的payload都是一个定义好的JSON格式的数据,主要的属性如下: 属性 类型 描述 action string 事件所关联的动作类型,pull或者push target.mediaType string 事件payload类型,如application/octet-stream等 target.repository string 镜像名称 target.url string 事件对应数据地址,可以通过url来获取此事件带来的更改 request.method string HTTP请求方法 request.useragent string 带来此事件的客户端类型 actor.name string 发起此次动作的用户 统计镜像上传下载次数,了解镜像使用情况 对服务的持续部署,方便管理镜像

Registry迁移 阅读更多

Docker Registry是Dockers镜像的存储和管理中心,在一个离线或没有外网网络的环境下使用大量docker镜像,需要提供一个镜像仓库时需要怎么操作比较合适呢? Registry可以通过push的方式上传镜像到仓库中,默认将上传的镜像数据保存在/var/lib/registry目录。那么在离线时我们可以: 将Regsitry本身的镜像save成tar包, 将/var/lib/registry数据目录也打包成tar包, 然后在目标机器上通过volume的形式挂载运行即可提供服务。 注意;如果被迁入的服务器上已经有registry镜像,那么就只需要打包保存镜像的数据目录即可。 具体操作步骤 方法一,数据保存在本地文件中 创建保存registry数据的目录 bash mkdir /var/lib/registry_data 添加http访问权限 修改配置文件/etc/docker/daemon.json,默认情况下需要使用https方式访问,进行如下修改: json { "insecure-registries":["127.0.0.1:5000"] } 修改完成之后,需要重启docker进程。 运行Registry官方镜像 bash docker run -d --name=registry \ -v /var/lib/registry_data:/var/lib/registry \ -p 5000:5000 docker.io/registry:2.7 将需要迁移的镜像都push到registry中 bash docker tag <name>:<tag> 127.0.0.1:5000/<name>:<tag> docker push 127.0.0.1:5000/<name>:<tag> 将registry镜像导出 bash docker save -o registry.tar docker.io/registry 将保存镜像的数据目录打包 bash tar -zcvf registry-data.tar.gz /var/lib/registry_data 计算校验值 bash md5sum/sha256 registry.tar md5sum/sha256 registry-data.tar.gz 按照第二步修改被迁入主机的docker配置 导入registry镜像 docker load -i registry.tar 解压镜像数据压缩包 tar -zxvf registry-data.tar.gz -C /var/lib/registry_data 运行registry容器 docker run \ -d --name=registry \ -v /var/lib/registry-data:/var/lib/registry \ -p 5000:5000 docker.io/registry:2.7 验证使用,根据B机器所在网络,修改tag,然后通过docker pull的方式拉去镜像。 方法二,数据保存在volume中 通常情况下,为了方便管理,registry都会挂载一个名字为registry的volume。registry是一个无状态的服务,迁移名为registry的volume即可。 注意,保证迁出节点上registry的运行是绑定在名为registry的volume上的 备份当前registry中的数据 bash tar -zcvf registry-data.tar.gz /var/lib/docker/volumes/registry/_data/docker/ 在目标节点创建volume bash docker volume create registry 解压镜像数据到volume所在的目录中 bash tar -zxvf registry-data.tar.gz 启动registry容器 docker run -d \ --name registry \ --restart=always \ -p 5000:5000 \ -v registry:/var/lib/registry \ registry:2.7 验证新的registry curl -i http://127.0.0.1:5000/v2/_catalog # 通过unix套接字来通信 curl --unix-socket /var/run/docker.sock http://127.0.0.1:5000/v2/_catalog curl --no-buffer -XGET --unix-socket /docker.sock http://localhost/events