目录

1、Docker Hub镜像仓库的使用

1.1 注册账号并登录

1.2 创建一个公开/私有仓库

1.3 在命令行中登录/退出Docker Hub

1.4 对本地镜像打tag编号

1.5 将镜像推送到Docker Hub的Registry

1.6 从Docker Hub下载镜像到本地

2、私有仓库的搭建和使用

2.1 使用docker-registry搭建私有仓库

2.2 上传镜像到本地私有仓库

2.3 查看及下载仓库中的镜像

2.4 进入仓库的docker容器,查看空间占用情况

2.5 删除仓库中的镜像


1、Docker Hub镜像仓库的使用

1.1 注册账号并登录

Docker仓库是和github类似的仓库,用于存放自己的镜像。可以创建私有和公开的仓库。私有的仓库免费的有限制(只能创建一个仓库),公开的没有限制。要将镜像上传到官方公共仓库,首先要有一个帐号,注册地址:docker 官网。注册信息填写提交后,注册邮箱会收到一封激活邮件,点击激活链接就可以登录docker官网使用了。

1.2 创建一个公开/私有仓库

docker私有安全仓库搭建 dockerhub私有_DockerHub仓库镜像下载

1.3 在命令行中登录/退出Docker Hub

可以通过执行 docker login 命令交互式的输入用户名及密码来完成在命令行界面登录 Docker Hub,通过 docker logout 退出登录。

登录方式一

$ 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: 输入用户名
Password: 输入密码
Login Succeeded

 登录方式二

root@xnzysq20210118001:~# docker login -u 用户名
Password: 输入密码
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

登录方式三

root@xnzysq20210118001:~# docker login --username=用户名 --password=密码
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

退出方式

root@xnzysq20210118001:~# docker logout
Removing login credentials for https://index.docker.io/v1/

使用docker info命令查看仓库信息

docker私有安全仓库搭建 dockerhub私有_DockerHub仓库镜像下载_02

1.4 对本地镜像打tag编号

上传镜像前我们必须通过 docker tag 命令修改镜像的 repository,使之与 Docker Hub 账号匹配,若不匹配则无法上传到 Docker Hub 仓库。

  • Docker Hub 为了区分不同用户的同名镜像,镜像的 registry 中要包含用户名,完整格式为:[username]/xxx:tag
#docker tag 旧名称 新名称

docker tag <existing-image>  <hub-user>/<repo-name>[:<tag>]  
# tag不指定默认为latest
# hub-user是docker hub的账户名
# repo-name就是1.2创建时候的仓库名称,或者为要上传的仓库名称

# 示例如下,注意命令的前后不能有空格
docker tag tomcat:9.0.54-jdk8 kongzid/java:tomcat9.0.54-jdk8

docker私有安全仓库搭建 dockerhub私有_docker私有安全仓库搭建_03

1.5 将镜像推送到Docker Hub的Registry

使用docker push 命令将打好tag编号的镜像上传到Docker Hub的Registry。若是上传到私有仓库,仅自己能看到及下载使用,若上传到公有仓库,则可以被任何用户看到并下载。

# docker push REPOSITORY:TAG
docker push kongzid/java:tomcat9.0.54-jdk8

docker私有安全仓库搭建 dockerhub私有_搭建使用私有仓库_04

登录Docker Hub仓库查看镜像已上传。

docker私有安全仓库搭建 dockerhub私有_搭建使用私有仓库_05

1.6 从Docker Hub下载镜像到本地

使用docker pull命令将镜像下载到本地,若是Docker Hub私有仓库的镜像需要先登录。因为下载的镜像在本地已存在,所以先通过docker rmi 命令删除本地镜像后再下载。

# 删除本地镜像kongzid/java:tomcat9.0.54-jdk8
docker rmi kongzid/java:tomcat9.0.54-jdk8

# 查看本地镜像列表,kongzid/java:tomcat9.0.54-jdk8已不存在
docker images

# docker pull 镜像仓库:镜像tag, 下载镜像到本地
docker pull kongzid/java:tomcat9.0.54-jdk8

# 查看本地镜像列表,kongzid/java:tomcat9.0.54-jdk8已下载到本地
docker images

