华子目录
docker镜像仓库的管理
1.什么是docker仓库
docker仓库
(docker registry
)是用于存储
和分发
docker镜像
的集中式存储库
它就像一个大型
的镜像仓库
,开发者
可以将自己创建
的docker镜像
推送到仓库中,也可以从仓库
中拉取所需的镜像。
docker仓库
可以分为公共仓库
和私有仓库
:
公共仓库
,如docker hub
,任何人都可以访问和使用其中的镜像
。许多常用的软件和应用都有在docker hub
上提供的镜像,方便用户直接获取和使用。- 例如:您想要部署一个
nginx服务器
,就可以从docker hub
上拉取nginx
的镜像
- 例如:您想要部署一个
私有仓库
则是由组织
或个人自己
搭建和管理的,用于存储内部使用的,不希望公开的镜像。- 例如:
一家企业为其特定的业务应用创建了定制化的镜像,并将其存储在自己的私有仓库中,以保证安全性和控制访问权限
- 例如:
通过docker仓库
,开发者
能够方便地共享和复用镜像
,加速应用的开发和部署过程
。
2.docker hub
- 官网:https://hub.docker.com/
Docker Hub
是Docker官方
提供的一个公共
的镜像仓库服务
。
它是 Docker生态系统
中最知名和广泛使用的镜像仓库
之一,拥有大量的官方和社区贡献的镜像。
以下是 Docker Hub
的一些关键特点和优势
:
丰富的镜像资源
:涵盖了各种常见的操作系统
、编程语言运行
时、数据库、Web 服务器
等众多应用的镜像
。- 例如,您可以轻松找到
Ubuntu
、CentOS
等操作系统的镜像,以及MySQL
、Redis
等数据库
的镜像。
- 例如,您可以轻松找到
官方支持
:提供了由Docker官方
维护的一些重要镜像,确保其质量和安全性。社区贡献
:开发者们可以自由上传和分享他们创建的镜像
,促进了知识和资源的共享
。版本管理
:对于每个镜像
,通常都有多个版本
可供选择,方便用户根据需求获取特定版本
。便于搜索
:用户可以通过关键词
轻松搜索到所需的镜像
。
2.1docker hub
的使用方法
- 登录官方仓库
[root@docker-node1 ~]# docker login
username:huazi086
Password:XXXXXXXXXXX
Login Succeeded
- 登录信息保存位置
[root@docker-node1 ~]# cd .docker/
[root@docker-node1 .docker]# ls
config.json
[root@docker-node1 ~]# cat config.json #存放登录后的认证信息
{
"auth": {
"https://index.docker.io/v1/": {
"auth": "dGltaW5nbGVlojY3NTElMTVtaw5nemxu"
}
}
如果要想上传镜像到仓库,就必须先登录仓库
- 退出登录
[root@docker-node1 ~]# docker logout
[root@docker-node1 ~]# cd .docker/
[root@docker-node1 .docker]# ls
config.json
[root@docker-node1 ~]# cat config.json #存放登录后的认证信息
{
"auth": {}
}
2.2docker仓库的工作原理
仓库中的三个角色
index docker索引服务
,负责并维护有关用户账户、镜像的校验以及公共命名空间的信息。registry docker仓库
,是镜像和图表的仓库,它不具有本地数据库以及不提供用户认证,通过Index Auth service
的Token
的方式进行认证
Registry Client Docker
充当registry客户端
来维护推送和拉取,以及客户端的授权。
2.3pull原理
镜像拉取分为以下几步:
docker客户端
向index
发送镜像拉取请求
并完成与index的认证
index发送
认证token
和镜像位置
给docker client
docker client
携带token
和根据index指引的镜像
位置去连接registry
registry
会根据client
持有的token
跟index
核实身份合法性
index
确认此token合法性
registry
会根据client
的请求
传递镜像到客户端
2.4push原理
镜像上传的步骤:
client
向index
发送上传请求
并完成用户认证
index
会发送token
给client
来证明client的合法性
client
携带index
提供的token
连接Registry
Registry
向index
核实token
的合法性
index
证实token
的合法性
Registry
开始接收客户端
上传过来的镜像
搭建docker的私有仓库
1.为什么要搭建私有仓库
docker hub
虽然方便
,但是还是有限制
- 需要
internet
连接,速度慢
所有人都可以访问
- 由于
安全原因
,企业不允许将镜像
放到外网
好消息是docker
公司已经将registry开源
,我们可以快速构建企业私有仓库
2.搭建简单的registry
仓库
- 下载
registry
镜像
#由于拉取失败,我们上传本地的镜像
[root@docker-node1 ~]# docker pull registry
Using default tag: latest
Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
#上传本地的registry镜像仓库
- 导入镜像
[root@docker-node1 ~]# docker load -i registry.tag.gz
ce7f800efff9: Loading layer [==================================================>] 7.644MB/7.644MB
30609d4f10dd: Loading layer [==================================================>] 792.6kB/792.6kB
3b6a51496c9d: Loading layer [==================================================>] 17.55MB/17.55MB
e704e9e3e9dc: Loading layer [==================================================>] 3.584kB/3.584kB
f019f591461d: Loading layer [==================================================>] 2.048kB/2.048kB
Loaded image: registry:latest
[root@docker-node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest cfb4d9904335 12 months ago 25.4MB
nginx 1.23 a7be6198544f 16 months ago 142MB
- 查看每层信息
[root@docker-node1 ~]# docker history registry:latest
IMAGE CREATED CREATED BY SIZE COMMENT
cfb4d9904335 12 months ago CMD ["/etc/docker/registry/config.yml"] 0B buildkit.dockerfile.v0
<missing> 12 months ago ENTRYPOINT ["/entrypoint.sh"] 0B buildkit.dockerfile.v0
<missing> 12 months ago COPY docker-entrypoint.sh /entrypoint.sh # b… 155B buildkit.dockerfile.v0
<missing> 12 months ago EXPOSE map[5000/tcp:{}] 0B buildkit.dockerfile.v0
<missing> 12 months ago VOLUME [/var/lib/registry] 0B buildkit.dockerfile.v0
<missing> 12 months ago COPY ./config-example.yml /etc/docker/regist… 295B buildkit.dockerfile.v0
<missing> 12 months ago RUN /bin/sh -c set -eux; version='2.8.3'; … 17.5MB buildkit.dockerfile.v0
<missing> 12 months ago RUN /bin/sh -c apk add --no-cache ca-certifi… 531kB buildkit.dockerfile.v0
<missing> 12 months ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B
<missing> 12 months ago /bin/sh -c #(nop) ADD file:5851aef23205a072e… 7.35MB
我们可以看到它暴露了5000
端口
- 开启
registry
- 这里,我们可以添加一个
--restart=always
的容器重启策略,意思是:不管什么原因docker容器
挂掉了,都会重启
。这样做的好处是:当我们在重启docker进程后,该容器会自动重启
。否则重启docker进程后,容器会停止
[root@docker-node1 ~]# docker run -d -p 5000:5000 --restart=always --name docker_registry registry
04bcd71180c5757b79a8f9b892678ba01692d34fff7237e82f693ef64163d8f0
[root@docker-node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
04bcd71180c5 registry "/entrypoint.sh /etc…" 5 seconds ago Up 4 seconds 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp docker_registry
- 做软链接
#做软链接
[root@docker-node1 ~]# docker tag nginx:1.23 172.25.254.100:5000/nginx:v1
[root@docker-node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest cfb4d9904335 12 months ago 25.4MB
172.25.254.100:5000/nginx v1 a7be6198544f 16 months ago 142MB
nginx 1.23 a7be6198544f 16 months ago 142MB
- 上传镜像
[root@docker-node1 ~]# docker push 172.25.254.100:5000/nginx:v1
Using default tag: latest
The push refers to repository [172.25.254.100:5000/nginx]
Get "https://172.25.254.100:5000/v2/": http: server gave HTTP response to HTTPS client
发现上传失败,原因是:docker
在上传镜像
的过程中使用http或https
,但是我们并没有建立http或https认证
,所以会上传失败
http非加密传输
- 使用
http认证
,在上传过程中数据不加密
[root@docker-node1 ~]# cat /etc/docker/daemon.json
{
"insecure-registries": ["http://172.25.254.100:5000"]
}
[root@docker-node1 ~]# systemctl restart docker
[root@docker-node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0c8cc73e4b4c registry "/entrypoint.sh /etc…" 15 seconds ago Up 2 seconds 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp docker_registry
上传镜像
[root@docker-node1 ~]# docker push 172.25.254.100:5000/nginx:v1
The push refers to repository [172.25.254.100:5000/nginx]
4d33db9fdf22: Pushed
6791458b3942: Pushed
2731b5cfb616: Pushed
043198f57be0: Pushed
5dd6bfd241b4: Pushed
8cbe4b54fa88: Pushed
v1: digest: sha256:a97a153152fcd6410bdf4fb64f5622ecf97a753f07dcc89dab14509d059736cf size: 1570
[root@docker-node1 ~]# docker inspect docker_registry
"Mounts": [
{
"Type": "volume",
"Name": "70ae22e2886d9a2629a4be9b4dde485c5e83f3605d2491c3917fa62cce85d18c",
"Source": "/var/lib/docker/volumes/70ae22e2886d9a2629a4be9b4dde485c5e83f3605d2491c3917fa62cce85d18c/_data",
"Destination": "/var/lib/registry",
[root@docker-node1 ~]# cd /var/lib/docker/volumes/70ae22e2886d9a2629a4be9b4dde485c5e83f3605d2491c3917fa62cce85d18c/_data
[root@docker-node1 _data]# ls
docker
[root@docker-node1 _data]# cd docker/
[root@docker-node1 docker]# ls
registry
[root@docker-node1 docker]# cd registry/
[root@docker-node1 registry]# ls
v2
[root@docker-node1 registry]# cd v2/
[root@docker-node1 v2]# ls
blobs repositories
[root@docker-node1 v2]# cd repositories/
[root@docker-node1 repositories]# ls
nginx
- 查看有没有上传成功
[root@docker-node1 ~]# curl 172.25.254.100:5000/v2/_catalog
{"repositories":["nginx"]}
- 再上传一个
ubuntu镜像
[root@docker-node1 ~]# docker tag ubuntu:latest 172.25.254.100:5000/ubuntu.v1
[root@docker-node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
172.25.254.100:5000/ubuntu.v1 latest edbfe74c41f8 8 weeks ago 78.1MB
ubuntu latest edbfe74c41f8 8 weeks ago 78.1MB
registry latest cfb4d9904335 12 months ago 25.4MB
nginx 1.23 a7be6198544f 16 months ago 142MB
172.25.254.100:5000/nginx v1 a7be6198544f 16 months ago 142MB
[root@docker-node1 ~]# docker push 172.25.254.100:5000/ubuntu.v1:latest
The push refers to repository [172.25.254.100:5000/ubuntu.v1]
f36fd4bb7334: Pushed
latest: digest: sha256:506f330a66a341888e5c3fbcff9f97d2b1f19a31a5c359f766bcc70a4d7bd39a size: 529
#可以看到上传成功
[root@docker-node1 ~]# curl 172.25.254.100:5000/v2/_catalog
{"repositories":["nginx","ubuntu.v1"]}
[root@docker-node1 ~]#
htttps加密传输
https认证
,在上传过程中数据加密
- 先把
daemon.json
中的内容删了 - 建立
认证目录
[root@docker-node1 ~]# mkdir certs
[root@docker-node1 ~]# ls
公共 下载 certs
- 做
hosts解析
[root@docker-node1 ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.254.100 reg.huazi.com
[root@docker-node1 ~]# ping reg.huazi.com
PING reg.huazi.com (172.25.254.100) 56(84) 比特的数据。
64 比特,来自 reg.huazi.com (172.25.254.100): icmp_seq=1 ttl=64 时间=0.099 毫秒
64 比特,来自 reg.huazi.com (172.25.254.100): icmp_seq=2 ttl=64 时间=0.171 毫秒
64 比特,来自 reg.huazi.com (172.25.254.100): icmp_seq=3 ttl=64 时间=0.067 毫秒
^C
--- reg.huazi.com ping 统计 ---
已发送 3 个包, 已接收 3 个包, 0% packet loss, time 2063ms
rtt min/avg/max/mdev = 0.067/0.112/0.171/0.043 ms
- 做
证书和key
[root@docker-node1 ~]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/huazi.com.key -addext "subjectAltName = DNS:reg.huazi.com" -x509 -days 365 -out certs/huazi.com.crt
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:shanxi
Locality Name (eg, city) [Default City]:xi'an
Organization Name (eg, company) [Default Company Ltd]:docker
Organizational Unit Name (eg, section) []:registry
Common Name (eg, your name or your server's hostname) []:reg.huazi.com
Email Address []:admin@huazi.com
[root@docker-node1 ~]# cd certs/
[root@docker-node1 certs]# ls
huazi.com.crt huazi.com.key
- 做数据持久化目录(由于我们发现,
registry镜像
声明的挂载目录
是/var/lib/registry
)
[root@docker-node1 ~]# mkdir /opt/registry
- 启动容器
[root@docker-node1 ~]# docker run -d -p 443:443 --restart=always --name docker_registry -v /root/certs/:/certs -v /opt/registry/:/var/lib/registry -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/huazi.com.crt -e REGISTRY_HTTP_TLS_KEY=/certs/huazi.com.key registry
[root@docker-node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a0348ed07547 registry "/entrypoint.sh /etc…" 3 seconds ago Up 3 seconds 0.0.0.0:443->443/tcp, :::443->443/tcp, 5000/tcp docker_registry
- 我们之前做的
证书和key
是在registry服务端
做的,要想进行https加密通信
,我们的客户端
就需要从服务端下载证书
#这里我们将证书复制给客户端即可
[root@docker-node1 ~]# mkdir -p /etc/docker/certs.d/reg.huazi.com/
[root@docker-node1 ~]# cp /root/certs/huazi.com.crt /etc/docker/certs.d/reg.huazi.com/ca.crt
[root@docker-node1 ~]# systemctl restart docker
- 做软链接
注意:做软链接时,由于我们前面做了hosts解析,所以这里要写域名,不能写ip
,否则会上传失败
[root@docker-node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest edbfe74c41f8 2 months ago 78.1MB
registry latest cfb4d9904335 12 months ago 25.4MB
nginx 1.23 a7be6198544f 16 months ago 142MB
[root@docker-node1 ~]# docker tag ubuntu:latest reg.huazi.com/ubuntu.v2
[root@docker-node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
reg.huazi.com/ubuntu.v2 latest edbfe74c41f8 2 months ago 78.1MB
ubuntu latest edbfe74c41f8 2 months ago 78.1MB
registry latest a7be6198544f 16 months ago 142MB
nginx 1.23 a7be6198544f 16 months ago 142MB
上传镜像
[root@docker-node1 ~]# docker push reg.huazi.com/ubuntu.v2
Using default tag: latest
The push refers to repository [reg.huazi.com/ubuntu.v2]
f36fd4bb7334: Pushed
latest: digest: sha256:506f330a66a341888e5c3fbcff9f97d2b1f19a31a5c359f766bcc70a4d7bd39a size: 529
上传成功
#进入数据卷
[root@docker-node1 ~]# cd /opt/registry/
[root@docker-node1 registry]# ls
docker
[root@docker-node1 registry]# cd docker/
[root@docker-node1 docker]# ls
registry
[root@docker-node1 docker]# cd registry/
[root@docker-node1 registry]# ls
v2
[root@docker-node1 registry]# cd v2/
[root@docker-node1 v2]# ls
blobs repositories
[root@docker-node1 v2]# cd repositories/
[root@docker-node1 repositories]# ls
ubuntu.v2
验证
[root@docker-node1 ~]# curl -k https://reg.huazi.com/v2/_catalog
{"repositories":["ubuntu.v2"]}
为仓库建立登录认证
为什么要做登录认证呢?
- 因为我们在
上传镜像
的时候,需要先登录到仓库
- 由于上面
http和https
传输之前没有做登录仓库的认证
- 所以这里我们需要实现
登录认证后才能上传镜像
这里我们配置带https
的登录认证
- 安装建立认证文件的工具包
[root@docker-node1 ~]# yum install httpd-tools -y
- 建立认证文件
[root@docker-node1 ~]# mkdir auth
[root@docker-node1 ~]# htpasswd -Bc auth/.htpasswd huazi #huazi为用户
New password:
Re-type new password:
Adding password for user huazi
[root@docker-node1 ~]# cat auth/.htpasswd
huazi:$2y$05$rDnzAFRF/hrJ6xot7//pKuv83s/OcOSbk1VqlSqHa/kCrP2sv2vzS
- 添加认证到registry容器中
[root@docker-node1 ~]# docker run -d -p 443:443 --restart=always --name docker_registry -v /root/certs/:/certs -v /opt/registry/:/var/lib/registry -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/huazi.com.crt -e REGISTRY_HTTP_TLS_KEY=/certs/huazi.com.key -v /root/auth/:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/.htpasswd registry
cc635ee3208627f020286115e5b635544e4a393fea8103e26612daba2d5db051
[root@docker-node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a32a54198081 registry "/entrypoint.sh /etc…" 3 seconds ago Up Less than a second 0.0.0.0:443->443/tcp, :::443->443/tcp, 5000/tcp docker_registry
测试
[root@docker-node1 ~]# docker tag nginx:1.23 reg.huazi.com/nginx.v1
[root@docker-node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.23 a7be6198544f 16 months ago 142MB
reg.huazi.com/nginx.v1 latest a7be6198544f 16 months ago 142MB
[root@docker-node1 ~]# docker push reg.huazi.com/nginx.v1
Using default tag: latest
The push refers to repository [reg.huazi.com/nginx.v1]
4d33db9fdf22: Preparing
6791458b3942: Preparing
2731b5cfb616: Preparing
043198f57be0: Preparing
5dd6bfd241b4: Preparing
8cbe4b54fa88: Waiting
no basic auth credentials #发现没有认证
[root@docker-node1 ~]# docker login reg.huazi.com
Username: huazi
Password: 123456 #密码不显示
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/#credential-stores
Login Succeeded
#上传成功
[root@docker-node1 ~]# docker push reg.huazi.com/nginx.v1
Using default tag: latest
The push refers to repository [reg.huazi.com/nginx.v1]
4d33db9fdf22: Pushed
6791458b3942: Pushed
2731b5cfb616: Pushed
043198f57be0: Pushed
5dd6bfd241b4: Pushed
8cbe4b54fa88: Pushed
latest: digest: sha256:a97a153152fcd6410bdf4fb64f5622ecf97a753f07dcc89dab14509d059736cf size: 1570
[root@docker-node1 ~]# curl -k https://reg.huazi.com/v2/_catalog -u huazi:123456
{"repositories":["nginx.v1"]}
[root@docker-node1 ~]# cd .docker/
[root@docker-node1 .docker]# ls
buildx config.json
[root@docker-node1 .docker]# cat config.json #存放认证信息
{
"auths": {
"reg.huazi.com": {
"auth": "aHVhemk6MTIzNDU2"
}
}
}
- 当
退出登录
后,认证信息会自动删除
[root@docker-node1 ~]# docker logout reg.huazi.com
Removing login credentials for reg.huazi.com
[root@docker-node1 ~]# cd .docker/
[root@docker-node1 .docker]# ls
buildx config.json
[root@docker-node1 .docker]# cat config.json
{
"auths": {}
}
- 当我们删除
nginx.v1
镜像后重新拉取
[root@docker-node1 ~]# docker rmi reg.huazi.com/nginx.v1:latest
Untagged: reg.huazi.com/nginx.v1:latest
Untagged: reg.huazi.com/nginx.v1@sha256:a97a153152fcd6410bdf4fb64f5622ecf97a753f07dcc89dab14509d059736cf
[root@docker-node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest cfb4d9904335 12 months ago 25.4MB
nginx 1.23 a7be6198544f 16 months ago 142MB
[root@docker-node1 ~]# docker pull reg.huazi.com/nginx.v1
Using default tag: latest
latest: Pulling from nginx.v1
Digest: sha256:a97a153152fcd6410bdf4fb64f5622ecf97a753f07dcc89dab14509d059736cf
Status: Downloaded newer image for reg.huazi.com/nginx.v1:latest
reg.huazi.com/nginx.v1:latest
[root@docker-node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest cfb4d9904335 12 months ago 25.4MB
nginx 1.23 a7be6198544f 16 months ago 142MB
reg.huazi.com/nginx.v1 latest a7be6198544f 16 months ago 142MB