admin管理员组文章数量:1568305
一、Docker 仓库简介
仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。;实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载
国内的公开仓库包括 Docker Pool等,可以提供大陆用户更稳定快速的访问;当然,用户也可以在本地网络内创建一个私有仓库;当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库;这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。
二、什么是 DockerHub ?
DockerHub 是一个由 Docker 公司运行和管理的基于云的存储库。它是一个在线存储库,Docker 镜像可以由其他用户发布和使用。有两种库:公共存储库和私有存储库。如果你是一家公司,你可以在你自己的组织内拥有一个私有存储库,而公共镜像可以被任何人使用。
三、什么是harbor?
Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器。
镜像的存储harbor使用的是官方的docker registry(v2命名是distribution)服务去完成。
harbor在docker distribution的基础上增加了一些安全、访问控制、管理的功能以满足企业对于镜像仓库的需求。
harbor以docker-compose的规范形式组织各个组件,并通过docker-compose工具进行启停。
Harbor是VMware公司开源了企业级Registry项目, 其的目标是帮助用户迅速搭建一个企业级的Docker registry服务。
它以Docker公司开源的registry为基础,额外提供了如下功能:
基于角色的访问控制(Role Based Access Control)
基于策略的镜像复制(Policy based image replication)
镜像的漏洞扫描(Vulnerability Scanning)
AD/LDAP集成(LDAP/AD support)
镜像的删除和空间清理(Image deletion & garbage collection)
友好的管理UI(Graphical user portal)
审计日志(Audit logging)
RESTful API
部署简单(Easy deployment)
四、私有仓库registry的优势
使用Docker Hub这样的公共仓库可能不方便,这种情况下用户可以使用registry创建一个本地仓库供私人使用;这点跟Maven的管理类似
使用私有仓库有许多优点
1)节省网络带宽,针对于每个镜像不用每个人都去中央仓库上面去下载,只需要从私有仓库中下载即可;
2)提供镜像资源利用,针对于公司内部使用的镜像,推送到本地的私有仓库中,以供公司内部相关人员使用。
五、Registry的工作原理
index服务主要提供镜像索引以及用户认证的功能。当下载一个镜像的时候,首先会去index服务上做认证,然后查找镜像所在的registry的地址并放回给docker客户端,docker客户端再从registry下载镜像,在下载过程中 registry会去index校验客户端token的合法性,不同镜像可以保存在不同的registry服务上,其索引信息都放在index服务上。
Docker Registry有三个角色:分别是index、registry和registry client。
index
负责并维护有关用户帐户、镜像的校验以及公共命名空间的信息。
Web UI
元数据存储
认证服务
符号化
registry
是镜像和图表的仓库
它不具有本地数据库以及不提供用户认证
通过Index Auth service的Token的方式进行认证。
Registry Client
Docker充当registry客户端来维护推送和拉取,以及客户端的授权。
六、创建私有仓库以及上传本地镜像到私有仓库当中
Docker 官方已经把仓库封装为镜像,直接通过启动容器就可以完成部署仓库,导入registry镜像
首先配置一个镜像加速器,因为docker网站是国外的使用docker pull 镜像
拉取速度缓慢,可以使用阿里云(国内拉取镜像加速器)
进入aliyum官方网站点击控制台输入密码登录,进入后按照下图操作
mkdir -p /etc/docker
/etc/docker/daemon.json
{
"registry-mirrors": ["https://ck7lkd69.mirror.aliyuncs"]
}
systemctl daemon-reload
systemctl restart docker
[root@server1 ~]# cd /etc/docker/
[root@server1 docker]# vim daemon.json
[root@server1 docker]# cat daemon.json 此内容不可抄袭,每位阿里云用户不一样
{
"registry-mirrors": ["https://ck7lkd69.mirror.aliyuncs"]
}
[root@server1 docker]# systemctl daemon-reload
[root@server1 docker]# systemctl restart docker
以上就是配置镜像加速器的步骤
实验环境使用之前装好docker的虚拟机,此次需要虚拟机上网
拉取registry镜像
registry私有仓库镜像打开5000端口
导入镜像并做端口映射
删除之前运行的容器只开启这一个
将本地镜像上传至私有仓库
[root@server1 ~]# docker pull nginx 拉取nginx镜像
Using default tag: latest
latest: Pulling from library/nginx
afb6ec6fdc1c: Pull complete
dd3ac8106a0b: Pull complete
8de28bdda69b: Pull complete
a2c431ac2669: Pull complete
e070d03fd1b5: Pull complete
Digest: sha256:883874c218a6c71640579ae54e6952398757ec65702f4c8ba7675655156fcca6
Status: Downloaded newer image for nginx:lates
tag打标签:
[root@server1 ~]# docker tag nginx:latest localhost:5000/nginx:latest
[root@server1 ~]# docker push localhost:5000/nginx 通过5000端口上传镜像
The push refers to repository [localhost:5000/nginx]
787328500ad5: Pushed
077ae58ac205: Pushed
8c7fd6263c1f: Pushed
d9c0b16c8d5b: Pushed
ffc9b21953f4: Pushed
latest: digest: sha256:d9002da0297bcd0909b394c26bd0fc9d8c466caf2b7396f58948cac5318d0d0b size: 1362
[root@server1 ~]# curl localhost:5000/v2/_catalog 浏览器方式也可以访问查看
{"repositories":["nginx"]}
[root@server1 _data]#
/var/lib/docker/volumes/3b95148919210e84198c4ce9bb373c4939f0233ad5f8c38c4065f0bf0fc04d11/_data
[root@server1 _data]# tree 私有仓库和镜像详细信息
七、给私有仓库添加证书
[root@server1 ~]# mkdir -p certs
[root@server1 ~]# openssl req \
> -newkey rsa:4096 -nodes -sha256 -keyout certs/westos.org.key \
> -x509 -days 365 -out certs/westos.org.crt
> Generating a 4096 bit RSA private key
................................................................++
...............................................................................................................++
writing new private key to 'certs/westos.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) []:Shanxi
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
Email Address []:root@westos.org
[root@server1 ~]# ls certs/ 生成证书和key
westos.org.crt westos.org.key
添加本地解析
[root@server1 ~]# vim /etc/hosts
[root@server1 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.254.66 client
172.25.254.1 server1 westos.org
172.25.254.2 server2
172.25.254.3 server3
172.25.254.4 server4
重新运行镜像需要创建一个加密的仓库
删除之前的registry仓库
[root@server1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c1df1879dbe7 registry "/entrypoint.sh /etc…" 13 hours ago Up 13 hours 0.0.0.0:5000->5000/tcp registry
[root@server1 ~]# docker rm -f registry
registry
[root@server1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
重新构建容器(私有仓库)
[root@server1 ~]# docker run -d \
> --restart=always \ 容器开机自启(不是docker) 私有仓库
> --name registry \ 指定名称
> -v "$(pwd)"/certs:/certs \ 指定证书目录
> -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \ 激活443端口 -e:编辑容器运行的参数
> -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/westos.org.crt \ 指定证书文件
> -e REGISTRY_HTTP_TLS_KEY=/certs/westos.org.key \ 指定keyq文件
> -p 443:443 \ 映射443端口
> registry 运行容器名称
4d5dad41179f8aefcf8ff46646cb8b680420441dba677c31fcff4dfe095f48db
[root@server1 ~]# docker ps查看容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4d5dad41179f registry "/entrypoint.sh /etc…" 14 seconds ago Up 12 seconds 0.0.0.0:443->443/tcp, 5000/tcp registry
[root@server1 ~]# netstat -tnpl 查看443端口
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 7531/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 7693/master
tcp6 0 0 :::22 :::* LISTEN 7531/sshd
tcp6 0 0 ::1:25 :::* LISTEN 7693/master
tcp6 0 0 :::443 :::* LISTEN 124832/docker-proxy
创建证书存放目录,并复制证书
[root@server1 ~]# mkdir -p /etc/docker/certs.d/westos
[root@server1 ~]# cd /etc/docker/certs.d/westos
[root@server1 westos]# cp /root/certs/westos.crt ca.crt
[root@server1 westos]# ls
ca.crt
把本地镜像上传到重新建立的私有仓库内
[root@server1 westos]# docker tag nginx:latest westos/nginx:latest 打标签
[root@server1 westos]# docker push westos/nginx 上传镜像
The push refers to repository [westos/nginx]
787328500ad5: Pushed
077ae58ac205: Pushed
8c7fd6263c1f: Pushed
d9c0b16c8d5b: Pushed
ffc9b21953f4: Pushed
latest: digest: sha256:d9002da0297bcd0909b394c26bd0fc9d8c466caf2b7396f58948cac5318d0d0b size: 1362
设置容器访问权限
如果想要控制registry的使用权限,使其只有在输入登录用户名和密码之后才能使用
需要做额外的设置,registry的用户名密码文件可以通过htpasswd来生成
[root@server1 ~]# mkdir auth 创建用户认证的目录
再追加一个用户
[root@server1 ~]# docker run --rm --entrypoint htpasswd registry -Bbn wsp redhat >> auth/htpasswd
[root@server1 ~]# cd auth/
[root@server1 auth]# cat htpasswd
admin:$2y$05$Ii574/qUJbDknIwUsQIcdebwdPetfNVmkw9JcvmEiaCDFvrCYIbp2
wsp:$2y$05$VkDCuYb3lc7gK./JK6KE8.qX0IJVG3NVynESIxhZ9Av6smSLBIIVm
[root@server1 auth]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4d5dad41179f registry "/entrypoint.sh /etc…" 25 minutes ago Up 25 minutes 0.0.0.0:443->443/tcp, 5000/tcp registry
a2487f02f185 registry "/entrypoint.sh /roo…" 36 minutes ago Exited (127) 36 minutes ago silly_jepsen
再次重新创建仓库,需要先删除之前的创建的那个
[root@server1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4d5dad41179f registry "/entrypoint.sh /etc…" 27 minutes ago Up 27 minutes 0.0.0.0:443->443/tcp, 5000/tcp registry
a2487f02f185 registry "/entrypoint.sh /roo…" 37 minutes ago Exited (127) 37 minutes ago silly_jepsen
[root@server1 ~]# docker rm -f silly_jepsen
silly_jepsen
[root@server1 ~]# docker rm -f registry
registry
[root@server1 ~]# docker ps -a 已经删除之前创建的
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@server1 ~]# docker run -d \
> --restart=always \
> --name registry \
> -v "$(pwd)"/certs:/certs \ 激活证书
> -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \ 激活443端口
> -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/westos.org.crt \ 指定证书
> -e REGISTRY_HTTP_TLS_KEY=/certs/westos.org.key \ 指定key
> -p 443:443 \ 端口映射
> -v "$(pwd)"/auth:/auth \ 激活认证信息
> -e "REGISTRY_AUTH=htpasswd" \ 指定认证文件
> -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \ htpasswd基础配置
> -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \ 指定认证文件路径
> registry 运行容器名称
34957d332dd6dfe5d2a4f8fe5b76f88f516786339e2a587e303058f404393bd4
[root@server1 ~]# docker ps 已经运行
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
34957d332dd6 registry "/entrypoint.sh /etc…" 3 minutes ago Up 3 minutes 0.0.0.0:443->443/tcp, 5000/tcp registry
上传本地镜像到私有仓库当中,先换标签
[root@server1 ~]# docker push westos/nginx
The push refers to repository [westos/nginx]
787328500ad5: Preparing
077ae58ac205: Preparing
8c7fd6263c1f: Preparing
d9c0b16c8d5b: Preparing
ffc9b21953f4: Preparing
no basic auth credentials 没有基础认证,上传失败
[root@server1 ~]# docker login westos登录加密仓库,并输入用户名和密码进行认证
Username: admin
Password: westos
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@server1 ~]# docker push westos/nginx 再次上传成功
The push refers to repository [westos/nginx]
787328500ad5: Pushed
077ae58ac205: Pushed
8c7fd6263c1f: Pushed
d9c0b16c8d5b: Pushed
ffc9b21953f4: Pushed
latest: digest: sha256:d9002da0297bcd0909b394c26bd0fc9d8c466caf2b7396f58948cac5318d0d0b size: 1362
[root@server1 ~]# docker logout westos 退出容器
Removing login credentials for westos.org
在文件config.json 中可以看到记录的认证(认证一次,永久保存)
[root@server1 ~]# cd .docker/
[root@server1 .docker]# ls
config.json
[root@server1 .docker]# cat config.json
{
"auths": {},
"HttpHeaders": {
"User-Agent": "Docker-Client/18.09.6 (linux)"
}
}
八、远程主机使用容器
创建一台虚拟机server2
在server2上配置
[root@server2 ~]# mkdir -p /etc/docker/certs.d/westos/
[root@server1 ~]# scp /etc/docker/certs.d/westos/ca.crt server2:/etc/docker/certs.d/westos/
[root@server2 ~]# ls /etc/docker/certs.d/westos/
ca.crt key.json
[root@server2 ~]# ls /etc/docker/certs.d/westos/
ca.crt key.json
[root@server2 ~]# systemctl restart docker
[root@server2 ~]# docker login westos 成功登陆
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
版权声明:本文标题:docker(容器)——创建镜像的私有仓库+设置加密认证+远程主机使用容器 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1727609345a1122737.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论