docker 搭建私有仓库及镜像存储目录结构

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

仓库 (Repository)是集中存放镜像的地方, docker 仓库分为公有仓库和私有仓库,然而公有仓库在某些情况下并不适用于公司内部传输,所以在这边我来搭建私有环境的 registry 。那私有仓库较公有仓库有以下优点:

  • 省带宽
  • 传输速度快
  • 方便存储

下面我们来创建私有仓库,实现 docker client 通过 docker registry 上传和下载 docker images,最后说下docker registry 的存储方式。

本实验要达到的效果是:

1、docker registry 上面创建私有 docker registry
2、通过 docker client 将所有 images 上传到 docker registry
3、在 docker client 上面的所有 images 删除,再从 docker registry 中下载

环境:
系统:Centos 7
内核版本:3.10.0-229.el7.x86_64
docker 版本:1.8.2

   docker_registry_ip10.1.0.100
   docker_client_ip    : 10.1.0.101

关闭 selinux、firewalld
我在搭建仓库的时候遇到过因为防火墙的问题,docker client 上传到 docker registry 的 images 文件无法存储于本地。以及在 docker registry 中一些受限的问题,所以在此先关闭一切与本文无关的东西。

并且在 docker registry 和 docker client 主机中设置 docker 启动参数,–insecure-registry=10.1.0.100:5000 说明 docker registry 10.1.0.100:5000 是安全受信的registry 。然后启动,不然后面会报错。

systemctl stop firewalld.service
systemctl disable firewalld.service
vim /etc/selinux/config  改为:SELINUX=disabled
setenforce 0

vim /etc/sysconfig/docker
将启动参数 OPTIONS='--selinux-enabled' 改为:
OPTIONS='--selinux-enabled --insecure-registry=10.1.0.100:5000'

在 docker registry 上面搭建自己的私有仓库

docker pull registry                            
docker run -dit --name registry -p 5000:5000 -v /data/registry:/tmp/registrt registry

