Docker容器学习梳理--私有仓库Registry使用

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:

但有时候使用Docker Hub这样的公共仓库可能不方便,这种情况下用户可以使用registry创建一个本地仓库供私人使用,这点跟Maven的管理类似。
使用私有仓库有许多优点:

1
2
1)节省网络带宽,针对于每个镜像不用每个人都去中央仓库上面去下载,只需要从私有仓库中下载即可;
2)提供镜像资源利用,针对于公司内部使用的镜像,推送到本地的私有仓库中,以供公司内部相关人员使用。

目前Docker Registry已经升级到了v2,最新版的Docker已不再支持v1。Registry v2使用Go语言编写,在性能和安全性上做了很多优化,重新设计了镜像的存储格式。如果需要安装registry v2,只需下载registry:2.2即可。Docker官方提供的工具docker-registry可以用于构建私有的镜像仓库。废话不多说了,下面记录下Docker私有仓库构建的过程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
选择一台服务器(内外网地址:192.168.1.23)作为注册服务器,用于搭建私有仓库。(该机器要安装了Docker环境)
1)从Docker官方仓库里下载registry镜像
[root@localhost ~] # docker pull registry:2.2
----------------------------------------------------------------
或者:
[root@localhost ~] # docker pull registry
[root@localhost ~] # docker pull registry:2.1.1
----------------------------------------------------------------
下载完之后,可以通过该镜像启动一个容器
[root@localhost ~] # docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
tomcat7              latest              97c6a43dd69c        12 minutes ago      562.3 MB
docker.io /registry    2.2                 ad379b517aa6        14 months ago       224.5 MB
         
默认情况下,会将私有仓库存放于容器内的 /tmp/registry 目录下,这样如果容器被删除,则存放于容器中的镜像也会丢失。
所以一般情况下会指定本地一个目录挂载到容器内的 /tmp/registry 下,如下:
[root@localhost ~] # docker run -d --name=my_registry -p 5000:5000 -v /opt/data/registry:/tmp/registry docker.io/registry:2.2
9fe45329bda17f61da04e6e8d2faf124fb22665a25270421bb8979a419809446
         
[root@localhost ~] # docker ps
CONTAINER ID        IMAGE                    COMMAND                  CREATED              STATUS              PORTS                    NAMES
d8e98b1068cd        docker.io /registry :2.2    "/bin/registry /etc/d"    About a minute ago   Up About a minute   0.0.0.0:5000->5000 /tcp    my_registry
         
由上可以看到,已经启动了一个容器,地址为:192.168.1.23:5000。
         
2)测试
接下来可以把一个本地镜像push(如下面的tomcat7镜像)到私有仓库中。
[root@localhost ~] # docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
tomcat7              latest              97c6a43dd69c        18 minutes ago      562.3 MB
docker.io /registry    2.2                 ad379b517aa6        14 months ago       224.5 MB
         
修改一下该镜像的tag标识。
[root@localhost ~] # docker tag tomcat7 192.168.1.23:5000/tomcat7
      
[root@localhost ~] # docker tag tomcat7 192.168.1.23:5000/tomcat7       //修改了tag后的镜像若要删除,docker rmi后面不能用镜像ID了,需要用docker rmi 192.168.1.23:5000/tomcat7:latest
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
192.168.1.23:5000 /tomcat7    latest              97c6a43dd69c        18 minutes ago      562.3 MB
tomcat7                     latest              97c6a43dd69c        18 minutes ago      562.3 MB
docker.io /registry           2.2                 ad379b517aa6        14 months ago       224.5 MB
      
接下来把上面修改tag后的镜像上传到私有仓库。
[root@localhost ~] # docker push 192.168.1.23:5000/tomcat7
The push refers to a repository [192.168.1.23:5000 /tomcat7 ]
unable to  ping  registry endpoint https: //192 .168.1.23:5000 /v0/
v2  ping  attempt failed with error: Get https: //192 .168.1.23:5000 /v2/ : http: server gave HTTP response to HTTPS client
v1  ping  attempt failed with error: Get https: //192 .168.1.23:5000 /v1/_ping : http: server gave HTTP response to HTTPS client
         
