什么是 Docker Registry
Registry 是一个开源的,无状态的(stateless),高可扩展的(highly scalable)服务器端应用,用来存储和获取你的分布式 Docker 镜像。
Registry 是一个存储(storage)和内容分发(content delivery)系统,持有命名的(named)Docker 镜像,通过使用不同的标签版本来区分。
Example: the image
distribution/registry, with tags2.0and2.1.
使用 docker 的 push 和 pull 命令来和仓库交互。
Example:
docker pull registry-1.docker.io/distribution/registry:2.1.
理解镜像命名
在 docker 命令中使用镜像名称来反映他们的来源:
docker pull ubuntu表示 docker 从官方的 Docker Hub 中拉取名称为ubuntu的镜像。这是命令docker pull docker.io/library/ubuntu的简写。docker pull myregistrydomain:port/foo/bar表示 docker 从位于myregistrydomain:port的仓库中寻找镜像foo/bar。
部署仓库服务器
部署仓库之前,需要在主机上安装 Docker,一个仓库是一个运行在 Docker 中的 registry 镜像。
运行一个本地仓库
使用如下命令行来开始一个仓库容器:
$ docker run -d -p 5000:5000 --restart=always --name registry registry:2
这样仓库便准备好被使用。
从 Docker Hub 中复制一个镜像到你的仓库中
-
从 Docker Hub 中拉取
ubuntu:16.04镜像:$ docker pull ubuntu:16.04 -
将镜像重新标签为
localhost:5000/my-ubuntu。这将创建一个当前镜像的额外标签。$ 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
如果出现无法从私有仓库 pull 或者 push,有如下报错情况:
Error response from daemon: Get myregistryhost:5000/v1/_ping: http: server gave HTTP response to HTTPS client
这是因为启动的 registry 服务不是安全可信赖的,需要在 docker 的 /etc/docker 目录下编辑deamon.json,添加下面内容:
$ tee /etc/docker/daemon.json << EOF
{ "insecure-registries":["myregistryhost:5000"] }
EOF
停止一个本地仓库
使用停止容器的命令来停止仓库:
$ docker container stop registry
使用 docker container m 删除容器:
$ docker container stop registry \
&& docker container rm -v registry
基本配置
可以通过在 docker run 命令中添加参数和选项来配置容器
仓库自动启动
通过使用 --restart=always 来设置仓库随 Docker 自动重启。
定制发布的端口
如果 5000 端口已被占用,或者要启动多个仓库,可以定制仓库的端口。通过 -p 来设置,第一部分是仓库在主机运行的端口,第二部分是仓库在容器内的监听端口。
docker run -d -p 5001:5000 \
--name registry-test registry:2
定制本地存储
在默认情况下,你的仓库数据被持久化在主机文件系统的 docker volume,可以通过 bind mount 将主机的某个目录 bind-mount 到仓库容器的 /var/lib/registry/(仓库数据在容器中的位置):
$ docker run -d -p 5000:5000 \
--restart=always --name registry \
-v /mnt/registry:/var/lib/registry \
registry:2
本地认证访问控制
为了使本地仓库可以对其它主机可用,在网络间安全使用,需要使用 TLS 来进行配置。本文暂不介绍 TLS 配置外部可访问性,详见官网。
本地认证访问控制使用 htpasswd 来存储密文:
-
为用户
testuser创建一个密码文件,密码为testpasswd:$ mkdir auth $ docker run --entrypoint htpasswd \ registry:2 -Bbn testuser testpasswd > auth/htpasswd -
停止仓库:
$ docker container stop registry -
使用基础认证启动仓库:
$ docer run -d -p 5000:5000 \ --restart=always --name registry \ -v \`pwd\`/auth:/auth \ -e "REGISTRY_AUTH=htpasswd" \ -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \ -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \ -v \`pwd\`/registry:/var/lib/registry \ registry:2 -
尝试使用 pull 或者 push,都会失败。需要登录仓库:
$ docker login myregistrydomain.com:5000退出仓库:
docker logout myregistrydomain.com:5000
参考资料
[1] https://docs.docker.com/registry/deploying/#/running-a-domain-registry “Deploy a registry server”
[2] https://www.jianshu.com/p/7918c9af45a3 “docker私有仓库搭建并且配置仓库认证”
DockerRegistry是一个用于存储和分发Docker镜像的无状态、高可扩展的服务器端应用。本文介绍了Registry的工作原理,包括如何部署本地仓库、推送和拉取镜像,以及进行本地认证访问控制。
424

被折叠的 条评论
为什么被折叠?