[root@docker-100 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
c9c059970aec        registry            "docker-registry"   56 seconds ago      Up 50 seconds       0.0.0.0:5000->5000/tcp   registry
[root@docker-100 ~]# 

这时候可以看到,我通过 registry 镜像生成了名称为 registry 的容器,并且挂载容器卷,/data/registry:/tmp/registry(仓库内部的挂载目录一定要是 /tmp/registry,因为 docker registry 在运行后会在 /tmp/ 下面生成一个叫 docker-registry.db 的库文件,默认就是 /tmp/registry 目录来存放 images) ,并且我映射了 5000 端口

下面是我的 docker registry images 和 container,可以看到只有一个镜像 registry

[root@docker-100 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
registry            latest              a8706c2bfd21        2 days ago          422.8 MB
[root@docker-100 ~]# 
[root@docker-100 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
c9c059970aec        registry            "docker-registry"   3 minutes ago       Up 3 minutes        0.0.0.0:5000->5000/tcp   registry
[root@docker-100 ~]# 

现在把 docker client 上传 images 到 docker registry
先来看看 docker client 上面有哪些 images

[root@docker-101 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
docker.io/swarm     latest              e9ff33e7e5b9        2 days ago          17.15 MB
registry            latest              a8706c2bfd21        2 days ago          422.8 MB
tomcat              latest              1b8329afb263        3 days ago          350 MB
logstash            latest              9a68a1a0c829        3 days ago          447.4 MB
ubuntu              latest              d55e68e6cc9c        3 days ago          187.9 MB
nginx               latest              6ffc02088cb8        3 days ago          133.8 MB
redis               latest              bca7dc7cfafe        7 days ago          109.1 MB
mysql               latest              a5ad9eb2ff48        7 days ago          359.8 MB
centos              latest              ce20c473cd8a        8 weeks ago         172.3 MB
[root@docker-101 ~]# 

可以看到,我的 docker client中有很多镜像,而 docker registry 上面只有 registry 一个镜像,现在我要做的就是把 docker client 中的所有镜像全部上传到 docker registry。

下面我将修改 images 的 tag 用于上传到 docker registry ,修改完成后都是 10.1.0.100:5000/images ,说明我的注册服务器与仓库是 10.1.0.100:5000 与 images_name

[root@docker-100 ~]# docker images |grep 10.1.0.100
10.1.0.100:5000/swarm      latest              e9ff33e7e5b9        2 days ago          17.15 MB
10.1.0.100:5000/registry   latest              a8706c2bfd21        2 days ago          422.8 MB
10.1.0.100:5000/tomcat     latest              1b8329afb263        3 days ago          350 MB
10.1.0.100:5000/logstash   latest              9a68a1a0c829        3 days ago          447.4 MB
10.1.0.100:5000/ubuntu     latest              d55e68e6cc9c        3 days ago          187.9 MB
10.1.0.100:5000/nginx      latest              6ffc02088cb8        3 days ago          133.8 MB
10.1.0.100:5000/redis      latest              bca7dc7cfafe        7 days ago          109.1 MB
10.1.0.100:5000/mysql      latest              a5ad9eb2ff48        7 days ago          359.8 MB
10.1.0.100:5000/centos     latest              ce20c473cd8a        8 weeks ago         172.3 MB
[root@docker-100 ~]# 

将 docker client 的 images 上传到 docker registry

docker push 10.1.0.100:5000/swarm && 
docker push 10.1.0.100:5000/registry && 
docker push 10.1.0.100:5000/tomcat && 
docker push 10.1.0.100:5000/logstash && 
docker push 10.1.0.100:5000/ubuntu && 
docker push 10.1.0.100:5000/nginx && 
docker push 10.1.0.100:5000/redis && 
docker push 10.1.0.100:5000/mysql && 
docker push 10.1.0.100:5000/centos

漫长的等待之后,我们可以通过 curl 10.1.0.100:5000/v1/search ,也可以 curl -s 10.1.0.100:5000/v1/search | python -mjson.tool 以友好的方式查看所上传的 images

[root@docker-100 ~]# curl 10.1.0.100:5000/v1/search
{“num_results”: 9, “query”: “”, “results”: [{“description”: “”, “name”: “library/swarm”}, {“description”: “”, “name”: “library/registry”}, {“description”: “”, “name”: “library/tomcat”}, {“description”: “”, “name”: “library/logstash”}, {“description”: “”, “name”: “library/ubuntu”}, {“description”: “”, “name”: “library/nginx”}, {“description”: “”, “name”: “library/redis”}, {“description”: “”, “name”: “library/mysql”}, {“description”: “”, “name”: “library/centos”}]}[root@docker-100 ~]#

docker registry 主机的 -v 挂载目录中也可以查看 images信息。 ls /data/registry/repositories/library

[root@docker-100 ~]# ls /data/registry/repositories/library/
centos  logstash  mysql  nginx  redis  registry  swarm  tomcat  ubuntu
[root@docker-100 ~]# 

清空 docker client 端的 images , 并通过 docker registry 下载

好,现在镜像都已经上传完,我们清空 docker client 的images
docker rmi 10.1.0.100:5000/swarm
docker rmi 10.1.0.100:5000/tomcat
docker rmi 10.1.0.100:5000/logstash
docker rmi 10.1.0.100:5000/nginx
docker rmi 10.1.0.100:5000/redis
docker rmi 10.1.0.100:5000/mysql
docker rmi 10.1.0.100:5000/centos

本地images已经清空
[root@docker-101 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
[root@docker-101 ~]# 

从 docker registry 下载 images ,恢复刚才所删除的镜像

docker pull 10.1.0.100:5000/swarm && 
docker pull 10.1.0.100:5000/registry && 
docker pull 10.1.0.100:5000/tomcat && 
docker pull 10.1.0.100:5000/logstash && 
docker pull 10.1.0.100:5000/ubuntu && 
docker pull 10.1.0.100:5000/nginx && 
docker pull 10.1.0.100:5000/redis && 
docker pull 10.1.0.100:5000/mysql && 
docker pull 10.1.0.100:5000/centos

等执行完全部命令,并且等待几秒钟后就可以 docker images 查看镜像


下面简单说一下 docker registry 中 images 的存储目录和本地挂载的容器卷存储结构吧

在 docker 仓库中,默认情况下,会将仓库创建在容器的 /tmp/registry 目录下,并且在 /tmp 目录下面会生成一个 docker-registry.db 的文件

而在 -v 挂载的本地容器卷目录(/data/registry) 和 容器默认存放目录(/tmp/registry)中的内容是相同的。它们都存储 image 与 images 中间件信息。我们可以通过 tree /data/registry 看看。

那 /data/registry 下面又有两个目录,其实一个是 images,另一个则是 repositories,其实 images 下面是存放 images 本身和中间件的所有数据(json、layer)。而 repositories 下面呢,是存放 images 的基础信息。

[root@docker-101 ~]# tree /data/registry/
/data/registry/
├── images
│   ├── 135dee14f8e538b8d04296029ee7ed5d62ed87eaf10633355afb9ec94d7e83dc
│   │   ├── ancestry
│   │   ├── _checksum
│   │   ├── json
│   │   └── layer
│   ├── 649cd8bc367df0243b410073c33b3adbe19c0397c3512779ac405e3a29b162d5
│   │   ├── ancestry
│   │   ├── _checksum
│   │   ├── json
│   │   └── layer
│   ├── 6ba107a3f0e5709fa3407c5472ac64aa78428ebc606f7af01ead42adf1552bb7
│   │   ├── ancestry
│   │   ├── _checksum
│   │   ├── json
│   │   └── layer
│   ├── 74b8cab4d48740b88f44216f0baa396d28ea3ef498430254197c1f8f14748a38
│   │   ├── ancestry
│   │   ├── _checksum
│   │   ├── json
│   │   └── layer
│   ├── 87c759aff157e27b5a38356fea87cf2f8699182d8db691de6961bffa7c70c9fd
│   │   ├── ancestry
│   │   ├── _checksum
│   │   ├── json
│   │   └── layer
│   ├── 9377ad319b00884df249b7820e3cf540b1c4631b3b1ee6998a0f7c3d53962e03
│   │   ├── ancestry
│   │   ├── _checksum
│   │   ├── json
│   │   └── layer
│   ├── 9f68a2463722c79892577997eb7a249bd0f9f6bf7f18596e9d8df19aee59bb4d
│   │   ├── ancestry
│   │   ├── _checksum
│   │   ├── json
│   │   └── layer
│   ├── a82f81f257507f5cb74e833ff1ae4a6a39dfa654a161f5393f641832872b87d3
│   │   ├── ancestry
│   │   ├── _checksum
│   │   ├── json
│   │   └── layer
│   ├── a8706c2bfd2161dec04df0133d7fae1fb0c76d3852d2175e704c642278a110a2
│   │   ├── ancestry
│   │   ├── _checksum
│   │   ├── json
│   │   └── layer
│   ├── b207c06aba70227e0a2561bb7df20a5fd1310901da98ecc6f4da7dccdc40d961
│   │   ├── ancestry
│   │   ├── _checksum
│   │   ├── json
│   │   └── layer
│   ├── b7e3ce2506a310efc0d27720d405fa9c331441705a1c4884974efd30a3a5b4d2
│   │   ├── ancestry
│   │   ├── _checksum
│   │   ├── json
│   │   └── layer
│   ├── d1e0a63e6c8c6c67ed89ef0b8fa2fa2182d96494316c05197dfb06a786e88813
│   │   ├── ancestry
│   │   ├── _checksum
│   │   ├── json
│   │   └── layer
│   ├── d55e68e6cc9c7f78f1c02001e1a5ce76511db044c659e5c0a4275c54473f2869
│   │   ├── ancestry
│   │   ├── _checksum
│   │   ├── json
│   │   └── layer
│   └── e48bab29b63c2c89a257e725c9c07dfa047ee4ef7442c358b54fdd3c02c309f5
│       ├── ancestry
│       ├── _checksum
│       ├── json
│       └── layer
└── repositories
    └── library
        └── registry
            ├── _index_images
            ├── json
            ├── tag_latest
            └── taglatest_json

18 directories, 60 files
[root@docker-101 ~]# 
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2天前
|
存储 安全 持续交付
【Docker 专栏】Docker 镜像的版本控制与管理
【5月更文挑战第9天】本文探讨了Docker镜像版本控制与管理的重要性,包括可重复性、回滚能力、协作开发和持续集成。常用方法有标签、构建参数和版本控制系统。管理策略涉及定期清理、分层管理和镜像仓库。语义化标签、环境变量和配置文件在版本控制中有应用。版本系统与Docker结合能跟踪历史和促进协作。注意点包括优化镜像大小、确保安全性和兼容性。案例分析和未来趋势展示了持续发展的镜像管理技术,为Docker应用的稳定与进步保驾护航。
【Docker 专栏】Docker 镜像的版本控制与管理
|
2天前
|
存储 安全 开发者
如何删除 Docker 镜像、容器和卷?
【5月更文挑战第11天】
19 2
如何删除 Docker 镜像、容器和卷?
|
2天前
|
运维 安全 Docker
【Docker 专栏】Docker 镜像安全扫描与漏洞修复
【5月更文挑战第9天】Docker技术在软件开发和部署中带来便利,但其镜像安全问题不容忽视。本文探讨了Docker镜像安全扫描与漏洞修复,强调了镜像安全对应用和系统的重要性。文中介绍了静态和动态扫描方法,列举了软件漏洞、配置漏洞和恶意软件等常见安全问题,并提到了Clair和Trivy等扫描工具。修复策略包括更新软件、调整配置和重建镜像。此外,加强安全意识、规范镜像制作流程和定期扫描是管理建议。未来,将持续面对新的安全挑战,需持续研究和完善安全技术。
【Docker 专栏】Docker 镜像安全扫描与漏洞修复
|
2天前
|
Java Linux 数据安全/隐私保护
Docker自定义JDK镜像并拉取至阿里云镜像仓库全攻略
Docker自定义JDK镜像并拉取至阿里云镜像仓库全攻略
|
2天前
|
存储 弹性计算 运维
Docker数据集与自定义镜像:构建高效容器的关键要素
Docker数据集与自定义镜像:构建高效容器的关键要素
|
2天前
|
存储 缓存 运维
【Docker 专栏】Docker 镜像的分层存储与缓存机制
【5月更文挑战第8天】Docker 镜像采用分层存储,减少空间占用并提升构建效率。每个镜像由多个层组成,共享基础层(如 Ubuntu)和应用层。缓存机制加速构建和运行,通过检查已有层来避免重复操作。有效管理缓存,如清理无用缓存和控制大小,可优化性能。分层和缓存带来资源高效利用、快速构建和灵活管理,但也面临缓存失效和层管理挑战。理解这一机制对开发者和运维至关重要。
【Docker 专栏】Docker 镜像的分层存储与缓存机制
|
2天前
|
数据库 Docker 容器
【Docker 专栏】使用 Dockerfile 自动化构建 Docker 镜像
【5月更文挑战第8天】Dockerfile是构建Docker镜像的关键,它包含一系列指令,用于描述应用运行环境及所需软件包。通过自动化构建,能提高效率、保证可重复性并提升灵活性。确定基础镜像、安装依赖、设置环境后,执行Dockerfile生成镜像,用于应用程序部署。虽然需要熟悉Docker技术和应用细节,但其带来的益处使其成为现代软件开发和部署的重要工具。
【Docker 专栏】使用 Dockerfile 自动化构建 Docker 镜像
|
2天前
|
存储 数据管理 数据安全/隐私保护
【Docker专栏】Docker存储卷管理:数据持久化的关键
【5月更文挑战第7天】本文探讨了Docker容器中数据持久化的关键——存储卷,包括其独立于容器生命周期的特性、数据共享与迁移能力。Docker提供默认、命名、数据卷容器和挂载宿主机目录四种卷类型。创建与管理涉及`docker volume create`、`ls`、`run`等命令。最佳实践建议使用命名存储卷,定期备份,避免存储敏感数据,并清理未使用卷。了解和有效管理存储卷能提升容器灵活性和数据管理效率。
【Docker专栏】Docker存储卷管理:数据持久化的关键
|
2天前
|
缓存 安全 数据安全/隐私保护
【Docker专栏】深入理解Docker镜像的构建与推送
【5月更文挑战第7天】本文介绍了Docker镜像的核心作用及基础概念,包括镜像作为容器模板的特性。文章详细阐述了Dockerfile的编写,例如设置基础镜像、工作目录、安装依赖及定义启动命令。通过`docker build`命令构建镜像,并提示了优化构建过程的技巧。此外,还讲解了如何将镜像推送到远程仓库,包括选择仓库、认证、标签和推送镜像的步骤,以及镜像安全性的考虑,如扫描漏洞和遵循最小权限原则。本文旨在帮助读者掌握Docker镜像的构建与推送,以高效管理容器化应用。
【Docker专栏】深入理解Docker镜像的构建与推送
|
2天前
|
运维 Linux 数据安全/隐私保护
Docker详解(九)——Docker镜像发布
Docker详解(九)——Docker镜像发布
35 2