出现上面错误的原因分析:
因为Docker从1.3.X之后,与docker registry交互默认使用的是https,然而此处搭建的私有仓库只提供http服务,所以当与私有仓库交互时就会报上面的错误。
为了解决这个问题需要在启动docker server时增加启动参数为默认使用http访问。
需要在docker的配置文件 /etc/sysconfig/docker  (ubuntu系统中的docker配置文件时 /etc/default/docker  )添加参数“--insecure-registry=192.168.1.23:5000”。
-----------------------------------------------------------------------------------------------------------
温馨提示:
这个是在客户机的docker配置文件里添加的(即上传镜像到私有仓库里或从私有仓库下载镜像的客户机)。
比如说在A机器上将它的镜像上传到192.168.1.23的私有仓库上或从该私有仓库下载镜像,那么就在A机器的本地docker配置文件中添加。
我这里测试用的是同一台机器,即将注册机192.168.1.23本机的镜像上传到它的仓库内。
-----------------------------------------------------------------------------------------------------------
[root@localhost ~] # vim /etc/sysconfig/docker
.......
OPTIONS= '--selinux-enabled --log-driver=journald'
改为
OPTIONS= '--selinux-enabled --log-driver=journald --insecure-registry=192.168.1.23:5000'
         
[root@localhost ~] # service docker restart
         
由于docker服务重启后,所有容器都会被关闭。所以需要在docker重启后再次启动容器
[root@localhost ~] # docker start my_registry
my_registry
[root@localhost ~] # docker ps
CONTAINER ID        IMAGE                    COMMAND                  CREATED              STATUS              PORTS                    NAMES
d8e98b1068cd        docker.io /registry :2.2    "/bin/registry /etc/d"    About a minute ago   Up About a minute   0.0.0.0:5000->5000 /tcp    my_registry
         
再次提交到私有仓库
[root@localhost ~] # docker push 192.168.1.23:5000/tomcat7
The push refers to a repository [192.168.1.23:5000 /tomcat7 ]
c6d7ce9e90d7: Pushed
34e7b85d83e4: Pushed
latest: digest: sha256:5fdcbaf254cb44dd26645f606cccea8de76118baff03485e40853c691a15956d size: 720
       
上面命令执行无误后,就表示镜像已经push到私有仓库中去了。
查看私有仓库里的镜像(一定要保证下面能查看到仓库里有镜像!如果仓库里没有镜像,那么客户端机器就无法从该私有仓库下载镜像了)
[root@localhost ~] # curl -XGET http://192.168.1.23:5000/v2/_catalog    //即该私有仓库里有tomcat7镜像 
{ "repositories" :[ "tomcat7" ]}
[root@localhost ~] # curl -XGET http://192.168.1.23:5000/v2/tomcat7/tags/list
{ "name" : "tomcat7" , "tags" :[ "latest" ]}
或者浏览器里访问(103.110.186.23是注册机的外网ip,iptables防火墙内开放5000端口访问):
http: //103 .110.186.23:5000 /v2/_catalog
http: //103 .110.186.23:5000 /v2/tomcat7/tags/list
     
现在可以将本地的tomcat7和192.168.1.23:5000 /tomcat7 镜像都删除,然后从私有仓库中下载
[root@localhost ~] # docker rmi tomcat7
[root@localhost ~] # docker rmi 192.168.1.23:5000/tomcat7
     
[root@localhost ~] # docker pull 192.168.1.23:5000/tomcat7
[root@localhost ~] # docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
192.168.1.23:5000 /tomcat7    latest              5hc8a2ip413w        3 days ago          562.3 MB
     
-----------------------------------------------------------------------------
这样,也就可以在同一局域网内的其他机器上,从该私有仓库中pull下来该镜像。
比如从192.168.1.17上拉取该私有仓库的tomcat镜像进行容器创建(注意,要在该机器的 /etc/sysconfig/docker 配置文件里添加--insecure-registry=192.168.1.23:5000参数)
[root@linux-node2 ~] # docker pull 192.168.1.23:5000/tomcat7
       
