Docker 容器仓库之搭建私有仓库、hub仓库

一、什么是仓库

Docker 仓库是用来包含镜像的位置,Docker提供一个注册服务器(Register)来保存多个仓库,每个仓库又可以包含多个具备不同tag的镜像。
Docker运行中使用的默认仓库是 Docker Hub 公共仓库

在这里插入图片描述

二、docker hub

docker hub是docker公司维护的公共仓库,用户可以免费使用,也可以购买私有仓库

在这里插入图片描述

1.登陆docker-hub,新建公共仓库

我的用户名称是:wwyhappy
在这里插入图片描述
在这里插入图片描述

选择free版本
需要验证邮箱

在这里插入图片描述
创建一个名为mario的仓库
在这里插入图片描述

2.登陆后上传镜像

[root@server1 ~]# docker login      # 登录之后才能上传
[root@server1 ~]# docker tag mario:latest wwyhappy/mario:latest    # docker hub为了区分不同用户的同名镜像
## tag:打标签,仓库不知道mario是什么,打标签告诉仓库是wwyhappy/mario:latest
[root@server1 ~]# docker push wwyhappy/mario:latest    # 上传镜像到docker hub
## 上传是

拉取镜像时会显示…mount…,表示上传的镜像只是挂载在仓库,其实仓库里什么都没有

3.从仓库拉取镜像

[root@server1 ~]# docker pull wwyhappy/mario:latest      # 证明上传成功

4.删除镜像

[root@server1 ~]# docker rmi wwyhappy/mario:latest

三、Registry 工作原理

  • 一次docker pull 或 push背后发生的事情
    在这里插入图片描述

index服务主要提供镜像索引以及用户认证的功能。当下载一个镜像的时候,首先会去index服务上做认证,然后查找镜像所在的registry的地址并放回给docker客户端,docker客户端再从registry下载镜像,在下载过程中 registry会去index校验客户端token的合法性,不同镜像可以保存在不同的registry服务上,其索引信息都放在index服务上。

Docker Registry有三个角色,分别是index、registry和registry client。

  • index
    负责并维护有关用户帐户、镜像的校验以及公共命名空间的信息。
    1.Web UI
    2.元数据存储
    3.认证服务
    4.符号化
  • registry
    是镜像和图表的仓库,它不具有本地数据库以及不提供用户认证,通过Index Auth service的Token的方式进行认证。
  • Registry Client
    Docker充当registry客户端来维护推送和拉取,以及客户端的授权。
  • 用户要获取并下载镜像
    在这里插入图片描述
  • 用户要推送镜像到registry中
    在这里插入图片描述
  • 用户要从index或registry中删除镜像
    在这里插入图片描述

docker使用的时grpc协议,访问他的API

四、配置镜像加速器

从docker hub上下载镜像的速度太慢,需要配置镜像加速器,这里以阿里云为例:(需要提前注册阿里云帐号)

  • 配置docker daemon文件:
# vim /etc/docker/daemon.json
  {
  "registry-mirrors": ["https://vo5twm71.mirror.aliyuncs.com"]
  }
  • 重载docker服务:
# systemctl daemon-reload
# systemctl restart docker

五、搭建私有仓库

  • docker hub虽然方便,但是还是有限制
    需要internet连接,速度慢
    所有人都可以访问
    安全原因企业不允许将镜像放到外网
  • docker公司已经将registry开源,可以快速构建企业私有仓库
    registry官网

1.下载registry镜像

[root@server1 ~]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
cbdbe7a5bc2a: Pull complete 
47112e65547d: Pull complete 
46bcb632e506: Pull complete 
c1cc712bcecd: Pull complete 
3db6272dcbfa: Pull complete 
Digest: sha256:8be26f81ffea54106bae012c6f349df70f4d5e7e2ec01b143c46e2c03b9e551d
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest
  • 上传nginx镜像到本地仓库:(为了之后的测试)
[root@server1 ~]# docker tag nginx:latest localhost:443/nginx:latest
[root@server1 ~]# docker push localhost:443/nginx:latest

2.为docker仓库添加证书加密功能

  • 创建certs目录,存放证书
[root@server1 ~]# mkdir certs
  • 生成自签名证书
