使用 Docker Registry 搭建私有 docker 仓库
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 映像。
- 从 Docker Hub 拉取
ubuntu映像 。
$ docker pull ubuntu:16.04
- 将本地的镜像加上
tag,使其指向registry,当tag的第一部分为主机名和端口,在递交镜像时,Docker 会将其解释为registry的位置。
$ docker tag ubuntu:16.04 localhost:5000/my-ubuntu
- 将映像推送到在
localhost:5000运行的私有仓库:
$ docker push localhost:5000/my-ubuntu
- 删除本地的
ubuntu:16.04和localhost:5000/my-ubuntu映像,以便我们测试从私有仓库中拉取该映像。这两行命令并不会删除私有仓库中的localhost:5000/my-ubuntu映像。
$ docker image remove ubuntu:16.04$ docker image remove localhost:5000/my-ubuntu
- 从私有仓库中拉取
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/](https://myregistry.domain.com/); - 服务器的 DNS,路由和防火墙允许通过 443 端口访问主机;
- 证书颁发机构(CA)获得证书。
- 创建一个
certs目录:
$ mkdir -p certs
将 CA 的 .crt 和 .key 文件复制到 certs 目录中。以下步骤假定文件名分别为 domain.crt 和 domain.key。
- 停止正在运行的私有仓库容器:
$ docker container stop registry
- 重新启动私有仓库,将其定向为使用 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
- 现在我们就可以使用外部地址从私有仓库拉取和递交镜像了。
$ 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
使用 Docker Harbor 部署私有仓库
除了把镜像上传到 Docker Hub 私有库和用 Registry 搭建私有镜像仓库外,我们还可以用 Docker Harbor 部署私有仓库。它以 Registry 为基础,提供了对用户友好的管理界面,可以帮助我们快速搭建一个企业级的 Docker Registry 服务。Harbor 的每个组件都是以 Docker 容器的形式构建的,使用 Docker Compose 进行部署。
GitHub 地址:https://github.com/vmware/harbor
在 centos 上使用 Harbor
- 安装 docker-compse 。
pip install docker-compose
- 查看安装是否成功
docker-compose -v
- 在 releases 页面下载离线安装包:https://github.com/goharbor/harbor/releases/tag/v1.10.6
- 解压后,进入目录会看到
harbor.cfg文件,该文件为 Harbor 的配置文件。修改配置文件:

- 依次运行
./prepare和./install.sh,Harbor 就会根据当期目录下的docker-compose.yml开始加载依赖镜像,检测并按照顺序依次启动各个服务。 - 启动完成后,在浏览器输入
IP:端口号即可访问:

- Harbor 的启动和停止:
# 启动 Harbordocker-compose start# 停止 Harbordocker-comose stop# 重启 Harbordocker-compose restart
将 Mac 端镜像推送到服务器 Harbor
- 在 docker 配置文件中添加一行:
"insecure-registries":["IP:端口"]

重启 docker。
- 登录 Harbor 私有仓库
docker login 172.16.23.29:2080 -u admin -p 123456
显示登录成功:
WARNING! Using --password via the CLI is insecure. Use --password-stdin.Login Succeeded
- 在服务器端 Harbor 创建一个项目:

新建一个公开项目:

- 公开: 所有用户对于公开项目都有读权限,这种方式对于你想把一些仓库分享给其他人的时候,是非常方便的.
- 非公开: 私有项目只能被有特定用户权限的人去访问。这种方式对于内部团队来说共享也是比较方便的
- 为 Mac 端镜像加上
tag。
docker tag ubuntu 172.16.23.29:2080/test1/my-ubuntu
- 将映像推送到服务器的私有仓库:
docker push 172.16.23.29:2080/test1/my-ubuntu
push 成功:
The push refers to repository [172.16.23.29:2080/test1/my-ubuntu]cc9d18e90faa: Layer already exists0c2689e3f920: Layer already exists47dde53750b4: Layer already existslatest: digest: sha256:1d7b639619bdca2d008eca2d5293e3c43ff84cbee597ff76de3b7a7de3e84956 size: 943
这时我们就可以在网页端看到刚刚推送的镜像了:

