企业级容器技术docker(6)

拜拜、爱过 提交于 2020-02-08 19:13:31

私有仓库的搭建

为什么要搭建私有仓库?

  1. docker hub太慢
  2. 放到网上去,有些docker是定制的,上传后不安全。

如何搭建私有仓库?
下载一个registry镜像,或者直接在网上拉取一个registry镜像,运行容器。

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
registry            latest              708bc6af7e5e        2 weeks ago         25.8MB

直接进行拉取。
查看一下构建历史

IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
708bc6af7e5e        2 weeks ago         /bin/sh -c #(nop)  CMD ["/etc/docker/registr…   0B                  
<missing>           2 weeks ago         /bin/sh -c #(nop)  ENTRYPOINT ["/entrypoint.…   0B                  
<missing>           2 weeks ago         /bin/sh -c #(nop) COPY file:507caa54f88c1f38…   155B                
<missing>           2 weeks ago         /bin/sh -c #(nop)  EXPOSE 5000                  0B                  
<missing>           2 weeks ago         /bin/sh -c #(nop)  VOLUME [/var/lib/registry]   0B                  
<missing>           2 weeks ago         /bin/sh -c #(nop) COPY file:4544cc1555469403…   295B                
<missing>           2 weeks ago         /bin/sh -c #(nop) COPY file:21256ff7df5369f7…   20.1MB              
<missing>           2 weeks ago         /bin/sh -c set -ex     && apk add --no-cache…   1.28MB              
<missing>           2 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B                  
<missing>           2 weeks ago         /bin/sh -c #(nop) ADD file:e38375b009a2e2c9b…   4.41MB          

发现这个容器主动暴露5000端口,并且设置了一个挂载点。所以在运行容器的时候也要注意一些参数。

docker run -d --name registry -p 5000:5000 -v /mnt/registry:/var/lib/registry registry

如何上传至本地仓库?
先将标签进行修改,加入端口号,

docker tag nginx:latest localhost:5000/nginx:latest
docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
nginx                  latest              2073e0bcb60e        6 days ago          127MB
localhost:5000/nginx   latest              2073e0bcb60e        6 days ago          127MB

这样就指定完成了。如果不指定,将默认上传到网络仓库。

docker push localhost:5000/nginx

上传完成后查看5000端口

curl localhost:5000/v2/_catalog
{"repositories":["nginx"]}

已经上传成功。

docker仓库加密

一般本机上传和拉取是不需要加密的,但是如果远程登陆拉取的话,不加密是很危险的,比如再准备一台虚拟机,尝试

[root@server2 ~]# curl 192.168.122.2:5000/v2/_catalog
{"repositories":["nginx"]}

可以看到还是可以进行拉取数据的,那么如何进行加密呢?
按照docker官方文档进行操作。
先创建一个仓库目录。

mkdir certs

接着生成证书

openssl req \
> -newkey rsa:4096 -nodes -sha256 -keyout certs/passyt.com.key\
> -x509 -days 365 -out certs/passyt.com.crt


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]:haha
Organizational Unit Name (eg, section) []:yyy
Common Name (eg, your name or your server's hostname) []:passyt.com
Email Address []:root@passyt.com

这个时候虽然生成了加密,但是docker仓库并没有进行读取,要如何操作?
进行重载,将原来的仓库容器删除后重新生成一个容器。

docker run -d \
> --restart=always \ ##在docker开启的时候容器也自动开启
> --name registry \
> -v "$(pwd)"/certs:/certs \
> -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
> -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/passyt.com.crt \
> -e REGISTRY_HTTP_TLS_KEY=/certs/passyt.com.key \
> -p 443:443 registry

容器打开后开启443加密端口。之后拷贝证书到下面地址。

[root@server1 docker]# mkdir certs.d
[root@server1 docker]# cd certs.d/
[root@server1 certs.d]# mkdir passyt.com
[root@server1 certs.d]# cd passyt.com/
[root@server1 passyt.com]# ls
[root@server1 passyt.com]# cp /etc/docker/certs/passyt.com.crt ca.crt ##将证书名字改为 ca.crt

设置完成之后就可以和推送到本地仓库的方法进行推送。

远程用户进行拉取

用同样的方法创建一些目录。

[root@server2 ~]# cd /etc/docker/
[root@server2 docker]# mkdir certs.d
[root@server2 docker]# cd certs.d/
[root@server2 certs.d]# mkdir passyt.com
[root@server2 certs.d]# cd passyt.com/
[root@server2 passyt.com]# 
[root@server2 passyt.com]# scp server1:/etc/docker/certs.d/passyt.com/ca.crt .
root@server1's password: 
ca.crt                                                  100% 2098     2.1KB/s   00:00    
[root@server2 passyt.com]# 
[root@server2 passyt.com]# ls
ca.crt

将钥匙发送过去即可,完成之后就可以让server2的用户尝试拉取镜像。
拉取的时候需要添加域名。所以解析还是需要添加的。
docker pull passyt.com/nginx:latest

给docker用户添加认证功能

在服务端设置用户密码并查看

[root@server1 ~]# cd /etc/docker/
[root@server1 docker]# mkdir auth
[root@server1 docker]# ls
[root@server1 docker]# docker run --entrypoint htpasswd registry:2.3.1 -Bbn admin passyt> auth/htpasswd

再次创建仓库
先删除之前的,在原有的基础上额外加一些参数

docker run -d \
> --restart=always \
> --name registry \
> -v "$(pwd)"/certs:/certs \
> -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
> -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/passyt.com.crt \
> -e REGISTRY_HTTP_TLS_KEY=/certs/passyt.com.key \
> -p 443:443 \
> -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 registry

添加完成之后,在server2上尝试进行拉取或者上传,发现不行,系统提示应先登陆,

docker login passyt.com

输入用户名和密码即可进行下一步操作。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!