Py学习  »  docker

使用 Docker Registry 部署私有 docker 仓库

生信菜鸟团 • 3 年前 • 376 次点击  

Docker hub 是一个用于管理公共镜像的好地方,我们可以在上面找到我们想要的镜像,也可以把我们自己的镜像推送上去。但有时候,我们的使用场景需要我们拥有一个私有的镜像仓库用于内网环境的镜像分发,这就可以通过 Docker Registry 来达成目的。

为什么要使用 Docker Registry

严格控制镜像存放位置;完全掌握私有镜像的分发管道;将镜像存储和分发通道紧密集成到内部开发工作流程中。

从 docker hub 拉取 registry 镜像

$ docker pull registry

部署 registry 服务器

创建一个 registry 容器:

$ docker run -d -p 5000:5000 --restart=always --name registry registry

这里的 --restart=always 参数可将该容器设置为在 Docker 重新启动或退出时自动重新启动。-d 参数指容器将在后台运行。-p 参数为端口映射,指宿主机端口 5000 将映射到容器端口 5000。

将镜像从 Docker Hub 拷贝到私有仓库

你可以从 Docker Hub 拉取镜像并将其推送到私有仓库。在下面的示例中,我们将从 Docker Hub 中拉取 ubuntu:16.04 映像,并将其重新标记为 my-ubuntu,然后将镜像推送到私有仓库。最后,从本地删除 ubuntu:16.04 和 my-ubuntu 映像,并从私有仓库中拉取 my-ubuntu 映像。

1.从 Docker Hub 拉取 ubuntu 映像 。

$ docker pull ubuntu:16.04

2.将本地的镜像加上 tag,使其指向 registry,当 tag 的第一部分为主机名和端口,在递交镜像时,Docker 会将其解释为 registry 的位置。

$ docker tag ubuntu:16.04 localhost:5000/my-ubuntu

3.将映像推送到在 localhost:5000 运行的私有仓库:

$ docker push localhost:5000/my-ubuntu

4.删除本地的 ubuntu:16.04 和 localhost:5000/my-ubuntu 映像,以便我们测试从私有仓库中拉取该映像。这两行命令并不会删除私有仓库中的 localhost:5000/my-ubuntu 映像。

$ docker image remove ubuntu:16.04$ docker image remove localhost:5000/my-ubuntu

5. 从私有仓库中拉取 localhost:5000/my-ubuntu 映像。

$ docker pull localhost:5000/my-ubuntu

停止私有仓库

要停止仓库,使用停止容器的 docker container stop 命令即可。

$ docker container stop registry

同样要删除容器,可使用 docker container rm

$ docker container stop registry && docker container rm -v registry

自定义发布端口

如果你已经占用了 5000 端口,或者要运行多个私有仓库,这时就需要分配不同的端口号。示例中我们将在 5001 端口上运行私有仓库,并将其命名为 registry-test。注意,-p 参数的第一部分为宿主机端口,第二部分为容器内的端口。在容器内,registry 默认情况下监听 5000 端口。

$ docker run -d \  -p 5001:5000 \  --name registry-test \  registry

如果要更改 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 内容存储在特定位置,我们可以使用 -v 参数,同样第一部分为宿主机地址,第二部分为容器内的地址。在下面的代码中,我们将宿主机目录 /mnt/registry 映射到 registry 容器内的 /var/lib/registry 目录:

$ docker run -d \  -p 5000:5000 \  --restart=always \  --name registry \  -v /mnt/registry:/var/lib/registry \  registry

创建一个可外部访问的私有仓库

下面的示例将假定:

你的域名为 https://myregistry.domain.com/服务器的 DNS,路由和防火墙允许通过 443 端口访问主机;证书颁发机构(CA)获得证书。

1.创建一个 certs 目录:

$ mkdir -p certs

将 CA 的 .crt 和 .key 文件复制到 certs 目录中。以下步骤假定文件名分别为 domain.crt 和 domain.key

2.停止正在运行的私有仓库容器:

$ docker container stop registry

3.重新启动私有仓库,将其定向为使用 TLS 证书。此命令将 certs/ 目录映射到容器内的 /certs/ 目录中,并设置环境变量,这些变量讲告诉容器在哪里可以找到 domain.crt 和 domain.key 文件。指定仓库在 443 端口(默认的 HTTPS 端口)上运行。

$ docker run -d \  --restart=always \  --name registry \


    
  -v "$(pwd)"/certs:/certs \  -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 443:443 \  registry

4.现在我们就可以使用外部地址从私有仓库拉取和递交镜像了。

$ docker pull ubuntu:16.04$ docker tag ubuntu:16.04 myregistry.domain.com/my-ubuntu$ docker push myregistry.domain.com/my-ubuntu$ docker pull myregistry.domain.com/my-ubuntu

本文参考:

https://docs.docker.com/registry/deploying

https://www.cnblogs.com/lienhua34/p/4922130.html

友情推荐:


生信技能树官方举办的学习班:


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/99306
 
376 次点击