docker私有安全仓库搭建 dockerhub私有_docker私有安全仓库搭建_06

2、私有仓库的搭建和使用

有时候使用 Docker Hub 这样的公共仓库可能不方便,用户可以创建一个本地仓库供私人使用。

2.1 使用docker-registry搭建私有仓库

docker-registry 是官方提供的工具,可以用于构建私有的镜像仓库。搭建私有仓库命令:

docker run -d -p 5000:5000 --restart=always --name registry2 registry:2

# 也可以不指定版本,则默认下载latest
docker run -d -p 5000:5000 --restart=always --name registry2 registry

这里在启动镜像的时候会先去下载registry 2.0(不指定版本下载latest),--restart=alwarys 标识当docker daemon启动的时候一起启动。

这将使用官方的 registry 镜像来启动私有仓库,运行上述命令后一个docker私服就已经创建并启动好了。默认情况下,仓库会被创建在容器的 /var/lib/registry 目录下,可以通过 -v 参数来将镜像文件存放在本地的指定路径。例如下面的例子将上传的镜像放到本地的 /opt/data/registry 目录。

docker run -d --name registry2 \
    -p 5000:5000 \
    --restart=always \
    -v /opt/data/registry:/var/lib/registry \
    registry

创建私有仓库

docker私有安全仓库搭建 dockerhub私有_DockerHub仓库镜像下载_07

2.2 上传镜像到本地私有仓库

1)上传镜像到本地私有仓库

私有仓库地址为 127.0.0.1:5000(或localhost:5000),上传本地镜像 mysql:8.0.26 到私有仓库命令:  

# 上传本地镜像到本地私有仓库
docker push localhost:5000/mysql:8.0.26
或
docker push 127.0.0.1:5000/mysql:8.0.26

运行后发现上述命令报错,具体信息如下:

root@xnzysq20210118001:~# docker push localhost:5000/mysql:8.0.26
The push refers to repository [localhost:5000/mysql]
An image does not exist locally with the tag: localhost:5000/mysql
root@xnzysq20210118001:~#

这是由于docker默认镜像仓库是dockerhub,所以mysql:8.0.26相当于docker.io/mysql:8.0.26,因此,想要将镜像推送到私服仓库中,需要修改镜像标签。

2)修改镜像标签

修改镜像标签实际是使用 docker tag 来标记一个镜像。

docker tag mysql:8.0.26 localhost:5000/mysql:8.0.26

docker私有安全仓库搭建 dockerhub私有_docker_08

3)重新上传镜像到本地私有仓库

使用命令 docker push localhost:5000/mysql:8.0.26

docker私有安全仓库搭建 dockerhub私有_DockerHub仓库镜像上传_09

2.3 查看及下载仓库中的镜像

1)用 curl 查看仓库中的镜像及标签

# 查看私服镜像所有仓库
curl http://localhost:5000/v2/_catalog

# 查看mysql仓库中镜像的所有标签列表(mysql为仓库名称,查询其他仓库需要修改这个地方)
curl http://localhost:5000/v2/mysql/tags/list

docker私有安全仓库搭建 dockerhub私有_DockerHub仓库镜像上传_10

结果:{"repositories":["mysql"]} ,表明有个mysql仓库,结果:{"name":"mysql","tags":["8.0.26"]}
,表明镜像已经被成功上传了。

2)下载仓库镜像

先删除已有镜像,再尝试从私有仓库中下载这个镜像。

# 删除本地镜像
docker rmi localhost:5000/mysql:8.0.26
# 下载镜像到本地
docker pull localhost:5000/mysql:8.0.26
# 查看本地镜像列表
docker images

2.4 进入仓库的docker容器,查看空间占用情况

进入仓库的docker容器中,通过du命令查看大小。

root@xnzysq20210118001:~# docker exec -it registry2 sh
/ # du -chs /var/lib/registry/
143.9M	/var/lib/registry/
143.9M	total
/ #

2.5 删除仓库中的镜像

docker私有安全仓库搭建 dockerhub私有_docker_11

由上图可以看出API需要一个name参数和一个摘要参数。

