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.crtregistry.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/

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