基于Docker搭建私有镜像仓库

参考资料:
https://www.cnblogs.com/niceyoo/p/13058238.html

通常我们在docker中拉取的镜像都是在docker hub在线存储库中获取的,这个在线存储库里的docker镜像可以由任何用户发布和使用,显然这在某些场景下是不适用的,比如某些互金的隐私项目,或者是公司完全处于内网状态不能访问外网,再或者你想个性化定制某些配置等等等,所以这就需要用到私有存储库了,今天我们就基于registry镜像搭建属于我们自己的私有仓库。

1、安装指令

docker pull registry
默认拉取最新版:

2、配置私有仓库地址

vim /etc/docker/daemon.json
输入如下参数,注意修改为自己的ip地址:

"insecure-registries": ["10.211.55.4:5000"]
注:
5000是容器内的端口

:wq 保存退出,然后我们重启启动一下 docker

systemctl restart docker

3、创建容器(必须创建)

docker run -d -p 5000:5000 --name registry docker.io/registry
前面5000是对外的端口,后面5000是容器内的端口
部分参数说明:

-d:让容器在后台运行
-p:指定容器内部使用的网络端口映射到我们使用的主机上
--name:指定容器创建的名称

4、重新加载配置

sudo systemctl daemon-reload
然后浏览器访问:http://10.211.55.4:5000/v2/_catalog

如果访问不到,尝试关闭防火墙:

systemctl stop firewalld
如果还是访问不不到,可以重启一下docker

sudo systemctl restart docker
然后重新运行一下容器。

或者查看下对外的端口是否有开放

5、验证上传镜像到私有仓库

我们使用HelloWorld镜像进行测试,首先先拉取一下:
如果本身有镜像就无需拉取
docker pull hello-world

拉取之后我们看一下镜像名称及版本:

至此我们就有了一个 hello-world镜像,接下来我们使用 push 指令将镜像推送到刚刚搭建的registry中:

标记hello-world该镜像需要推送到私有仓库
docker tag hello-world:latest 127.0.0.1:5000/hello-world:latest

通过push指令推送到私有仓库
docker push 127.0.0.1:5000/hello-world:latest

注会存在下面问题:
报错:Get https://18.167.119.109:8087/v2/: http: server gave HTTP response to HTTPS client

原因:
出现这问题的原因是:Docker自从1.3.X之后docker registry交互默认使用的是HTTPS,但是搭建私有镜像默认使用的是HTTP服务,所以与私有镜像交时出现以上错误。

这个报错是在本地上传私有镜像的时候遇到的报错:
解决办法是:在docker server启动的时候,增加启动参数,默认使用HTTP访问:
vim /usr/lib/systemd/system/docker.service
在12行后面增加 --insecure-registry ip:5000

修改好后重启docker 服务

systemctl daemon-reload

systemctl restart docker

注:如果重启不了,再修改回来原来配置
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

重启docker服务后,将容器重启

docker start $(docker ps -aq)

再来访问:http://10.211.55.4:5000/v2/_catalog

我们可以看到私有仓库目录已经有刚刚推送上去的 hello-world 镜像了。

6、验证从私有仓库下载镜像
验证完了上传,我们再来测试一下下载镜像:

格式如下:

docker pull 127.0.0.1:5000/镜像名称:镜像版本号

以hello-world为例:

docker pull 127.0.0.1:5000/hello-world

到这可能有的小伙伴就有疑惑了,你这通过ip能拉取吗,我看你一直用的127.0.0.1,毕竟私有仓库搭建完是要给别人用的嘛~

那么我们就测试一下:

docker pull 10.211.55.4:5000/hello-world:latest

如上图所示,通过ip也是可以拉取成功的,但是在这再额外补充一下,有的小伙伴可能提示如下:

Trying to pull repository 10.211.55.4:5000/hello-world ...
Get https://10.211.55.4:5000/v1/_ping: http: server gave HTTP response to HTTPS client
这种显然是拉取失败了,提示大致就是,尝试从https上拉取,但是返回的是http响应,如何解决呢?

我们可以通过如下进行处理一下,xxx修改为自己的ip地址:

echo '{ "insecure-registries":["xxx.xxx.xxx.xxx:5000"] }' > /etc/docker/daemon.json
其实如果你是按上我上边这些步骤下来是不会有问题的,在步骤2中配置私有仓库地址时,其实我们已经配置了insecure-registries,但是配置后我们需要重启启动一下docker才可以生效,毕竟是配置了系统文件嘛~

ok,至此整个搭建过程完毕~

posted @ 2021-10-14 12:04  ami_miao  阅读(275)  评论(0)    收藏  举报