目录
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 创建一个公开/私有仓库
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命令查看仓库信息
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
1.5 将镜像推送到Docker Hub的Registry
使用docker push 命令将打好tag编号的镜像上传到Docker Hub的Registry。若是上传到私有仓库,仅自己能看到及下载使用,若上传到公有仓库,则可以被任何用户看到并下载。
# docker push REPOSITORY:TAG
docker push kongzid/java:tomcat9.0.54-jdk8
登录Docker Hub仓库查看镜像已上传。
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
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
创建私有仓库
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
3)重新上传镜像到本地私有仓库
使用命令 docker push localhost:5000/mysql:8.0.26
2.3 查看及下载仓库中的镜像
1)用 curl 查看仓库中的镜像及标签
# 查看私服镜像所有仓库
curl http://localhost:5000/v2/_catalog
# 查看mysql仓库中镜像的所有标签列表(mysql为仓库名称,查询其他仓库需要修改这个地方)
curl http://localhost:5000/v2/mysql/tags/list
结果:{"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 删除仓库中的镜像
由上图可以看出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
删除镜像命令
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