分分钟搭建docker私有仓库

docker镜像仓库的管理

1.什么是docker仓库

在这里插入图片描述
docker仓库docker registry)是用于存储分发docker镜像集中式存储库

它就像一个大型镜像仓库开发者可以将自己创建docker镜像推送到仓库中,也可以从仓库拉取所需的镜像。

docker仓库可以分为公共仓库私有仓库

  • 公共仓库,如docker hub任何人都可以访问和使用其中的镜像。许多常用的软件和应用都有在docker hub上提供的镜像,方便用户直接获取和使用。
    • 例如:您想要部署一个nginx服务器,就可以从docker hub上拉取nginx镜像
  • 私有仓库则是由组织个人自己搭建和管理的,用于存储内部使用的,不希望公开的镜像。
    • 例如:一家企业为其特定的业务应用创建了定制化的镜像,并将其存储在自己的私有仓库中,以保证安全性和控制访问权限

通过docker仓库开发者能够方便地共享和复用镜像加速应用的开发和部署过程

2.docker hub

它是 Docker生态系统中最知名和广泛使用的镜像仓库之一,拥有大量的官方和社区贡献的镜像。

以下是 Docker Hub 的一些关键特点和优势

  • 丰富的镜像资源:涵盖了各种常见的操作系统编程语言运行时、数据库、Web 服务器等众多应用的镜像
    • 例如,您可以轻松找到 UbuntuCentOS 等操作系统的镜像,以及 MySQLRedis 等数据库
      的镜像。
  • 官方支持:提供了由 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 serviceToken的方式进行认证
  • Registry Client Docker充当registry客户端来维护推送和拉取,以及客户端的授权。

2.3pull原理

镜像拉取分为以下几步:

  • docker客户端index发送镜像拉取请求并完成与index的认证
  • index发送认证token镜像位置docker client
  • docker client携带token和根据index指引的镜像位置去连接registry
  • registry会根据client持有的tokenindex核实身份合法性
  • index确认此token合法性
  • registry会根据client请求传递镜像到客户端

2.4push原理

在这里插入图片描述

镜像上传的步骤:

  • clientindex发送上传请求并完成用户认证
  • index会发送tokenclient来证明client的合法性
  • client携带index提供的token连接Registry
  • Registryindex核实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登录认证

  1. 安装建立认证文件的工具包
[root@docker-node1 ~]# yum install httpd-tools -y
  1. 建立认证文件
[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
  1. 添加认证到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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

^~^前行者~~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值