Docker hub 是一个用于管理公共镜像的好地方,我们可以在上面找到我们想要的镜像,也可以把我们自己的镜像推送上去。但有时候,我们的使用场景需要我们拥有一个私有的镜像仓库用于内网环境的镜像分发,这就可以通过 Docker Registry 来达成目的。
为什么要使用 Docker Registry
•严格控制镜像存放位置;•完全掌握私有镜像的分发管道;•将镜像存储和分发通道紧密集成到内部开发工作流程中。
从 docker hub 拉取 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
目录:
将 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
生信技能树官方举办的学习班: