概念关系
注册服务器(Registry)和仓库(Repository)概念的区别:注册服务器是存放仓库的实际服务器,而仓库则可以被理解为一个具体的项目或者目录;注册服务器可以包含多个仓库,而每个仓库又可以包含多个镜像。
举例:镜像地址为 docker.io/centos,docker.io 是注册服务器,centos 是仓库名。
公共镜像仓库
公共镜像仓库一般是 Docker 官方或者其他第三方组织(阿里云,腾讯云,网易云等)提供的,允许所有人注册和使用的镜像仓库。可以进入 Docker Hub 官网注册账号并创建仓库,然后通过
docker login
默认命令请求登录 Docker Hub。
$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: mydocker
Password:
Login Succeeded
私有镜像仓库
Docker 官方提供了一个搭建私有仓库的镜像
registry
,只需把该镜像下载下来,运行容器并暴露5000
端口,默认访问地址为localhost
。
$ docker run -d -p 5000:5000 --name registry registry:2.7
Unable to find image 'registry:2.7' locally
2.7: Pulling from library/registry
cbdbe7a5bc2a: Pull complete
47112e65547d: Pull complete
46bcb632e506: Pull complete
c1cc712bcecd: Pull complete
3db6272dcbfa: Pull complete
Digest: sha256:8be26f81ffea54106bae012c6f349df70f4d5e7e2ec01b143c46e2c03b9e551d
Status: Downloaded newer image for registry:2.7
d7e449a8a93e71c9a7d99c67470bd7e7a723eee5ae97b3f7a2a8a1cf25982cc3
推送镜像
在本地镜像推送到自定义仓库前,我们需要先把镜像 “重命名” 一下,才能正确推送到自己创建的镜像仓库中,使用
docker tag
命令将镜像 “重命名”,然后通过docker push
命令推送镜像到本地仓库中:
$ docker tag busybox localhost:5000/busybox
$ docker push localhost:5000/busybox
持久化镜像存储
容器是无状态的,而私有仓库的启动方式可能会导致镜像丢失,因为我们并没有把仓库的数据信息持久化到主机磁盘上,当然还支持其他多种存储类型。
下面我们可以使用以下命令将镜像持久化到主机目录,保证容器被重建后数据不丢失:
### -v参数冒号前面为主机目录,冒号后面为容器内目录
$ docker run -v /var/lib/registry/data:/var/lib/registry -d -p 5000:5000 --name registry registry:2.7
构建可外访的镜像仓库
Docker 要求非 localhost 访问的镜像仓库必须使用
HTTPS
或者配置insecure-registry
,否则在另一台机器上是无法直接访问到本地镜像仓库的,在这说明下如何构建一个支持 HTTPS 访问的安全镜像仓库:
● 拥有一个合法的域名,并且可以正确解析到镜像服务器;
● 从证书颁发机构(CA)获取一个证书。
命令说明:域名为regisry.mydocker.io
,把主机上的证书文件挂载到了容器的 /certs 目录下,同时通过-e
参数设置 HTTPS 相关的环境变量参数,最后让仓库在主机上监听443
端口。
$ docker run -d \
--name registry \
-v "/var/lib/registry/data:/var/lib/registry \
-v "/var/lib/registry/certs:/certs \
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/regisry.mydocker.io.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/regisry.mydocker.io.key \
-p 443:443 \
registry:2.7
### 远程主机推送镜像
$ docker tag busybox regisry.mydocker.io/busybox
$ docker push regisry.mydocker.io/busybox
私有仓库进阶
Docker 官方开源的镜像仓库仅满足了镜像存储和管理的功能,用户权限管理相对较弱,并且缺少管理界面;此处推荐一个基于 Distribution 项目开发的一款企业级镜像管理软件为
Harbor
,拥有 RBAC(基于角色的访问控制)、管理用户界面以及审计等非常完善的功能。