配置私有仓库


用于

  1. 解决公有镜像仓库管理不便;

  2. 希望内部用户之间分享镜像,不希望暴露镜像出去的问题

环境:Docker私有仓库:192.168.3.37;客户端:192.168.3.59

安装Docker Registry

Docker Registry工具目前最新为2.0版本,此版本与一些类库,工具一起被打包为负责容器内容分发的工具集Docker Distribution,目前其核心功能组件仍为负责镜像仓库的管理

新版本的Registry基于Golang进行了重构,提供更好的性能和扩展性,并且支持Docker 1.6+API,非常适合用来构建私有的镜像注册服务器

用户可以通过容器运行和源码安装两种方式来使用Registry

基于容器安装运行

搜索镜像

1
docker search registry

11.png

拉取镜像

1
docker pull docker.io/registry

2.png

创建容器

1
2
3
docker run -d -p 5000:5000 --restart always --name registry docker.io/registry

--restart:指定容器的重启策略,不能与--rm选项同时使用
1
2
3
4
5
6
7
Docker容器的重启策略如下:

no:默认策略,在容器退出时不重启容器
on-failure:在容器非正常退出时(退出状态非0),才会重启容器
on-failure:3 :在容器非正常退出时重启容器,最多重启3次
always:在容器退出时总是重启容器
unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器

3.png

验证容器运行

访问

1
http://IP:5000/v2/

4.png

通过命令,指定本地主机的配置文件

Registry默认的配置文件为容器内/etc/docker/registry/config.yml

1
2
3
4
5
docker run -d -p 5000:5000 \
--restart always \
--name registry \
-v /home/user/registry-conf/config.yml:/etc/docker/registry/config.yml \
docker.io/registry

通过命令,指定本地主机的存储位置

Registry默认的存储位置为容器内/var/lib/registry/

如果容器被删除,则存放于容器中的镜像也会丢失,所以我们一般情况下会指定本地一个目录挂载到容器的/var/lib/registry/下, 这样本地主机与容器内都会存在镜像文件

1
2
3
4
5
docker run -d -p 5000:5000 \
--restart always \
--name registry \
-v /opt/data/registry:/var/lib/registry/ \
docker.io/registry

配置TLS证书

当本地主机运行Registry服务后,所有能访问到该主机的Dockr Host都可以将其当作私有仓库使用。只需要在镜像名称前添加具体的服务器地址

例:将本地的ubuntu:latest镜像上传到私有仓库myrep.com

1
2
docker tag ubuntu myrep.com:5000/ubuntu
docker push myrep.com:5000/ubuntu

从私有仓库myrep.com下载镜像到本地

1
2
docker pull myrep.com:5000/ubuntu
docker tag myrep.com:5000/ubuntu ubuntu

私有仓库需要启用TLS认证,否则会报错

Docker从1.3.X之后,与docker registry交互默认使用的是https,当搭建的私有仓库只提供http服务时,就会报错。

为了解决这个问题需要客户端启动docker server时增加启动参数为默认使用http访问。

需要客户端在docker的配置文件/etc/sysconfig/docker

ubuntu系统中的docker配置文件是/etc/default/docker

添加参数--insecure-registry=192.168.3.37:5000,表示信任私有仓库

1
2
3
4
5
6
7
vim /etc/sysconfig/docker

OPTIONS='--selinux-enabled --log-driver=journald'
改为
OPTIONS='--selinux-enabled --log-driver=journald --insecure-registry=192.168.3.37:5000'

systemctl restart docker

自行生成证书

使用openssl生成私人证书文件

一般情况下,证书只支持域名访问,要使其支持IP地址访问,需要修改配置文件openssl.cnf,添加subjectAltName

1
2
3
4
vim /etc/pki/tls/openssl.cnf

[ v3_ca ]
subjectAltName = IP:192.168.3.37 # 私有仓库IP

若为自定义域名访问的私有仓库,需要修改客户端hosts文件,将域名与IP关系进行对应

生成自签名证书

1
2
mkdir -p certs
openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/myrep.key -x509 -days 365 -out certs/myrep.crt

5.png

这里的服务器域名写成”192.168.3.37:5000”,后续就使用该地址访问私有仓库。其余项直接回车即可。

生成结果为在certs目录中生成证书文件myrep.crt与密钥文件myrep.key

创建带有TLS认证的Registry容器

1
2
3
4
5
6
7
8
9
10
docker run \
-d \
-p 192.168.3.37:5000:5000 \
--name myregistry \
--restart=always \
-v /opt/docker/registry/data:/var/lib/registry \
-v /certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/myrep.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/myrep.key \
docker.io/registry

配置客户端本地主机

registry所在主机上,刚生成的证书:/root/certs/myrep.crt复制到客户端本地主机上的:/etc/docker/certs.d/192.168.3.37:5000/ca.crt

更新CA证书

1
update-ca-trust

7.png

即可对私有仓库进行上传或下载镜像


配置用户认证

生成仓库登陆用户密码

1
mkdir auth

docker仓库添加用户的登录用户名和密码

1
docker run --entrypoint htpasswd docker.io/registry -Bbn admin admin >> ~/auth/htpasswd

这里设置私有仓库登陆名与密码都为admin

重启docker服务

1
systemctl restart docker

创建Registry容器(带用户认证与TLS认证)

1
2
3
4
5
6
7
8
9
docker run -d -p 5000:5000 --restart=always --name registry \
-v /auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
-v /certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/myrep.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/myrep.key \
docker.io/registry

则客户端需对私有仓库进行docker login登陆后才可进行上传下载操作

---------------The End---------------
0%