Docker 镜像仓库(Registry)服务本地化

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 介绍Docker 镜像仓库(Registry)服务在本地的部署操作,并且测试 Registry 仓库的镜像推送或拉取相关操作,并且解决了无法推送(push)镜像到私有仓库的问题。

关于 Registry

  • 官方的【Docker hub】是一个用于管理公共镜像的好地方,我们可以在上面找到我们想要的镜像,也可以把我们自己的镜像推送上去。但是,有时候,我们的使用场景需要我们拥有一个私有的镜像仓库用于管理我们自己的镜像。这个可以通过开源软件 Registry 来达成目的。
  • 【Registry】在 github 上有两份代码:老代码库和新代码库。老代码是采用 python 编写的,存在 pullpush 的性能问题,出到 0.9.1 版本之后就标志为 deprecated(查看更多信息=》https://github.com/docker/distribution),不再继续开发。
  • 2.0 版本开始就到在新代码库进行开发,新代码库是采用 go 语言编写,修改了镜像 id 的生成算法、registry 上镜像的保存结构,大大优化了 pullpush 镜像的效率。【Registry2.0】=》https://hub.docker.com/_/registry/

image.png

Regisry 可以做什么?

  1. 严格的控制镜像的存储位置(tightly control where your images are being stored);
  2. 完全拥有镜像分发管道(fully own your images distribution pipeline);
  3. 将镜像存储和分发紧密集成到内部开发工作流中(integrate image storage and distribution tightly into your in-house development workflow);
关于【Registry】的官网介绍=》 https://docs.docker.com/registry/

如何部署 Registry ?

1、从【Docker Hub】下载 registry 镜像

# 下载的默认版本为 docker.io/registry latest
docker pull registry 

2、运行 registry 镜像生成一个容器

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

Registry 服务默认会将上传的镜像保存在容器的 /var/lib/registry,将主机的 /opt/registry 目录挂载到该目录,即可实现将镜像保存到主机的 /opt/registry 目录了。

3、查看运行的容器

# 若查看所有,添加参数 -a
docker ps / docker container ls

4、若 registry 容器启动运行,在浏览器输入【http://docker-host-ip:5000/v2/】查看,若输出 =》{} 说明 registry 运行正常。

测试 Registry

  • 上传镜像到registry

首先将主机的 registry 镜像命名为符合仓库要求的格式 =》【registry_url:port/ImageName:tag

--1.先标记镜像格式
docker tag nginx:latest localhost:5000/nginx:latest
 
--2.把标记格式的镜像推送到registy
docker push localhost:5000/nginx:latest
 
--注:localhost 为本地环境的ip地址;
  • 查看本地所有镜像列表
docker images -a 或 docker image ls -a
  • 从本地 registry 仓库拉取镜像
docker pull localhost:5000/nginx:latest
 
# 说明:localhost 为本地环境的 ip 地址;

无法推送(push)镜像到私有仓库的问题

这一步可能出现无法推送(push)镜像到私有仓库的问题,提示如下信息:

The push refers to a repository [localhost:5000/nginx:latest]
The https://localhsot:5000/v2/: http:server gave HTTP response to HTTPS client

原因分析

1、原因是本地启动的 registry 服务不是安全可信任的;

解决步骤

2、解决方案,修改客户端 docker 的配置文件 /etc/docker/daemon.json 添加 registry 服务地址;

{
"registry-mirrors": [ "https://pee6w651.mirror.aliyuncs.com"],
"insecure-registries": ["localhost:5000"]
}

参数说明:

  • 加速镜像设置 =》"registry-mirrors": ["https://pee6w651.mirror.aliyuncs.com"] 是阿里云代理的 Registry Hub 仓库的地址,可以加快国内访问【Registry Hub】仓库的速度;
  • 私有仓库镜像设置 =》"insecure-registries": ["localhost:5000"] 是本地【Registry】服务地址,localhost 为当前 docker宿主机ip;

3、【daemon.json】 存放路径

cd /etc/docker

image.png

4、查看/编辑 daemon.json 文件配置信息

vi daemon.json

image.png

5、退出并保存

:wq

修改好后重启 Docker 服务 daemon.json 配置才生效,执行命令

systemctl restart docker , 

再次 push 即可成功,查看本地 /opt/registry 目录下面(或者浏览器输入 http://localhost:5000/v2/_catalog)

或者使用命令查看本地私有仓库里面的镜像信息,命令操作如下:

curl -XGET http://registry:5000/v2/_catalog
curl -XGET http://registry:5000/v2/image_name/tags/list

以上步骤就实现了本地部署 Registry 的过程,感兴趣的小伙伴,赶快动手跟着小c老师一步一步的实现吧!

附:镜像加速地址

相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
Kubernetes极速入门
Kubernetes(K8S)是Google在2014年发布的一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。Kubernetes通常结合docker容器工作,并且整合多个运行着docker容器的主机集群。 本课程从Kubernetes的简介、功能、架构,集群的概念、工具及部署等各个方面进行了详细的讲解及展示,通过对本课程的学习,可以对Kubernetes有一个较为全面的认识,并初步掌握Kubernetes相关的安装部署及使用技巧。本课程由黑马程序员提供。   相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
11天前
|
缓存 Linux 网络安全
docker的镜像无法下载如何解决?
【10月更文挑战第31天】docker的镜像无法下载如何解决?
333 28
|
24天前
|
缓存 监控 持续交付
|
7天前
|
存储 关系型数据库 Linux
【赵渝强老师】什么是Docker的镜像
Docker镜像是一个只读模板,包含应用程序及其运行所需的依赖环境。镜像采用分层文件系统,每次修改都会以读写层形式添加到原只读模板上。内核bootfs用于加载Linux内核,根镜像相当于操作系统,上方为应用层。镜像在物理存储上是一系列文件的集合,默认存储路径为“/var/lib/docker”。
|
13天前
|
存储 监控 Linux
docker构建镜像详解!!!
本文回顾了Docker的基本命令和管理技巧,包括容器和镜像的增删改查操作,容器的生命周期管理,以及如何通过端口映射和数据卷实现容器与宿主机之间的网络通信和数据持久化。文章还详细介绍了如何使用Docker部署一个简单的Web应用,并通过数据卷映射实现配置文件和日志的管理。最后,文章总结了如何制作自定义镜像,包括Nginx、Python3和CentOS镜像,以及如何制作私有云盘镜像。
81 2
|
14天前
|
关系型数据库 MySQL Docker
docker环境下mysql镜像启动后权限更改问题的解决
在Docker环境下运行MySQL容器时,权限问题是一个常见的困扰。通过正确设置目录和文件的权限,可以确保MySQL容器顺利启动并正常运行。本文提供了多种解决方案,包括在主机上设置正确的权限、使用Dockerfile和Docker Compose进行配置、在容器启动后手动更改权限以及使用 `init`脚本自动更改权限。根据实际情况选择合适的方法,可以有效解决MySQL容器启动后的权限问题。希望本文对您在Docker环境下运行MySQL容器有所帮助。
28 1
|
16天前
|
存储 Java 开发者
成功优化!Java 基础 Docker 镜像从 674MB 缩减到 58MB 的经验分享
本文分享了如何通过 jlink 和 jdeps 工具将 Java 基础 Docker 镜像从 674MB 优化至 58MB 的经验。首先介绍了选择合适的基础镜像的重要性,然后详细讲解了使用 jlink 构建自定义 JRE 镜像的方法,并通过 jdeps 自动化模块依赖分析,最终实现了镜像的大幅缩减。此外,文章还提供了实用的 .dockerignore 文件技巧和选择安全、兼容的基础镜像的建议,帮助开发者提升镜像优化的效果。
|
21天前
|
负载均衡 应用服务中间件 网络安全
docker swarm添加更多的服务
【10月更文挑战第16天】
18 6
|
21天前
|
Docker 容器
docker swarm启动服务并连接到网络
【10月更文挑战第16天】
20 5
|
22天前
|
负载均衡 网络协议 关系型数据库
docker swarm 使用网络启动服务
【10月更文挑战第15天】
19 4
|
20天前
|
存储 缓存 Java
Java应用瘦身记:Docker镜像从674MB优化至58MB的实践指南
【10月更文挑战第22天】 在容器化时代,Docker镜像的大小直接影响到应用的部署速度和运行效率。一个轻量级的Docker镜像可以减少存储成本、加快启动时间,并提高资源利用率。本文将分享如何将一个Java基础Docker镜像从674MB缩减到58MB的实践经验。
32 1