欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

docker之搭建私有仓库registry7

时间:2023-07-25
搭建私有仓库的意义

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

搭建私有仓库

在宿主机上面拉取registry镜像

[root@docker1 docker]# docker pull registry

重要信息

[root@docker1 docker]# docker history registry 2 months ago /bin/sh -c #(nop) EXPOSE 5000 0B 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 SIZEwebserver v4 0fce27d5ac56 47 hours ago 31.7MBlocalhost: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:latestUntagged: localhost:5000/webserver@sha256:e1fcc49060c0bfcabaf933ce8ca297fc4df63b80113f5098d931f9fac65464feDeleted: sha256:0fce27d5ac5666a7fef70f3ad01b64177509acf11495c42ff85ef392b68e979fDeleted: sha256:0bd5d2b3dad5cbee261f44fbe012ed0d0809990d75503463fb5d4ec17a582149Deleted: sha256:5ee35935b3b95e4a02f7dde3541e235eb6d67421bd52157d29e13b2055dff9c2Deleted: sha256:502cc226f58a8c7b0adf7a06b92a2d5156d08d7af7b21bc6e4d6a69

从仓库拉取镜像

[root@docker1 ~]# docker pull localhost:5000/webserver [root@docker1 ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZElocalhost: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 disabledWARNING: 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/webserverUsing default tag: latestError 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 imagesREPOSITORY TAG IMAGE ID CREATED SIZE172.25.254.1:5000/webserver latest 0fce27d5ac56 47 hours ago 31.7MB

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

实验环境:

[root@docker1 sysctl.d]# docker ps -aConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESbcb7e7682a99 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 lsDRIVER VOLUME NAMElocal 70f0dede14b7c1978edb38eb49534509f1fcc205e750bb365254b75677b76005local a780ebed1de6be544711f18a254682fc4f018ce2f7058b0a23f6f16a3eb73171local ab43717053b89c0a594289ab002bbc48ab9144075c88e5a230b78cb24250b305local b76dc83d8ac88ed49f725bd014ec89e97c4f7b3cc2b75a803e9c66af1b5c101elocal f266d47b2c99eadd824c8d31ce921b03db558b0817b6bb20e36858e5000f8363

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

[root@docker1 sysctl.d]# docker volume prune

[root@docker1 sysctl.d]# docker volume lsDRIVER 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]:cnState or Province Name (full name) []:shanxiLocality Name (eg, city) [Default City]:xi'anOrganization Name (eg, company) [Default Company Ltd]:yanOrganizational Unit Name (eg, section) []:linuxCommon 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 psConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESda3da9151ec0 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/nginxThe 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]# lsyan.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]# lsca.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.VutAC4Akv7z9LdPoH7G2I134KxLD1l4fyzrx:$2y$05$c77YlrPXP1oz6M6LRwydyOrywlVnvT28GGQWGwniscZe58F21mF6C

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

将认证目录挂载到容器内的/auth,告诉要启动htpasswd认证方式,读取该认证文件,修改仓库参数

[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 registry832e2bdb222d16ac3c25521d1a8420d48c4e4d6ce71028217f47a142d7709d01

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

[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: latestError 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.orgUsername: ywqPassword: Login Succeeded

成功后会存储到这个文件

[root@docker2 ~]# cd .docker/[root@docker2 .docker]# lsconfig.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.orgRemoving 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

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。