一、前言

官方的Docker hub是一个用于管理公共镜像的好地方,我们可以在上面找到我们想要的镜像,也可以把我们自己的镜像推送上去。但是,有时候,我们的使用场景需要我们拥有一个私有的镜像仓库用于管理我们自己的镜像。这个可以通过开源软件Registry来达成目的。

Registry在github上有两份代码:老代码库新代码库。老代码是采用python编写的,存在pull和push的性能问题,出到0.9.1版本之后就标志为deprecated,不再继续开发。从2.0版本开始就到在新代码库进行开发,新代码库是采用go语言编写,修改了镜像id的生成算法、registry上镜像的保存结构,大大优化了pull和push镜像的效率。目前Docker Registry已经升级到了v2,最新版的Docker已不再支持v1。Registry v2使用Go语言编写,在性能和安全性上做了很多优化,重新设计了镜像的存储格式。

使用私有仓库有许多优点:

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

环境准备

环境:三个装有Docker的Centos7虚拟机

虚拟机1:192.168.0.106 用作私有仓库
虚拟机2:192.168.0.107 用户开发机  (测试私有仓库)
虚拟机3:192.168.0.108 用户开发机 (测试私有仓库用户名密码验证)

1、可以连接互联网

2、添加 yum源

二、Registry的部署

1.安装docker,并启动服务

[root@registry-server ~]# yum install docker -y
[root@registry-server ~]# systemctl start docker

2.查看docker版本信息

[root@registry-server ~]#  docker version
Client:
Version: 1.12.
API version: 1.24
Package version: docker-1.12.-.git85d7426.el7.centos.x86_64
Go version: go1.8.3
Git commit: 85d7426/1.12.
Built: Tue Oct ::
OS/Arch: linux/amd64 Server:
Version: 1.12.
API version: 1.24
Package version: docker-1.12.-.git85d7426.el7.centos.x86_64
Go version: go1.8.3
Git commit: 85d7426/1.12.
Built: Tue Oct ::
OS/Arch: linux/amd64

3.下载registry镜像

[root@registry-server ~]# docker pull registry:
Trying to pull repository docker.io/library/registry ...
: Pulling from docker.io/library/registry
ab7e51e37a18: Pull complete
c8ad8919ce25: Pull complete
5808405bc62f: Pull complete
f6000d7b276c: Pull complete
f792fdcd8ff6: Pull complete
Digest: sha256:9d295999d330eba2552f9c78c9f59828af5c9a9c15a3fbd1351df03eaad04c6a

#注:由于国内网络问题直接连接官网下载可能会超时,可以重试几次,或者使用国内加速器,具体方法可以看文章最后。

启动docker registry

[root@registry-server ~]#  docker run -idt -v /opt/registry:/var/lib/registry -p : --restart=always --name registry-server registry:
71a418cbf1fc515f4c603011a0994d4f1ec86e1fe94f9425456677dbd4727e5b

参数详解:

i:    保持sdtin开放状态
d: 使容器以守护进程方式后台运行,并打印容器id
t: 分配一个tty(虚拟终端设备)
v: 绑定挂载一个容器内的路径到宿主机路径
p: 映射一个容器的端口到宿主机端口
restart: 当容器退出时的重启策略
name: 给容器命名一个名称

查看docker registry进程

[root@registry-server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
71a418cbf1fc registry: "/entrypoint.sh /etc/" seconds ago Up seconds 0.0.0.0:->/tcp registry-server

4.下载测试镜像

[root@registry-server ~]# docker pull hello-world
Using default tag: latest
Trying to pull repository docker.io/library/hello-world ...
latest: Pulling from docker.io/library/hello-world
ca4f61b1923c: Pull complete
Digest: sha256:be0cd392e45be79ffeffa6b05338b98ebb16c87b255f48e297ec7f98e123905c

给测试镜像打tag  #tag命令可以为以存在的重复命名,并不执行重命名,而是保留原有命名基础上,添加一个新的名称,看上去像新添加了一个image

[root@registry-server ~]#  docker tag hello-world 127.0.0.1:/hello-world

查看本地镜像

[root@registry-server ~]#  docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/registry 177391bcf802 days ago 33.26 MB
127.0.0.1:/hello-world latest f2a91732366c weeks ago 1.848 kB
docker.io/hello-world latest f2a91732366c weeks ago 1.848 kB

push测试镜像到私有仓库

[root@registry-server ~]# docker push 127.0.0.1:/hello-world
The push refers to a repository [127.0.0.1:/hello-world]
f999ae22f308: Pushed
latest: digest: sha256:8072a54ebb3bc136150e2f2860f00a7bf45f13eeb917cca2430fcd0054c8e51b size:

查看宿主机映射目录

root@registry-server ~]# ll /opt/registry/docker/registry/v2/repositories/
总用量
drwxr-xr-x root root 12月 : hello-world

