Docker每天学一点05 - Registry
前面已经学会怎样构建镜像了,这一章介绍怎样分发镜像给多个Docker Host使用, 可以通过复制Dockerfile、将镜像上传至公共Registry、搭建私有Registry三种方式。
这里将后面两种方式,怎样使用公共Registry和搭建私有Registry。
镜像命名
其实就跟maven库管理一样,镜像名字由两部分组成:repository 和 tag:
1 | [image name] = [repository]:[tag] |
如果执行 docker build 时没有指定 tag,会使用默认值 latest。其效果相当于:
1 | docker build -t ubuntu-with-vi:latest |
在实际使用中,我们最好指定版本(也就是标签tag),比如httpd:2.3
我们可以通过 docker tag 命令方便地给镜像打 tag
1 | docker tag myimage-v1.9.1 myimage:1 |
当我们发布2.0版本的时候,将latest换成2.0版本:
1 | docker tag myimage-v2.0.0 myimage:2 |
使用公共 Registry
保存和分发镜像的最直接方法就是使用 Docker Hub。
Docker Hub 是 Docker 公司维护的公共 Registry。 用户可以将自己的镜像保存到 Docker Hub 免费的 repository 中。 如果不希望别人访问自己的镜像,也可以购买私有 repository。
1. 首先在 Docker Hub 上面注册一个账号。
2. 在 Docker Host 上登录:
1 | docker login -u yidao620 |
这里用的是我自己的账号,用户名为 yidao620,输入密码后登录成功。
3. 修改镜像的 repository 使之与 Docker Hub 账号匹配。
Docker Hub 为了区分不同用户的同名镜像,镜像的 registry 中要包含用户名,完整格式为:[username]/xxx:tag
我们通过 docker tag 命令重命名镜像,我要把之前下载的httpd上传上去。
1 | docker tag httpd yidao620/httpd:v1 |
注:Docker 官方自己维护的镜像没有用户名,比如 httpd
4. 通过 docker push 将镜像上传到 Docker Hub:
1 | docker push yidao620/httpd:v1 |
Docker 会上传镜像的每一层。因为 yidao620/httpd:v1
这个镜像实际上跟官方的 httpd 镜像一模一样,
Docker Hub 上已经有了全部的镜像层,所以真正上传的数据很少,大概几秒就完成上传了。
5. 登录 Docker Hub ,在Public Repository 中就可以看到上传的镜像了。
6. 这个镜像可被其他 Docker host 下载使用了。
1 | docker pull yidao620/httpd:v1 |
公共Registry使用很简单,接下来看看怎样搭建本地Registry。
搭建本地Registry
处于安全和网络传输原因,通常企业内部不会再公共仓库上面维护的镜像,而是搭建本地Registry。
1. 启动 Registry 容器,使用的镜像是registry:2
1 | docker run -d -p 5000:5000 -v /myregistry:/var/lib/registry registry:2 |
解释下基本参数:
- -d 是后台启动容器。
- -p 将容器的 5000 端口映射到 Host 的 5000 端口。5000 是 registry 服务端口。端口映射后面讲。
- -v 将容器 /var/lib/registry 目录映射到 Host 的 /myregistry,用于存放镜像数据。-v 的使用后面讲。
2. 通过 docker tag
重命名镜像,使之与 registry 匹配
1 | docker tag yidao620/httpd:v1 localhost:5000/yidao620/httpd:v1 |
我们在镜像的前面加上了运行 registry 的主机名称和端口。
前面已经讨论了镜像名称由 repository 和 tag 两部分组成。
而 repository 的完整格式为:[registry-host]:[port]/[username]/xxx
只有 Docker Hub 上的镜像可以省略 [registry-host]:[port]
。
3. 通过 docker push
上传镜像至本地 Registry
1 | docker push localhost:5000/yidao620/httpd:v1 |
4. 现在可以通过 docker pull
从本地Registry拉取镜像了
1 | docker pull localhost:5000/yidao620/httpd:v1 |
除了镜像的名称长一些(包含 registry host 和 port),使用方式完全一样。
以上是搭建本地 registry 的简要步骤。当然 registry 也支持认证,https 安全传输等特性, 具体可以参考官方文档 https://docs.docker.com/registry/configuration/
删除和搜索镜像
删除镜像使用 rmi
命令,只能删除 host 上的镜像,不会删除 registry 的镜像。
如果一个镜像对应了多个 tag,只有当最后一个 tag 被删除时,镜像才被真正删除。
1 | docker rmi centos:latest |
搜索镜像使用 search
命令,无需打开浏览器就能搜索 Docker Hub 中的镜像:
1 | docker search httpd |