[root@linux-node2 ~] # docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
192.168.1.23:5000 /tomcat7    latest              2ec9e2eb978a        3 days ago          562.3 MB
       
这样就搭建了Docker私有仓库,上面搭建的仓库是不需要认证的,我们可以结合nginx和https实现认证和加密功能。

注意查看镜像方法(docker pull registry:2.1.1):

1
2
# curl -XGET http://registry_ip:5000/v2/_catalog
# curl -XGET http://registry_ip:5000/v2/image_name/tags/list
***************当你发现自己的才华撑不起野心时,就请安静下来学习吧***************

本文转自散尽浮华博客园博客,原文链接:http://www.cnblogs.com/kevingrace/p/6628062.html,如需转载请自行联系原作者
相关文章
|
4天前
|
Ubuntu API 网络虚拟化
ubuntu22 编译安装docker,和docker容器方式安装 deepseek
本脚本适用于Ubuntu 22.04,主要功能包括编译安装Docker和安装DeepSeek模型。首先通过Apt源配置安装Docker,确保网络稳定(建议使用VPN)。接着下载并配置Docker二进制文件,创建Docker用户组并设置守护进程。随后拉取Debian 12镜像,安装系统必备工具,配置Ollama模型管理器,并最终部署和运行DeepSeek模型,提供API接口进行交互测试。
91 15
|
2月前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
299 78
|
1月前
|
安全 数据安全/隐私保护 Docker
docker私有仓库harbor安装
通过以上步骤,您可以成功在企业内部安装和配置Harbor私有仓库,方便地管理和分发Docker镜像。Harbor不仅提供了基础的镜像管理功能,还增强了安全性、身份管理和审计功能,使其成为企业级容器镜像管理的理想选择。
98 22
|
1月前
|
Ubuntu NoSQL Linux
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
158 6
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
|
2月前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序
|
2月前
|
Ubuntu Linux 开发工具
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖项打包成标准化单元(容器),确保在任何支持 Docker 的操作系统上一致运行。容器共享主机内核,提供轻量级、高效的执行环境。本文介绍如何在 Ubuntu 上安装 Docker,并通过简单步骤验证安装成功。后续文章将探讨使用 Docker 部署开源项目。优雅草央千澈 源、安装 Docker 包、验证安装 - 适用场景:开发、测试、生产环境 通过以上步骤,您可以在 Ubuntu 系统上成功安装并运行 Docker,为后续的应用部署打下基础。
96 8
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
|
2月前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
172 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
1月前
|
Kubernetes Linux 虚拟化
入门级容器技术解析:Docker和K8s的区别与关系
本文介绍了容器技术的发展历程及其重要组成部分Docker和Kubernetes。从传统物理机到虚拟机,再到容器化,每一步都旨在更高效地利用服务器资源并简化应用部署。容器技术通过隔离环境、减少依赖冲突和提高可移植性,解决了传统部署方式中的诸多问题。Docker作为容器化平台,专注于创建和管理容器;而Kubernetes则是一个强大的容器编排系统,用于自动化部署、扩展和管理容器化应用。两者相辅相成,共同推动了现代云原生应用的快速发展。
184 11
|
2月前
|
关系型数据库 应用服务中间件 PHP
实战~如何组织一个多容器项目docker-compose
本文介绍了如何使用Docker搭建Nginx、PHP和MySQL的环境。首先启动Nginx容器并查看IP地址,接着启动Alpine容器并安装curl测试连通性。通过`--link`方式或`docker-compose`配置文件实现服务间的通信。最后展示了Nginx配置文件和PHP代码示例,验证了各服务的正常运行。
84 3
实战~如何组织一个多容器项目docker-compose
|
3月前
|
运维 Kubernetes Docker
深入理解容器化技术:Docker与Kubernetes的协同工作
深入理解容器化技术:Docker与Kubernetes的协同工作
102 14