搭建私有仓库的意义
在生产环境中,你的服务器可能不能上网 在内网集群里面,布置容器大量应用的时候,成千上万的,体量很大,分布密度比传统的虚拟化大很多,分布在不同节点上面跑,从远端仓库拉取很消耗网络资源和时间,所以必须在内网里面布置一个私有仓库,让其部署效率变快。 官方文档网址:https://docs.docker.com/registry/deploying/
搭建私有仓库
在宿主机上面拉取registry镜像
[root@docker1 docker]
重要信息
[root@docker1 docker]
<missing> 2 months ago /bin/sh -c
<missing> 2 months ago /bin/sh -c
–restart=always开机自启动
[root@docker1 ~]
向仓库上传自己的镜像,要先将镜像改名成仓库地址和端口加镜像名称,后面不加版本便为最新版
[root@docker1 ~]
上传
[root@docker1 ~]
删掉本地的镜像
[root@docker1 ~]
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 ~]
Untagged: webserver:v4
[root@docker1 ~]
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 ~]
[root@docker1 ~]
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost:5000/webserver latest 0fce27d5ac56 47 hours ago 31.7MB
搭建私有仓库的功能
实验环境的搭建:
开启另一个虚拟机docker2,安装上docker就行,并且启动
[root@docker2 yum.repos.d]
[root@docker2 yum.repos.d]
没有ip,所以修改内核参数,docker1修改过,把内核文件复制给docker2就可以了
[root@docker2 yum.repos.d]
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
[root@docker1 sysctl.d]
[root@docker2 yum.repos.d]
无认证加密功能认证仓库的搭建
docker2 拉取docker1仓库的镜像,默认仓库是不支持非加密访问远端仓库。
[root@docker2 sysctl.d]
Insecure Registries:
127.0.0.0/8
[root@docker2 sysctl.d]
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]
[root@docker2 docker]
{
"insecure-registries" : ["172.25.254.1:5000"]
}
[root@docker2 docker]
[root@docker2 docker]
支持非安全的仓库,本地的localhost和docker1的5000端口
[root@docker2 docker]
Insecure Registries:
172.25.254.1:5000
127.0.0.0/8
拉取成功
[root@docker2 docker]
[root@docker2 docker]
REPOSITORY TAG IMAGE ID CREATED SIZE
172.25.254.1:5000/webserver latest 0fce27d5ac56 47 hours ago 31.7MB
搭建认证加密功能的仓库(生成证书并启动registry)
实验环境:
[root@docker1 sysctl.d]
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]
registry
容器删掉了,但是卷存储了容器的操作,对存储没有影响
[root@docker1 sysctl.d]
DRIVER VOLUME NAME
local 70f0dede14b7c1978edb38eb49534509f1fcc205e750bb365254b75677b76005
local a780ebed1de6be544711f18a254682fc4f018ce2f7058b0a23f6f16a3eb73171
local ab43717053b89c0a594289ab002bbc48ab9144075c88e5a230b78cb24250b305
local b76dc83d8ac88ed49f725bd014ec89e97c4f7b3cc2b75a803e9c66af1b5c101e
local f266d47b2c99eadd824c8d31ce921b03db558b0817b6bb20e36858e5000f8363
删掉本地没有被容器使用的卷
[root@docker1 sysctl.d]
[root@docker1 sysctl.d]
DRIVER VOLUME NAME
启动认证功能,首先开启其加密功能,保证认证的网络通信是加密的,不然alice截获,便成明文了,没有意义了。 读官方文档 要使用证书,所以我的证书是自签名的证书,在https://docs.docker.com/registry/insecure/有相关文档 在生产环境中的证书是从CA申请过来的,所以测试我用自签名证书 创建存放证书的目录,在linux中所以证书是通过openssl来运行的
[root@docker1 ~]
[root@docker1 ~]
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 ~]
yan.org.crt yan.org.key
-v手动挂接,将生成的/certs挂入容器的/certs 容器启动443端口加密 由于官方的,没有加入卷,到时候删掉仓库容器后,还得重新上传镜像,麻烦,所以我多加了一条指令 在宿主机/opt/registry路径(自动帮忙生成,如果有直接挂载)挂载到/var/lib/registry这个目录上面(在容器内是仓库存放镜像的位置)
-v /opt/registry:/var/lib/registry
[root@docker1 ~]
后面所有镜像保存在该位置,可以在宿主机里面做持久化
[root@docker1 ~]
drwxr-xr-x 2 root root 6 Feb 6 21:10 /opt/registry/
[root@docker1 ~]
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 ~]
443/tcp -> 0.0.0.0:443
远程连接: 在docker2加入解析docker1的仓库
[root@docker2 docker]
远程上传: 默认端口是443可以不用加
[root@docker2 docker]
[root@docker2 docker]
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]
[root@docker2 docker]
[root@docker2 certs.d]
/etc/docker/certs.d/reg.yan.org
[root@docker1 ~]
[root@docker1 certs]
yan.org.crt yan.org.key
[root@docker1 certs]
[root@docker2 reg.yan.org]
ca.crt
有了证书,远程上传成功
[root@docker2 reg.yan.org]
上传的镜像会保存到/opt/registry持久化了,实际是上传到容器内/var/lib/registry,但是你实际是把宿主机的目录挂在/var/lib/registry,所以会持久化
搭建registry的认证功能
在官方文档https://docs.docker.com/registry/deploying/ 官方是通过运行httpd镜像容器,然后使用htpasswd加密生成用户加密文件,所以我们安装了http-tools,不需要运行容器来加密,麻烦。 调用了htpasswd工具生成用户名密码的认证文件,这是http中的工具
[root@docker1 ~]
[root@docker1 ~]
[root@docker1 auth]
[root@docker1 auth]
-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]
ywq:$2y$05$fKzYdI2UoQqofccJO0F.VutAC4Akv7z9LdPoH7G2I134KxLD1l4fy
zrx:$2y$05$c77YlrPXP1oz6M6LRwydyOrywlVnvT28GGQWGwniscZe58F21mF6C
[root@docker1 ~]
将认证目录挂载到容器内的/auth,告诉要启动htpasswd认证方式,读取该认证文件,修改仓库参数
[root@docker1 ~]
832e2bdb222d16ac3c25521d1a8420d48c4e4d6ce71028217f47a142d7709d01
远程上传拉取(缺少认证):
[root@docker2 reg.yan.org]
no basic auth credentials
[root@docker2 reg.yan.org]
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]
Username: ywq
Password:
Login Succeeded
成功后会存储到这个文件
[root@docker2 ~]
[root@docker2 .docker]
config.json
[root@docker2 .docker]
{
"auths": {
"reg.yan.org": {
"auth": "eXdxOndlc3Rvcw=="
}
},
"HttpHeaders": {
"User-Agent": "Docker-Client/19.03.15 (linux)"
}
}
[root@docker2 .docker]
Removing login credentials for reg.yan.org
[root@docker2 .docker]
{
"auths": {},
"HttpHeaders": {
"User-Agent": "Docker-Client/19.03.15 (linux)"
}
}
所以只要就登陆一次就记录了,不需要重复登陆,除非你注销了。
认证后,远程上传成功
[root@docker2 .docker]
|