docker(容器)——创建镜像的私有仓库+设置加密认证+远程主机使用容器

一、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.com官方网站点击控制台输入密码登录,进入后按照下图操作
在这里插入图片描述

mkdir -p /etc/docker
/etc/docker/daemon.json
{
  "registry-mirrors": ["https://ck7lkd69.mirror.aliyuncs.com"]
}

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.com"]
}
[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.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) []: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.org
[root@server1 ~]# cd /etc/docker/certs.d/westos.org
[root@server1 westos.org]# cp /root/certs/westos.org.crt ca.crt
[root@server1 westos.org]# ls
ca.crt

把本地镜像上传到重新建立的私有仓库内

[root@server1 westos.org]# docker tag nginx:latest  westos.org/nginx:latest  打标签
[root@server1 westos.org]# docker push westos.org/nginx  上传镜像
The push refers to repository [westos.org/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.org/nginx
The push refers to repository [westos.org/nginx]
787328500ad5: Preparing 
077ae58ac205: Preparing 
8c7fd6263c1f: Preparing 
d9c0b16c8d5b: Preparing 
ffc9b21953f4: Preparing 
no basic auth credentials  没有基础认证,上传失败
[root@server1 ~]# docker login westos.org登录加密仓库,并输入用户名和密码进行认证
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.org/nginx  再次上传成功
The push refers to repository [westos.org/nginx]
787328500ad5: Pushed 
077ae58ac205: Pushed 
8c7fd6263c1f: Pushed 
d9c0b16c8d5b: Pushed 
ffc9b21953f4: Pushed 
latest: digest: sha256:d9002da0297bcd0909b394c26bd0fc9d8c466caf2b7396f58948cac5318d0d0b size: 1362
[root@server1 ~]# docker logout westos.org  退出容器
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.org/
[root@server1 ~]# scp /etc/docker/certs.d/westos.org/ca.crt server2:/etc/docker/certs.d/westos.org/
[root@server2 ~]# ls /etc/docker/certs.d/westos.org/
ca.crt  key.json
[root@server2 ~]# ls /etc/docker/certs.d/westos.org/
ca.crt  key.json
[root@server2 ~]# systemctl restart docker
[root@server2 ~]# docker login westos.org  成功登陆
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

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker镜像管理和私有仓库建构是Docker的重要组成部分。镜像管理是指如何管理和维护Docker镜像,包括创建、删除、更新和查看镜像等操作。私有仓库建构是指如何建立自己的Docker仓库,用于存放和分享自己的Docker镜像。 以下是关于Docker容器镜像管理和私有仓库建构的一些基本知识点: 1. 镜像管理 Docker镜像是一个可执行的软件包,包含了运行某个应用程序所需的所有文件和依赖项。Docker镜像可以基于已有的镜像创建,也可以从Dockerfile构建。 基于已有的镜像创建新的镜像: ``` docker commit [CONTAINER_ID] [NEW_IMAGE_NAME] ``` 从Dockerfile构建新的镜像: ``` docker build -t [IMAGE_NAME] [DOCKERFILE_PATH] ``` 查看本地所有镜像: ``` docker images ``` 删除本地指定的镜像: ``` docker rmi [IMAGE_NAME] ``` 2. 私有仓库建构 Docker Hub是一个公共的Docker仓库,但是有时候我们需要建立自己的私有仓库,用于存放和分享自己的Docker镜像Docker官方提供了Docker Registry来搭建私有仓库,也可以使用第三方工具如Nexus、GitLab等来搭建私有仓库使用Docker Registry搭建私有仓库: ``` docker run -d -p 5000:5000 --name registry registry:2 ``` 在Dockerfile中指定私有仓库地址: ``` FROM [PRIVATE_REGISTRY]:[PORT]/[IMAGE_NAME]:[TAG] ``` 将本地镜像推送到私有仓库: ``` docker tag [LOCAL_IMAGE_NAME] [PRIVATE_REGISTRY]:[PORT]/[IMAGE_NAME]:[TAG] docker push [PRIVATE_REGISTRY]:[PORT]/[IMAGE_NAME]:[TAG] ``` 从私有仓库拉取镜像: ``` docker pull [PRIVATE_REGISTRY]:[PORT]/[IMAGE_NAME]:[TAG] ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值