[root@server1 ~]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/westos.org.key -x509 -days 365 -out certs/westos.org.crt
## 使用openssl 协议生成一个自签名证书
## 使用rsa算法4096位
## key输出到certs/westos.org.key
##  -x509 :格式
## 365天过期
## 证书在certs/westos.org.crt

Generating a 4096 bit RSA private key
....................................................................................................++
........................................................................................++
writing new private key to 'certs/westos.org.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:cn
State or Province Name (full name) []:shaanxi
Locality Name (eg, city) [Default City]:xi'an
Organization Name (eg, company) [Default Company Ltd]:westos
Organizational Unit Name (eg, section) []:linux
Common Name (eg, your name or your server's hostname) []:westos.org     # 域名westos.org要求在主机上有解析
Email Address []:root@westos.org
  • 查看证书
[root@server1 ~]# cd certs/
[root@server1 certs]# ls
westos.org.crt  westos.org.key

3.创建并运行容器

需要把证书mount进去,使容器可以识别到

[root@server1 certs]# docker run -d -p 443:443 --restart=always --name registry -v /opt/registry:/var/lib/registry -v /root/certs:/certs -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/westos.org.crt -e REGISTRY_HTTP_TLS_KEY=/certs
/westos.org.key registry
## -d:打入后台;create:创建;run:创建并运行
## --name registry 容器名称
## /root/certs:宿主机路径;/certs:容器路径,把宿主机/root/certs挂接到容器内
## -v /opt/registry:/var/lib/registry:将宿主机的 /opt/registry挂接到容器的/var/lib/registry,这是registry容器的数据目录
## -e REGISTRY_HTTP_ADDR=0.0.0.0:443 #用来编辑配置文件里有个registry httpd addr,让他启用443端口
## -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/westos.org.crt 证书的位置
## -e REGISTRY_HTTP_TLS_KEY=/certs  key的位置
## 最后的registry是镜像

Unable to find image 'registry:latest' locally
latest: Pulling from library/registry
cbdbe7a5bc2a: Pull complete 
47112e65547d: Pull complete 
46bcb632e506: Pull complete 
c1cc712bcecd: Pull complete 
3db6272dcbfa: Pull complete 
Digest: sha256:8be26f81ffea54106bae012c6f349df70f4d5e7e2ec01b143c46e2c03b9e551d
Status: Downloaded newer image for registry:latest
5f0523c596d1c59aa66611c084297c0c2316572ef57eb30b6c7464912c7fdc35

docker run 的机制:
使用客户端连接以grpc协议的API去连接docker引擎,docker引擎调用runc开启container
docker在系统中是以root身份运行的,不安全
企业8 podman更轻量,后台没有进程,也是用runc启动的容器,普通用户也可以用,谁上传谁用

[root@server1 certs]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                            NAMES
5f0523c596d1        registry            "/entrypoint.sh /etc…"   2 minutes ago       Up 2 minutes        0.0.0.0:443->443/tcp, 5000/tcp   registry
[root@server1 certs]# docker port registry
443/tcp -> 0.0.0.0:443

4. 添加解析

[root@server1 certs]# vim /etc/hosts

172.25.4.1	server1 westos.org
  • 拉取镜像提示没有证书
[root@server1 certs]# docker pull westos.org/nginx
Using default tag: latest
Error response from daemon: Get https://westos.org/v2/: x509: certificate signed by unknown authority

5. 将生成的证书放在指定位置

想要docker引擎能通过证书访问仓库,必须将证书放在指定位置

[root@server1 certs]# cd /etc/docker/
[root@server1 docker]# ls
daemon.json  key.json
[root@server1 docker]# mkdir -p certs.d/westos.org     
[root@server1 docker]# cd certs.d/westos.org/
[root@server1 docker]# pwd
/etc/docker/certs.d/westos.org       # westos.org这个目录就是仓库的地址,一定要有解析,要和刚才创建证书设置的hostname一致
[root@server1 westos.org]# cp /root/certs/westos.org.crt .
[root@server1 westos.org]# ls
westos.org.crt
[root@server1 westos.org]# mv westos.org.crt ca.crt
[root@server1 westos.org]# ls
ca.crt

6. 测试

[root@server1 ~]# docker tag nginx:1.16.1 westos.org/nginx
[root@server1 ~]# docker push westos.org/nginx
The push refers to repository [westos.org/nginx]
c23548ea0b99: Pushed 
82068c842707: Pushed 
c2adabaecedb: Pushed 
latest: digest: sha256:2963fc49cc50883ba9af25f977a9997ff9af06b45c12d968b7985dc1e9254e4b size: 948

###可以从私有仓库拉取
[root@server1 ~]# docker pull westos.org/nginx
Using default tag: latest
latest: Pulling from nginx
Digest: sha256:2963fc49cc50883ba9af25f977a9997ff9af06b45c12d968b7985dc1e9254e4b
Status: Image is up to date for westos.org/nginx:latest
westos.org/nginx:latest

7. 远程访问

  • 将证书远程发送到客户端(server3)
    需要在server3把docker服务配置好
[root@server1 westos.org]# cd ..
[root@server1 certs.d]# cd ..
[root@server1 docker]# scp -r certs.d/ server3:/etc/docker
root@server3's password: 
westos.org.crt                                                                           100% 2098     2.9MB/s   00:00    
[root@server3 ~]# ls /etc/docker
certs.d  daemon.json  key.json
[root@server3 ~]# systemctl  enable --now docker
[root@server3 ~]# docker pull westos.org/nginx

当前把证书放在/etc/docker/是为了能让docker引擎识别到,如果是curl命令呢,这种方式是为了能让系统识别到

[root@server1 docker]# curl -k https://westos.org/v2/_catalog
{"repositories":[]}

8. 为Docker仓库添加用户认证功能

(1)生成用户密码文件

[root@server1 ~]# mkdir auth
[root@server1 ~]# cd auth/
[root@server1 ~]# yum install httpd-tools
[root@server1 auth]# htpasswd -Bc htpasswd admin
New password: 
Re-type new password: 
Adding password for user admin
[root@server1 auth]# cat htpasswd 
admin:$2y$05$ZboxoU8w2aD69kMYUJeHt.3JhD3QyUbklbd0ZBnYzFxStTHvLQ4di
[root@server1 auth]# htpasswd -B htpasswd wwy
New password: 
Re-type new password: 
Adding password for user wwy
[root@server1 auth]# cat htpasswd 
admin:$2y$05$ZboxoU8w2aD69kMYUJeHt.3JhD3QyUbklbd0ZBnYzFxStTHvLQ4di
wwy:$2y$05$rWmScx1GUa3VCxBR.7eyZO5ltiI131t6.fwGKEa14EHcDijG69Jay
  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker私有仓库是一种用于存储、管理和分发Docker镜像的服务器。搭建一个私有仓库可以帮助开发者更好地管理自己的Docker镜像,也可以提高镜像的安全性。 以下是搭建Docker私有仓库的步骤: 1. 安装Docker 首先需要在服务器上安装Docker,可以根据操作系统类型选择合适的安装方法。 2. 下载Docker Registry镜像 在Docker Hub上下载Docker Registry镜像,可以使用以下命令: ``` docker pull registry:2 ``` 3. 运行Docker Registry容器 使用以下命令运行Docker Registry容器: ``` docker run -d -p 5000:5000 --restart=always --name registry registry:2 ``` 这里使用了-p参数将容器的5000端口映射到主机的5000端口,使得外部可以通过主机的IP地址和端口号访问私有仓库。使用--restart参数可以设置容器在重启后自动启动。使用--name参数可以指定容器的名称。 4. 配置Docker客户端 为了能够访问私有仓库,需要在Docker客户端中配置私有仓库的地址。可以通过以下方式修改Docker客户端的配置文件: ``` vi /etc/docker/daemon.json ``` 在文件中添加以下内容: ``` { "insecure-registries" : ["your-registry:5000"] } ``` 这里的your-registry是私有仓库所在的主机IP地址或域名。 5. 推送和拉取镜像 现在可以使用Docker客户端推送和拉取镜像到私有仓库了。推送镜像使用以下命令: ``` docker tag your-image your-registry:5000/your-image docker push your-registry:5000/your-image ``` 这里的your-image是要推送的镜像名称。拉取镜像使用以下命令: ``` docker pull your-registry:5000/your-image ``` 这里的your-image是要拉取的镜像名称。 至此,Docker私有仓库搭建完成。需要注意的是,私有仓库的安全性需要开发者自行维护,例如限制访问权限、定期备份等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值