一、什么是仓库
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
9. 重建容器
[root@server1 auth]# ll
total 4
-rw-r--r-- 1 root root 132 Sep 4 11:14 htpasswd
[root@server1 ~]# 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 -v /root/auth:/auth -e REGISTRY_AUTH=htpasswd -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry
b92cd63027af644475b7674ac90f440dab21080583e6a8e2a803f2ff56eb87c0
10. docker主机认证
[root@server1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b92cd63027af re