docker之搭建私有仓库registry7

搭建私有仓库的意义

在生产环境中,你的服务器可能不能上网
在内网集群里面,布置容器大量应用的时候,成千上万的,体量很大,分布密度比传统的虚拟化大很多,分布在不同节点上面跑,从远端仓库拉取很消耗网络资源和时间,所以必须在内网里面布置一个私有仓库,让其部署效率变快。
官方文档网址:https://docs.docker.com/registry/deploying/
在这里插入图片描述

搭建私有仓库

在宿主机上面拉取registry镜像

[root@docker1 docker]# docker pull registry

重要信息

[root@docker1 docker]# docker history registry
<missing>           2 months ago        /bin/sh -c #(nop)  EXPOSE 5000                  0B                  
<missing>           2 months ago        /bin/sh -c #(nop)  VOLUME [/var/lib/registry]   0B                  

–restart=always开机自启动

[root@docker1 ~]#  docker run -d -p 5000:5000 --restart=always --name registry registry

向仓库上传自己的镜像,要先将镜像改名成仓库地址和端口加镜像名称,后面不加版本便为最新版

[root@docker1 ~]# docker tag webserver:v4 localhost:5000/webserver

上传

[root@docker1 ~]# docker push localhost:5000/webserver

删掉本地的镜像

[root@docker1 ~]# docker images 
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
webserver                         v4                  0fce27d5ac56        47 hours ago        31.7MB
localhost:5000/webserver          latest              0fce27d5ac56        47 hours ago        31.7MB
[root@docker1 ~]# docker rmi webserver:v4 
Untagged: webserver:v4
[root@docker1 ~]# docker rmi localhost:5000/webserver:latest 
Untagged: localhost:5000/webserver:latest
Untagged: localhost:5000/webserver@sha256:e1fcc49060c0bfcabaf933ce8ca297fc4df63b80113f5098d931f9fac65464fe
Deleted: sha256:0fce27d5ac5666a7fef70f3ad01b64177509acf11495c42ff85ef392b68e979f
Deleted: sha256:0bd5d2b3dad5cbee261f44fbe012ed0d0809990d75503463fb5d4ec17a582149
Deleted: sha256:5ee35935b3b95e4a02f7dde3541e235eb6d67421bd52157d29e13b2055dff9c2
Deleted: sha256:502cc226f58a8c7b0adf7a06b92a2d5156d08d7af7b21bc6e4d6a69

从仓库拉取镜像

[root@docker1 ~]# docker pull localhost:5000/webserver 
[root@docker1 ~]# docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
localhost:5000/webserver          latest              0fce27d5ac56        47 hours ago        31.7MB

搭建私有仓库的功能

实验环境的搭建:

开启另一个虚拟机docker2,安装上docker就行,并且启动

[root@docker2 yum.repos.d]# yum install -y docker-ce
[root@docker2 yum.repos.d]# systemctl enable docker

没有ip,所以修改内核参数,docker1修改过,把内核文件复制给docker2就可以了

[root@docker2 yum.repos.d]# docker info 
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
[root@docker1 sysctl.d]# scp docker.conf docker2:/etc/sysctl.d/
[root@docker2 yum.repos.d]# sysctl --system

无认证加密功能认证仓库的搭建

docker2 拉取docker1仓库的镜像,默认仓库是不支持非加密访问远端仓库。

[root@docker2 sysctl.d]# docker info 
Insecure Registries:
  127.0.0.0/8
[root@docker2 sysctl.d]# docker pull 172.25.254.1:5000/webserver
Using default tag: latest
Error response from daemon: Get https://172.25.254.1:5000/v2/: http: server gave HTTP response to HTTPS client

官方文档上面写的,使用一个非加密的仓库
在这里插入图片描述
在这里插入图片描述

[root@docker2 docker]# vim daemon.json
[root@docker2 docker]# cat daemon.json 
{
  "insecure-registries" : ["172.25.254.1:5000"]
}
[root@docker2 docker]# systemctl daemon-reload 
[root@docker2 docker]# systemctl restart docker

支持非安全的仓库,本地的localhost和docker1的5000端口

[root@docker2 docker]# docker info 
 Insecure Registries:
  172.25.254.1:5000
  127.0.0.0/8

拉取成功

[root@docker2 docker]# docker pull 172.25.254.1:5000/webserver
[root@docker2 docker]# docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
172.25.254.1:5000/webserver   latest              0fce27d5ac56        47 hours ago        31.7MB