#删除镜像对应的API如下:
DELETE /v2/<name>/manifests/<reference>

name:镜像名称
reference: 镜像对应sha256值

下面提示说如果是2.3及以后的服务,HEAD 必须包含下面的内容才能获取到正确的摘要,我们先来获取这个摘要。

# 注意地址中的mysql和8.0.26分别代表仓库名和标签
curl --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -I -X HEAD  http://localhost:5000/v2/mysql/manifests/8.0.26

docker私有安全仓库搭建 dockerhub私有_DockerHub仓库镜像上传_12

删除镜像命令

curl -I -X DELETE http://localhost:5000/v2/mysql/mainfests/sha256:882e55f40d61034a2bb8a1abab1353571ad2a33866f382350788eb34740528b5
[root@master scripts]#  curl -I -X DELETE http://192.168.0.153:5000/v2/fbgweb/manifests/sha256:6a67ba482a8dd4f8143ac96b1dcffa5e45af95b8d3e37aeba72401a5afd7ab8e
HTTP/1.1 202 Accepted
Docker-Distribution-Api-Version: registry/2.0
X-Content-Type-Options: nosniff
Date: Mon, 13 Nov 2017 13:04:24 GMT
Content-Length: 0
Content-Type: text/plain; charset=utf-8

查看镜像可以看到镜像索引已经被删除。进入仓库的docker容器中,通过du命令查看大小。

root@xnzysq20210118001:~# docker exec -it registry2 sh
/ # du -chs /var/lib/registry/
143.9M	/var/lib/registry/
143.9M	total
/ #

可以看到数据大小没有变化(只删除了元数据)。

垃圾回收

进入容器执行垃圾回收命令,然后查看数据大小,可以看到镜像数据已经被删除。

~ # registry garbage-collect /etc/docker/registry/config.yml 
31 blobs marked, 5 blobs eligible for deletion
blob eligible for deletion: sha256:5e7cf06c8745d0985f94191c60aad8b87371c8a674162525bff0efccdb805931
INFO[0000] Deleting blob: /docker/registry/v2/blobs/sha256/5e/5e7cf06c8745d0985f94191c60aad8b87371c8a674162525bff0efccdb805931  go.version=go1.7.6 instance.id=c38f4c35-9914-4b77-a59f-ea584137fae0
blob eligible for deletion: sha256:6a67ba482a8dd4f8143ac96b1dcffa5e45af95b8d3e37aeba72401a5afd7ab8e
INFO[0000] Deleting blob: /docker/registry/v2/blobs/sha256/6a/6a67ba482a8dd4f8143ac96b1dcffa5e45af95b8d3e37aeba72401a5afd7ab8e  go.version=go1.7.6 instance.id=c38f4c35-9914-4b77-a59f-ea584137fae0
blob eligible for deletion: sha256:966e2fb5980b2a854c03551418af0b2ee2bef082dfaae075026d00fa36620960
INFO[0000] Deleting blob: /docker/registry/v2/blobs/sha256/96/966e2fb5980b2a854c03551418af0b2ee2bef082dfaae075026d00fa36620960  go.version=go1.7.6 instance.id=c38f4c35-9914-4b77-a59f-ea584137fae0
blob eligible for deletion: sha256:a122ad1ef7a033582abfc7bae980cc11bdcc2d19bed7d8ea5b7efc50d16456c8
INFO[0000] Deleting blob: /docker/registry/v2/blobs/sha256/a1/a122ad1ef7a033582abfc7bae980cc11bdcc2d19bed7d8ea5b7efc50d16456c8  go.version=go1.7.6 instance.id=c38f4c35-9914-4b77-a59f-ea584137fae0
blob eligible for deletion: sha256:b29205236f1d3eb6143e95f3a412a8f21a16a10b09c7aee28ecba3d803832285
INFO[0000] Deleting blob: /docker/registry/v2/blobs/sha256/b2/b29205236f1d3eb6143e95f3a412a8f21a16a10b09c7aee28ecba3d803832285  go.version=go1.7.6 instance.id=c38f4c35-9914-4b77-a59f-ea584137fae0