Docker 容器技术 — Private Registry
Posted 范桂飓
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker 容器技术 — Private Registry相关的知识,希望对你有一定的参考价值。
目录
文章目录
Docker Registry
- 官方文档:https://docs.docker.com/registry/
Docker Registry 是一个存储 Images 的仓库。在 Docker 的运行过程中,Daemon 会与 Registry 通信,并实现了搜索镜像、下载镜像、上传镜像三个功能,这三个功能对应的 Job 分别为 search、pul 与 push。
Docker Registry 分为两大类型:
- Pubilc Registry:如 Docker Hub,可以从中找到来自开源项目、软件供应商、乃至个人账户的 Docker Image。
- Private Registry:这样可以保证容器镜像的获取在内网完成。
NOTE:Registry(注册表)和 Repository(仓库)是有区别的,Daemon 可以 Push/Pull Repository,也可以 Push/Pull Image。
- 每个 Registry 上可以存放多个 Repository。
- 每个 Repository 中又包含了多个 Images。
- 每个 Image 有着不同的 Tag(标签)。
当 Docker Server 的 Local Images 不存在时,才会到 Remote Registry/Repository 下载 Images。
Private Registry
Pubilc Registry 有着明显的缺陷:
- Push 和 Pull 的速度慢,带宽大。
- 隐私安全性差。
所以,在生产环节中的多数时候还是需要创建自己的 Private Registry。
搭建 Private Registry 有两种方式:
- 使用 Docker 提供的 docker-distribution:可以通过 Docker Container 或者 YUM 的方式安装。采用 Docker Container 安装的话,需要把 Image Storage Directory(镜像存储目录)挂载到宿主机的某目录下持久化数据,防止容器意外中止或者删除导致 Repository(仓库)不可用。此种 Registry 功能比较单一。
- 使用 Harbor:这是 VMware 基于 docker-distribution 二次开发的软件,功能强大,现已加入了 CNCF。
使用 docker-distribution 搭建 Private Registry
软件包安装
- 安装 docker-distribution,在 Host 192.168.1.226 上搭建 Private Registry。
$ yum -y install docker-distribution
# 镜像会储存在 /var/lib/registry 下,默认监听在 HTTP 5000 端口。
$ cat /etc/docker-distribution/registry/config.yml
version: 0.1
log:
fields:
service: registry
storage:
cache:
layerinfo: inmemory
filesystem:
rootdirectory: /var/lib/registry
http:
addr: :5000
$ systemctl start docker-distribution && systemctl enable docker-distribution && systemctl status docker-distribution
$ netstat -lpntu | grep 500
tcp6 0 0 :::5000 :::* LISTEN 8512/registry
- 从 Docker1 上传 Image 到 Private Registry。
# 配置 Private Registry 地址,并配置支持 HTTP insecure 方式推送镜像。
$ vi /etc/docker/daemon.json
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
],
"insecure-registries": ["192.168.1.226:5000"]
}
$ systemctl restart docker.service
$ docker pull docker.io/busybox
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/busybox latest 69593048aa3a 7 days ago 1.24 MB
# Image repo name 的格式为 <private_registry_ip:port>/name 才可以与配置中的 insecure-registries 匹配上。
$ docker tag docker.io/busybox:latest 192.168.1.226:5000/busybox:latest
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.1.226:5000/busybox latest 69593048aa3a 7 days ago 1.24 MB
docker.io/busybox latest 69593048aa3a 7 days ago 1.24 MB
$ docker push 192.168.1.226:5000/busybox:latest
The push refers to a repository [192.168.1.226:5000/busybox]
5b8c72934dfc: Pushed
latest: digest: sha256:dca71257cd2e72840a21f0323234bb2e33fea6d949fa0f21c5102146f583486b size: 527
- 在 Private Registry 查看 Images 文件。
$ ll /var/lib/registry/docker/registry/v2/repositories/
drwxr-xr-x 5 root root 55 6月 15 23:08 busybox
- Docker2 从 Private Registry 拉取 Docker1 上传的 Images
$ vim /etc/docker/daemon.json
{
"insecure-registries": ["192.168.1.226:5000"]
}
$ systemctl restart docker.service
$ docker pull 192.168.1.226:5000/busybox
Using default tag: latest
Trying to pull repository 192.168.1.226:5000/busybox ...
latest: Pulling from 192.168.1.226:5000/busybox
b71f96345d44: Pull complete
Digest: sha256:dca71257cd2e72840a21f0323234bb2e33fea6d949fa0f21c5102146f583486b
Status: Downloaded newer image for 192.168.1.226:5000/busybox:latest
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.1.226:5000/busybox latest 69593048aa3a 7 days ago 1.24 MB
Docker Container 安装(推荐)
使用 Docker Container 来安装 docker-distribution 并搭建成为 Private Registry 是一种简易的手段。
# 将宿主机的 /opt/registry 挂载到容器的 /var/lib/registry。
$ docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:2
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/registry 2 1fd8e1b0bb7e 2 months ago 26.2 MB
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
59f0159a62c4 registry:2 "/entrypoint.sh /e..." 26 seconds ago Up 25 seconds 0.0.0.0:5000->5000/tcp registry
$ netstat -lpntu | grep 5000
tcp6 0 0 :::5000 :::* LISTEN 21070/docker-proxy-
- 查看 Docker Container 的进程:
$ docker exec -it -u root 59f0159a62c4 ps -ef
PID USER TIME COMMAND
1 root 0:00 registry serve /etc/docker/registry/config.yml
16 root 0:00 ps -ef
$ docker exec -it -u root 59f0159a62c4 cat /etc/docker/registry/config.yml
version: 0.1
log:
fields:
service: registry
storage:
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
http:
addr: :5000
headers:
X-Content-Type-Options: [nosniff]
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
可见,跟我们手动安装的方式没有本质的区别。
以上是关于Docker 容器技术 — Private Registry的主要内容,如果未能解决你的问题,请参考以下文章