也可以访问外网ip的5000端口查看

5.在客户机上下载刚刚上传的测试镜像

[root@docker-client1 ~]# docker pull 192.168.0.106:/hello-world
Using default tag: latest
Trying to pull repository 192.168.0.106:/hello-world ...
Get https://192.168.0.106:5000/v1/_ping: http: server gave HTTP response to HTTPS client

因为Docker从1.3.X之后,与docker registry交互默认使用的是https,然而此处搭建的私有仓库只提供http服务,所以当与私有仓库交互时就会报上面的错误。
目前很多文章都是通过修改docker的配置文件“etc/systemconfig/docker",重启docker来解决这个问题。但发现docker1.12版本并无此文件,根据网上创建此文件,并填入相应内容,重启docker无效果,仍然报此错误。

解决方法:
在”/etc/docker/“目录下,创建”daemon.json“文件。在文件中写入:
{ "insecure-registries":["192.168.0.106:5000"] },保存后重启

[root@docker-client1 ~]# cat /etc/docker/daemon.json
{
"insecure-registries": ["192.168.0.106:5000"]
}
[root@docker-client1 ~]# systemctl daemon-reload
[root@docker-client1 ~]# systemctl restart docker

 再一次下载测试镜像

[root@docker-client1 ~]# docker pull 192.168.0.106:/hello-world
Using default tag: latest
Trying to pull repository 192.168.0.106:/hello-world ...
latest: Pulling from 192.168.0.106:/hello-world
ca4f61b1923c: Pull complete
Digest: sha256:8072a54ebb3bc136150e2f2860f00a7bf45f13eeb917cca2430fcd0054c8e51b

现在docker的本地仓库已经搭建完成了,但是这样在生产环境中是不安全的,所以需要添加验证保证安全

6.添加允许访问的用户和密码

[root@registry-server ~]#mkdir -p /opt/registry-var/auth/
[root@registry-server ~]#docker run --entrypoint htpasswd registry: -Bbn abc   >> /opt/registry-var/auth/htpasswd  #生成用户abc,渺密码为123

设置配置文件,启用删除镜像功能(也可以不启用,看业务需要,修改 storage - delete - enable 为 false 即可)

[root@registry-server ~]# mkdir -p /opt/registry-var/config
[root@registry-server ~]# vim /opt/registry-var/config/config.yml
version: 0.1
log:
fields:
service: registry
storage:
delete:
enabled: true
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
http:
addr: :
headers:
X-Content-Type-Options: [nosniff]
health:
storagedriver:
enabled: true
interval: 10s
threshold:

启动服务(这里将镜像路径映射到宿主机的 /opt/registry-var/ 文件夹下,可以根据需要修改)

[root@registry-server ~]# docker run -d -p 5000:5000 --restart=always  --name=registry  -v /opt/registry-var/config/:/etc/docker/registry/   -v /opt/registry-var/auth/:/auth/   -e "REGISTRY_AUTH=htpasswd"   -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm"   -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd   -v /opt/registry-var/:/var/lib/registry/ registry:2

客户端操作:

 开启 http 形式访问私有仓库模式

[root@registry-cleint2 ~]# vim /etc/docker/daemon.json
{
"insecure-registries":["192.168.0.106:5000"]
}

[root@registry-cleint2 ~]# systemctl daemon-reload
[root@registry-cleint2 ~]# systemctl restart docker

测试登录

[root@registry-cleint2 ~]#  docker login 192.168.0.106:
Username: abc
Password:
Login Succeeded

下载测试

[root@registry-cleint2 ~]#docker push  192.168.0.106:/hello-world
The push refers to a repository [192.168.0.106:/hello-world]
An image does not exist locally with the tag: 192.168.0.106:/hello-world

查找私有镜像

[root@registry-cleint2 ~]#  curl -u abc:  http://192.168.0.106:5000/v2/_catalog
{"repositories":["hello-world"]}

使用加速器下载官网镜像方法:

1.打开https://dev.aliyun.com/ 链接,按提示申请一个账户

2.点击容器镜像服务,再点击容器加速器按提示设置即可

