docker之register搭建私有镜像仓库以及删除docker历史的临时镜像(虚悬镜像)
一,介绍
一般docker提供了Docker Hub来维护管理所有的镜像,但是一般出于安全和网络原因,我们不可能把商业项目上传到docker上,我们会在本地局域网搭建私有镜像仓库。
所谓私有仓库,也就是在本地(局域网)搭建的一个类似公共仓库的东西,搭建好之后,我们可以将镜像提交到私有仓库中。这样我们既能使用 Docker 来运行我们的项目镜像,也避免了商业项目暴露出去的风险。
删除虚悬镜像
1 搞容器开发一段时间后,想看看都有哪些镜像,执行了一下docker images -a,蒙圈了,有一堆
再构建镜像中,多次使用build指令构建Dockerfile,并且镜像的名字以及版本一致的时候,或者多次pull指令,拉取相同名字:相同版本的镜像的时候,就会出现虚悬镜像;
例如:下载了一个nginx默认版本的镜像;
docker pull nginx:latest
过一段时间,再次拉取(相当于更新本地镜像为最新版本)的时候;就会出现虚悬镜像;
2 镜像也有好坏吗?
这些
2.1 好的none
好的
2.2 坏的none
坏的
我们执行docker images查看:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
pkslow/springboot-mongo 0.0.6 f029f9b6e703 28 minutes ago 356MB
pkslow/springboot-mongo latest f029f9b6e703 28 minutes ago 356MB
<none> <none> 56de36189ad6 29 minutes ago 356MB
<none> <none> 9e00dfd258dc 40 hours ago 356MB
<none> <none> 2d736eaaafd0 2 weeks ago 346MB
然后再docker build一次,用同样的标签0.0.6。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
pkslow/springboot-mongo 0.0.6 2119e4fbc6e8 43 seconds ago 356MB
pkslow/springboot-mongo latest 2119e4fbc6e8 43 seconds ago 356MB
<none> <none> f029f9b6e703 30 minutes ago 356MB
<none> <none> 56de36189ad6 31 minutes ago 356MB
<none> <none> 9e00dfd258dc 40 hours ago 356MB
<none> <none> 2d736eaaafd0 2 weeks ago 346MB
认真查看可以得出,以前最新的镜像ID为f029f9b6e703,后来变成了
这些坏坏的镜像也叫dangling images,空悬镜像
单独查看虚悬镜像
docker images -q -f dangling=true
-f:表示filter,过滤
-q:表示只显示镜像ID;
3 如何删除dangling images
既然没用,又还占用空间,不如就删掉它。Docker没有自动删除这些镜像的机制,可以通过以下命令删除:
删除指令镜像
docker rmi $(docker images -q -f dangling=true)
检查一下,已经没有
1) registry 私有镜像仓库常用命令
# 查询registry中所有的镜像名称
curl -XGET http://registry_ip:5000/v2/_catalog
# 依据镜像名称查询镜像版本
curl -XGET http://registry_ip:5000/v2/nginx/tags/list
# 打开镜像的存储目录,如有-V操作打开挂载目录也可以,删除镜像文件夹
docker exec <容器名> rm -rf /var/lib/registry/docker/registry/v2/repositories/<镜像名>
# 利用请求api删除历史遗留的镜像
for i in `ls -t /app/data/registry/registry/docker/registry/v2/repositories \
/dafu/app/shopping-shop-api-test/_manifests/revisions/sha256/ | tail -100`; \
do \
curl -XDELETE http://127.0.0.1:5000/v2/dafu/app/shopping-shop-api-test/manifests/sha256:$i; \
done
# 执行垃圾回收操作,注意2.4版本以上的registry才有此功能
docker exec registry bin/registry garbage-collect /etc/docker/registry/config.yml
2) registry 镜像仓库私有目录说明
# registry默认仓库目录是/var/lib/registry 挂载宿主机上的/data/registry
[root@docker-register ~]# tree /data/registry/
/data/registry/
└── docker
└── registry
└── v2 #仓库版本
├── blobs # 二进制对象斑点(记录所有镜像层级)
│ └── sha256
│ ├── 1c
│ │ └── 1ccc0a0ca577e5fb5a0bdf2150a1a9f842f47c8865e861fa0062c5d343eb8cac
│ │ └── data
│ ├── 38
│ │ └── 388056c9a6838deea3792e8f00705b35b439cf57b3c9c2634fb4e95cfc896de6
│ │ └── data
│ └── f5
│ └── f531cdc67389c92deac44e019e7a1b6fba90d1aaa58ae3e8192f0e0eed747152
│ └── data
└── repositories # 仓库
└── busybox-v0.1 # 镜像名称
├── _layers # 镜像使用到的层次
│ └── sha256
│ ├── 388056c9a6838deea3792e8f00705b35b439cf57b3c9c2634fb4e95cfc896de6
│ │ └── link
│ └── f531cdc67389c92deac44e019e7a1b6fba90d1aaa58ae3e8192f0e0eed747152
│ └── link
├── _manifests # 记录镜像引用的layer(描述镜像的信息)
│ ├── revisions
│ │ └── sha256
│ │ └── 1ccc0a0ca577e5fb5a0bdf2150a1a9f842f47c8865e861fa0062c5d343eb8cac
│ │ └── link
│ └── tags # 镜像的标签
│ └── latest # 最新版本
│ ├── current # 当前
│ │ └── link
│ └── index
│ └── sha256
│ └── 1ccc0a0ca577e5fb5a0bdf2150a1a9f842f47c8865e861fa0062c5d343eb8cac
│ └── link
└── _uploads # 保存镜像push时的数据
28 directories, 8 files
简单步骤参考图
二,环境
服务端机器 (主机名为registry):docker私有仓库服务器,运行registry容器。
测试端机器 (主机名为node):普通的docker服务器,在这台服务器上下载一个测试镜像busybox,然后上传到registry服务器进行测试。
三. 部署
1)registry主机下操作:
1. 下载镜像
docker pull registry
2. 查看镜像是否下载成功
[root@docker-register ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest 1fd8e1b0bb7e 8 days ago 26.2MB
- 运行镜像
docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest
4. 查看镜像仓库中的所有镜像
[root@docker-register ~]# curl -XGET http://127.0.0.1:5000/v2/_catalog
{"repositories":[]}
2)registry节点node主机下操作:
1. 为镜像打标签
10.0.0.50:5000是registry私有镜像服务器的IP地址和端口后面加上镜像的名称 要推送到自己的私有仓库必须加上前缀ip地址和端口的名称
[root@docker-test ~]# docker tag busybox 10.0.0.50:5000/busybox-v0.1
2. 查看打好标签的镜像
[root@docker-test ~]# docker tag busybox 10.0.0.50:5000/busybox-v0.1
[root@docker-test ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
10.0.0.50:5000/busybox-v0.1 latest 388056c9a683 2 weeks ago 1.23MB
busybox latest 388056c9a683 2 weeks ago 1.23MB
3. 上传到镜像服务器
# 推送镜像到自己私有的仓库如果报错
[root@docker-test ~]# docker push 10.0.0.50:5000/busybox-v0.1:latest
The push refers to repository [10.0.0.50:5000/busybox-v0.1]
Get https://10.0.0.50:5000/v2/: http: server gave HTTP response to HTTPS client
# 修改daemon.json文件 添加私有镜像服务器地址
[root@docker-test ~]# vim /etc/docker/daemon.json
{
"insecure-registries": ["10.0.0.50:5000"],
}
# 重启docker服务或则重载
systemctl restar docker
systemctl reload docker
# 推送正常的镜像到自己的私有仓库
[root@docker-test ~]# docker push 10.0.0.50:5000/busybox-v0.2
Using default tag: latest
The push refers to repository [10.0.0.50:5000/busybox-v0.2]
67f770da229b: Mounted from busybox-v0.1
latest: digest: sha256:1ccc0a0ca577e5fb5a0bdf2150a1a9f842f47c8865e861fa0062c5d343eb8cac size: 527
# 推送不是 ip:端口/镜像 格式的镜像默认是推送到官方仓库里面
[root@docker-test ~]# docker push busybox
Using default tag: latest
The push refers to repository [docker.io/library/busybox]
......
四,镜像名字补充
1) 构建同名同版本的不同ID的镜像 会顶掉以前的旧镜像 名字跟Id变成none状态 旧镜像只有一个的情况下
# 查看镜像
[root@docker-test ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test1 latest c4e303a5d487 18 minutes ago 1.23MB
10.0.0.50:5000/test1 latest 5bf3d586f010 41 minutes ago 1.23MB
busybox latest 388056c9a683 2 weeks ago 1.23MB
# 构建一个同名的镜像(test1)
[root@docker-test ~]# docker build -t test1 . --no-cache
Sending build context to Docker daemon 17.92kB
Step 1/2 : from busybox
---> 388056c9a683
Step 2/2 : run mkdir -p /test7
---> Running in 1d1f9efa907f
Removing intermediate container 1d1f9efa907f
---> 22da1e98032d
Successfully built 22da1e98032d
Successfully tagged test1:latest
# 旧同名镜像(test1)名字跟标签变成none状态了
[root@docker-test ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test1 latest 22da1e98032d 4 seconds ago 1.23MB
<none> <none> c4e303a5d487 18 minutes ago 1.23MB
10.0.0.50:5000/test1 latest 5bf3d586f010 42 minutes ago 1.23MB
busybox latest 388056c9a683 2 weeks ago 1.23MB
2) 构建同名同版本的不同ID的镜像 会顶掉以前的旧镜像 名字跟Id变成none状态 旧镜像有两个的情况下
# 查看镜像同ID的个两个
[root@docker-test ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test1 latest 22da1e98032d 4 minutes ago 1.23MB
test2 latest 22da1e98032d 4 minutes ago 1.23MB
<none> <none> c4e303a5d487 23 minutes ago 1.23MB
10.0.0.50:5000/test1 latest 5bf3d586f010 47 minutes ago 1.23MB
busybox latest 388056c9a683 2 weeks ago 1.23MB
# 构建一个已有相同名字的镜像
[root@docker-test ~]# docker build -t test1 . --no-cache
Sending build context to Docker daemon 17.92kB
Step 1/2 : from busybox
---> 388056c9a683
Step 2/2 : run mkdir -p /test7
---> Running in 434da5d47d0b
Removing intermediate container 434da5d47d0b
---> 840a4834a6af
Successfully built 840a4834a6af
Successfully tagged test1:latest
# 旧镜像相同名字的直接不见了
[root@docker-test ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test1 latest 840a4834a6af 1 second ago 1.23MB
test2 latest 22da1e98032d 5 minutes ago 1.23MB
<none> <none> c4e303a5d487 24 minutes ago 1.23MB
10.0.0.50:5000/test1 latest 5bf3d586f010 47 minutes ago 1.23MB
busybox latest 388056c9a683 2 weeks ago 1.23MB