Docker搭建本地私有仓库--无验证
首先新建一个目录,用来挂载本地仓库的目录,存储镜像,否则在容器删除后,镜像也会被删除mkdir /usr/soft/registry拉取registry镜像,这里使用的是registry:2docker pull registry:2然后运行:docker run -d -p 5000:5000 --restart always --name registry -v /usr/sof...
搭建本地私有仓库
1. 拉取镜像、创建挂载目录
首先新建一个目录,用来挂载本地仓库的目录,存储镜像,否则在容器删除后,镜像也会被删除
mkdir /usr/soft/registry
拉取registry镜像,这里使用的是registry:2
docker pull registry:2
2. 创建 registry 容器,HTTP访问、无验证
这里是之前的运行方式,以http的方式启动的,并且没有验证,等于仓库是公开的,谁都可以访问,和推送镜像:
docker run -d -p 5000:5000 --restart always --name registry -v /usr/soft/registry:/var/lib/registry registry:2
启动之后可以在浏览器中访问IP:5000/v2,可以看到返回一个空的json。
可以看到正常启动了:
推送本地镜像到仓库之前,还需要给docker注册https协议,支持https访问,不然是没法推送的,
这里我们添加本机的ip进去:
vim /etc/docker/daemon.json
如果安装了最小化系统,则可能没有vim命令:
搜索vim安装包:rpm -qa|grep vim
,显示只有下面一个
vim-minimal-7.4.629-7.el7.x86_64
正常应该是四个,那么安装就好了,使用命令:
yum -y install vim-enhanced
会安装一大堆的东西,等待屏幕滚动,安装完成。
如果daemon文件不存在,vim会自己创建一个,添加如下代码
{
"insecure-registries":["主机的IP地址或者域名:5000"]
}
---------------------------2021.02.26 更新--------------------------
原来的内容如下,在下一步重启docker时,提示异常:Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.
{
"insecure-registries":["主机的IP地址或者域名:5000"],
"registry-mirrors": ["https://registry.docker-cn.com"]
}
其中:
insecure-registries----->开放注册https协议
registry-mirrors----->仓库源
之前还以为镜像源被墙了才会导致,启动下一步重启docker失败呢,结果这次换了一台服务器,去拉取3.3仓库里面的镜像,还是报这个错。
然后试着改下,加上阿里云镜像和镜像docker仓库,就可以重启了:
{
"registry-mirrors": [
"https://pak31uuv.mirror.aliyuncs.com",
"https://registry.docker-cn.com"
],
"insecure-registries": [
"192.168。104.51"
]
}
然后重启docker,使上面的配置生效:
systemctl restart docker
如果启动什么也没提示,则证明没有报错,然后使用docker info
可以看到,已经成功添加了私有仓库。
然后就可以正常从私有仓库中拉取镜像了。
docker pull 192.168.4.51:5000/test/gc-manage-test:版本号
上面命令就是拉取镜像的命令,如果后面不加版本号,则默认拉取latest 版本的镜像,如果没有找到该版本的镜像,会有错误提示:
Error response from daemon: manifest for 192.168.4.51:5000/test/gc-manage-test:latest not found: manifest unknown: manifest unknown
然后我们直接拿本地的nginx镜像封装成我们自己的镜像名称,然后push到本地仓库中
docker tag hub.c.163.com/library/nginx 192.168.3.3:5000/nginx
其中hub.c.163.com/library/nginx
为我本地的镜像,后面是新的镜像名称,我这里采用ip+端口+镜像名的方式命名的
然后可以查看本地镜像中多了一个192.168.3.3:5000/nginx
镜像,然后直接push+镜像名
进行推送到本地仓库。
使用命令dockers inspect container_name| grep -A 20
可以查看容器挂载的目录,这里我想查看registry的挂载目录,使用命令:dockers inspect registry | grep -A 20
,如果返回空白可以使用容器的ID代替上面命令中的container_name
可以看到,容器挂载的目录是/usr/soft/regisrty
,镜像实际所在的目录却是目录下的
docker/registry/v2/repositories
可以在目录/usr/soft/registry/docker/registry/v2/repositories
中查看我们本地仓库中的镜像:
或者直接使用命令进行查看本地仓库中的镜像列表:
查看仓库镜像:curl -XGET 192.168.3.3:5000/v2/_catalog
查看镜像版本列表:curl -XGET 192.168.3.3:5000/v2/nginx/tags/list
下面测试将仓库中的镜像pull到本地:
首先删除本地的nginx镜像,删除自己打的tag的镜像需要使用docker rmi
指令:
然后直接
docker pull+本地仓库的镜像名称
这里贴一个我自己打包的jdk8的镜像:docker pull onlyonelmm/jdk8:latest
作为备用,免得还要重新设置docker hub的账号和密码。
记录一下我的docker hub的账号是onlyonelmm
拉下来后做一层封装,然后上传至测试仓库:
封装
docker tag onlyonelmm/jdk8:latest 192.168.40.37:5000/centos/jdk8
上传
docker push 192.168.40.37:5000/centos/jdk8
3. 上传镜像异常:http: server gave HTTP response to HTTPS client
编辑配置文件/etc/docker/daemon.json,增加内容“私有仓库IP:端口号”,保存配置文件,重启docker服务。
vi /etc/docker/daemon.json
{
"insecure-registries": ["192.168.40.37:5000"]
}
再次上传:
docker push 192.168.40.37:5000/centos/jdk8
这里是没有验证的仓库,别的服务器如果需要从该仓库中拉取镜像,需要将仓库ip配置进自己的daemon文件内,也就是跟上面的上传镜像的异常处理方法一样,然后重启本机的docker。
systemctl daemon-reload
systemctl restart docker
如果出现Job.....
异常了,注意配置的IP和端口是否正常,IP为自己的仓库IP,端口为映射的宿主机端口。
如果还不行,再将daemon文件内容恢复。
4. 配置 HTTPS 访问
虽然可以修改daemon.json 文件,解决上面推送镜像的问题,但是如果涉及到构建跨平台的镜像时,貌似是必须要用 HTTPS 的仓库才行。由于在公司内部服务器上使用,这里直接整个假的证书就好了。
4.1 使用OpenSSL创建证书文件
需要确认是否安装了:OpenSSL
,查看是否安装:openssl version
,Centos 7 默认是已经安装了的,如果使用的最小化系统,则需要手动安装下。
找一个存放证书的路径,这里由于上面已经安装过register了,也可能镜像仓库里面已经有了镜像了,我们不能配个HTTPS却将原来的镜像丢掉了。
由于我这里上面挂载的目录是/usr/soft/registry
,所以直接在这个目录下新建一个文件夹certs
用来存放证书文件。
执行命令创建.crt
和.key
证书文件:
openssl req -newkey rsa:4096 -nodes -sha256 -keyout /usr/soft/registry/certs/registry.key -x509 -days 365 -out /usr/soft/registry/certs/registry.crt
会提示你输入一些基础信息,这里貌似除了Country Name
输入个CN
,和 Common Name
输入当前机器的IP外,其他带default的可以直接回车。
然后,可以看到生成了两个证书文件:registry.crt
, registry.key
4.2 重新创建registry 容器
然后将原来的容器停掉,重新创建一个容器,挂载目录不变,新增参数,支持HTTPS。
docker run -d \
-p 5000:5000 \
--restart always \
--privileged=true \
--name registry1 \
-v /usr/soft/registry:/var/lib/registry \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/var/lib/registry/certs/registry.crt \
-e REGISTRY_HTTP_TLS_KEY=/var/lib/registry/certs/registry.key \
registry:2
这里将容器名称后面加了一个1,便于给原来的容器区分一下,可以看到正常启动了。
这时候,再次访问仓库的镜像列表,则需要使用https了:https://192.168.104.51:5000/v2/_catalog
设置HTTPS 方式和密码访问,参考:https://www.freesion.com/article/69071451119/
更多推荐
所有评论(0)