Centos7基于容器安装运行Docker私有仓库及添加认证的更多相关文章

  1. Dockerfile指令与Docker-compose容器编排-搭建docker私有仓库

    目录 一:部署应用映射外部目录(持久化) 总结 二:迁移与备份(容器保存为镜像) 1.django执行gitee,项目提交到远端 2.其他操作 3.操作步骤 4.容器保存为镜像 5.把镜像打包成压缩包 ...

  2. CentOS7下使用SonatypeNexus3搭建Docker私有仓库

    前置条件:安装docker(如果机器上没有安装的话) //安装一些必要的系统工具: sudo yum install -y yum-utils device-mapper-persistent-dat ...

  3. CentOS7下使用Harbor搭建Docker私有仓库

    相关资料: Harbor官方网站:https://goharbor.io/ Harbor Github地址:https://github.com/goharbor/harbor ⒈安装Docker(必 ...

  4. 搭建Docker私有仓库&用户密码认证&web可视化界面

    1.拉取镜像 docker pull hyper/docker-registry-web docker pull registry 2.安装 yum install docker-compose 3. ...

  5. 手把手教你搭建Docker私有仓库

    章节一:centos7 docker安装和使用_入门教程 章节二:使用docker部署Asp.net core web应用程序 有了前面的基础,接下来的操作就比较简单了.先准备两台虚拟机,两台机器上都 ...

  6. Docker 私有仓库方案比较与搭建

    我们知道docker镜像可以托管到dockerhub中,跟代码库托管到github是一个道理.但如果我们不想把docker镜像公开放到dockerhub中,只想在部门或团队内部共享docker镜像,能 ...

  7. CentOS7搭建Docker私有仓库----Docker

    有时候使用Docker Hub这样的公共仓库可能不方便,这种情况下用户可以使用registry创建一个本地仓库供私人使用,这点跟Maven的管理类似.目前Docker Registry已经升级到了v2 ...

  8. nexus3使用docker运行/创建docker私有仓库/maven私有仓库

    version: '3.2' services: nexus3: container_name: nexus3 hostname: nexus3 image: sonatype/nexus3:3.14 ...

  9. Docker容器化【Dockerfile编写&&搭建与使用Docker私有仓库】

    # Docker 学习目标: 掌握Docker基础知识,能够理解Docker镜像与容器的概念 完成Docker安装与启动 掌握Docker镜像与容器相关命令 掌握Tomcat Nginx 等软件的常用 ...

随机推荐

  1. ES9新特性

    这篇文章主要介绍ES2018(ES9)的新特性, 以及使用方法 JS是一门跨平台的语言, ES6也就是ECMAScript 2015 花费了5年的时间敲定, 是一次非常大的改版, 之后每年都有一个小版 ...

  2. uglifyjs-webpack-plugin 插件,drop_console 默认为 false(不清除 console 语句),drop_debugger 默认为 true(清除 debugger 语句)

    uglifyjs-webpack-plugin 插件,drop_console 默认为 false(不清除console语句),drop_debugger 默认为 true(清除 debugger 语 ...

  3. node api 之:process - 进程

    process 对象是一个全局变量,它提供当前 Node.js 进程的有关信息,以及控制当前 Node.js 进程. 因为是全局变量,所以无需使用 require().

  4. JavaScript 隐式类型转换之:加号+

    加号+,有些情况下,它是算术加号,有些情况下,是字符串连接符号 如果字符串和数字相加,JavaScript会自动把数字转换成字符,不管数字在前还是字符串在前 "2" + 3; // ...

  5. java JVM JRE JDK三者之间的关系

    JDK在包含JRE之外,提供了开发Java应用的各种工具,比如编译器和调试器. JRE包括JVM和JAVA核心类库和支持文件,是Java的运行平台. JVM是JRE的一部分,Java虚拟机的主要工作是 ...

  6. Spring Boot 配置详解

    Spring Boot 针对常用的开发场景提供了一系列自动化配置来减少原本复杂而又几乎很少改动的模板配置内容,但是,我们还是需要了解如何在Spring Boot中修改这些自动化的配置,以应对一些特殊场 ...

  7. 【python】try...except...后中断程序继续运行

  8. 关于IP核中中断信号的使用---以zynq系统为例

    关于IP核中中断信号的使用---以zynq系统为例 1.使能设备的中断输出信号 2.使能处理器的中断接收信号 3.连接IP核到处理器之间的中断 此处只是硬件的搭建,软件系统的编写需要进一步研究. 搭建 ...

  9. excel技巧--文本拆分合并

    如果像上图那样将一单元格内拆分成同等大小的字词,可用如下步骤: 1.将该单元格的宽度缩至拆分词的大小: 2.选择同列的适当的单元格,用于填充拆分的字符: 3.点击“开始”-->填充-->两 ...

  10. 自定义自己的jQury插件

    对于一个商业插件来说,自定义插件的样式是必不可少的.我们可以通过我们自己输入不同的样式,来改变开发者的默认样式.比如说最常见的 width.height.url.color等等.要是没有这些自定义的东 ...