搭建认证加密功能的仓库(生成证书并启动registry)

实验环境:

[root@docker1 sysctl.d]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
bcb7e7682a99        registry            "/entrypoint.sh /etc…"   53 minutes ago      Up 53 minutes       0.0.0.0:5000->5000/tcp   registry
[root@docker1 sysctl.d]# docker rm -f registry 
registry

容器删掉了,但是卷存储了容器的操作,对存储没有影响

[root@docker1 sysctl.d]# docker volume ls
DRIVER              VOLUME NAME
local               70f0dede14b7c1978edb38eb49534509f1fcc205e750bb365254b75677b76005
local               a780ebed1de6be544711f18a254682fc4f018ce2f7058b0a23f6f16a3eb73171
local               ab43717053b89c0a594289ab002bbc48ab9144075c88e5a230b78cb24250b305
local               b76dc83d8ac88ed49f725bd014ec89e97c4f7b3cc2b75a803e9c66af1b5c101e
local               f266d47b2c99eadd824c8d31ce921b03db558b0817b6bb20e36858e5000f8363

删掉本地没有被容器使用的卷

[root@docker1 sysctl.d]# docker volume prune 
[root@docker1 sysctl.d]# docker volume ls
DRIVER              VOLUME NAME

启动认证功能,首先开启其加密功能,保证认证的网络通信是加密的,不然alice截获,便成明文了,没有意义了。
读官方文档
在这里插入图片描述要使用证书,所以我的证书是自签名的证书,在https://docs.docker.com/registry/insecure/有相关文档
在生产环境中的证书是从CA申请过来的,所以测试我用自签名证书
在这里插入图片描述创建存放证书的目录,在linux中所以证书是通过openssl来运行的

[root@docker1 ~]# mkdir -p certs
[root@docker1 ~]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/yan.org.key -x509 -days 365 -out certs/yan.org.crt
Country Name (2 letter code) [XX]:cn
State or Province Name (full name) []:shanxi
Locality Name (eg, city) [Default City]:xi'an
Organization Name (eg, company) [Default Company Ltd]:yan
Organizational Unit Name (eg, section) []:linux
Common Name (eg, your name or your server's hostname) []:reg.yan.org  仓库的域名      
Email Address []:

证书创建成功

[root@docker1 ~]# ls certs/
yan.org.crt  yan.org.key

在这里插入图片描述
-v手动挂接,将生成的/certs挂入容器的/certs
容器启动443端口加密
在这里插入图片描述由于官方的,没有加入卷,到时候删掉仓库容器后,还得重新上传镜像,麻烦,所以我多加了一条指令
在宿主机/opt/registry路径(自动帮忙生成,如果有直接挂载)挂载到/var/lib/registry这个目录上面(在容器内是仓库存放镜像的位置)

-v /opt/registry:/var/lib/registry 
[root@docker1 ~]# docker run -d   --restart=always   --name registry   -v "$(pwd)"/certs:/certs -v /opt/registry:/var/lib/registry  -e REGISTRY_HTTP_ADDR=0.0.0.0:443   -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/yan.org.crt   -e REGISTRY_HTTP_TLS_KEY=/certs/yan.org.key  -p 443:443   registry

后面所有镜像保存在该位置,可以在宿主机里面做持久化

[root@docker1 ~]# ll -d /opt/registry/
drwxr-xr-x 2 root root 6 Feb  6 21:10 /opt/registry/
[root@docker1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                            NAMES
da3da9151ec0        registry            "/entrypoint.sh /etc…"   2 minutes ago       Up About a minute   0.0.0.0:443->443/tcp, 5000/tcp   registry
[root@docker1 ~]# docker port registry 
443/tcp -> 0.0.0.0:443

远程连接:
在docker2加入解析docker1的仓库

[root@docker2 docker]# sudo vim /etc/hosts

在这里插入图片描述
远程上传:
默认端口是443可以不用加

[root@docker2 docker]# docker tag nginx:latest reg.yan.org/nginx
[root@docker2 docker]# docker push reg.yan.org/nginx
The push refers to repository [reg.yan.org/nginx]
Get https://reg.yan.org/v2/: x509: certificate signed by unknown authority

缺少证书,需要添加证书,让docker引擎识别到证书
在这里插入图片描述
所有客户端都需要证书,一旦启动加密功能以后
后面端口不用加,默认是443,加个:443也可以
只要访问reg.yan.org这个仓库,它会自动去这个路经找证书,证书是docker1创建的

[root@docker2 docker]# mkdir /etc/docker/certs.d
[root@docker2 docker]# cd certs.d/
[root@docker2 certs.d]# mkdir reg.yan.org
/etc/docker/certs.d/reg.yan.org
[root@docker1 ~]# cd certs/
[root@docker1 certs]# ls
yan.org.crt  yan.org.key
[root@docker1 certs]# scp yan.org.crt docker2:/etc/docker/certs.d/reg.yan.org/ca.crt
[root@docker2 reg.yan.org]# ls
ca.crt

有了证书,远程上传成功

[root@docker2 reg.yan.org]# docker push reg.yan.org/nginx 

上传的镜像会保存到/opt/registry持久化了,实际是上传到容器内/var/lib/registry,但是你实际是把宿主机的目录挂在/var/lib/registry,所以会持久化

搭建registry的认证功能

在官方文档https://docs.docker.com/registry/deploying/
官方是通过运行httpd镜像容器,然后使用htpasswd加密生成用户加密文件,所以我们安装了http-tools,不需要运行容器来加密,麻烦。
在这里插入图片描述在这里插入图片描述
调用了htpasswd工具生成用户名密码的认证文件,这是http中的工具

[root@docker1 ~]# mkdir auth
[root@docker1 ~]# cd auth/
[root@docker1 auth]# yum install -y httpd-tools
[root@docker1 auth]# htpasswd --help
-B -b -n 都有
 -B  Force bcrypt encryption of the password (very secure).
 -n  Don't update file; display results on stdout.
 -b  Use the password from the command line rather than prompting for it.
 -C  Set the computing time used for the bcrypt algorithm
 (higher is more secure but slower, default: 5, valid: 4 to 31).

第一次要加-c,第二次再使用就第一次的就被覆盖掉了

[root@docker1 auth]# cat htpasswd 
ywq:$2y$05$fKzYdI2UoQqofccJO0F.VutAC4Akv7z9LdPoH7G2I134KxLD1l4fy
zrx:$2y$05$c77YlrPXP1oz6M6LRwydyOrywlVnvT28GGQWGwniscZe58F21mF6C

在这里插入图片描述

[root@docker1 ~]# docker rm -f registry 

将认证目录挂载到容器内的/auth,告诉要启动htpasswd认证方式,读取该认证文件,修改仓库参数
–restart=always随着docker引擎的启动,该registry容器启动

[root@docker1 ~]# docker run -d   --restart=always   --name registry   -v "$(pwd)"/certs:/certs -v /opt/registry:/var/lib/registry   -v "$(pwd)"/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm"  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -e REGISTRY_HTTP_ADDR=0.0.0.0:443   -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/yan.org.crt   -e REGISTRY_HTTP_TLS_KEY=/certs/yan.org.key  -p 443:443   registry
832e2bdb222d16ac3c25521d1a8420d48c4e4d6ce71028217f47a142d7709d01

远程上传拉取(缺少认证):

[root@docker2 reg.yan.org]# docker push reg.yan.org/nginx 
no basic auth credentials
[root@docker2 reg.yan.org]# docker pull reg.yan.org/nginx 
Using default tag: latest
Error response from daemon: Get https://reg.yan.org/v2/nginx/manifests/latest: no basic auth credentials
[root@docker2 reg.yan.org]# docker login reg.yan.org
Username: ywq
Password: 
Login Succeeded

成功后会存储到这个文件

[root@docker2 ~]# cd .docker/
[root@docker2 .docker]# ls
config.json
[root@docker2 .docker]# cat config.json 
{
	"auths": {
		"reg.yan.org": {
			"auth": "eXdxOndlc3Rvcw=="
		}
	},
	"HttpHeaders": {
		"User-Agent": "Docker-Client/19.03.15 (linux)"
	}
}
[root@docker2 .docker]# docker logout reg.yan.org
Removing login credentials for reg.yan.org
[root@docker2 .docker]# cat config.json 
{
	"auths": {},
	"HttpHeaders": {
		"User-Agent": "Docker-Client/19.03.15 (linux)"
	}
}

所以只要就登陆一次就记录了,不需要重复登陆,除非你注销了。

认证后,远程上传成功

[root@docker2 .docker]# docker push reg.yan.org/nginx 

END

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值