引言:本文主要介绍如何docker私有仓库,在公司中使用,避免商业项目暴露出去的风险。
背景
在docker中,当我们执行docker pull xxx的时候,可能会比较好奇,docker会去哪查找并下载镜像呢?它实际上是从 registry.hub.docker.com 这个地址去查找,这就是Docker公司为我们提供的公共仓库,上面的镜像,大家都可以看到,也可以使用。所以,我们也可以带上仓库地址去拉取镜像,如:docker pull registry.hub.docker.com/library/alpine, 不过要注意,这种方式下载的镜像的默认名称就会长一些。如果要在公司中使用Docker,我们基本不可能把商业项目上传到公共仓库中,那如果要多个机器共享,又能怎么办呢?
正因为这种需要,所以私有仓库也就有用武之地了。
所谓私有仓库,也就是在本地(局域网)搭建的一个类似公共仓库的东西,搭建好之后,我们可以将镜像提交到私有仓库中。这样我们既能使用 Docker 来运行我们的项目镜像,也避免了商业项目暴露出去的风险。
下面我们用官方提供的registry镜像来搭建私有镜像仓库,当然还有其它很多方法。
环境
准备两台安装好docker的服务器:
服务端机器 (主机名为registry):docker私有仓库服务器,运行registry容器;
测试端机器 (主机名为node):普通的docker服务器,在这台服务器上下载一个测试镜像busybox,然后上传到registry服务器进行测试;
假设服务器ip(内网ip)是10.18.133.2
部署(服务端操作)
下载镜像registry
1 | [root@registry ~]# sudo docker pull registry |
查看镜像是否pull下来了
运行registry容器
1 | [root@registry ~]# sudo docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always -e REGISTRY_STORAGE_DELETE_ENABLED=true --name registry registry:latest |
参数说明
-itd:在容器中打开一个伪终端进行交互操作,并在后台运行;
-v:把宿主机的/data/registry目录绑定 到 容器/var/lib/registry目录(这个目录是registry容器中存放镜像文件的目录),来实现数据的持久化;
-p:映射端口;访问宿主机的5000端口就访问到registry容器的服务了;
–restart=always:这是重启的策略,假如这个容器异常退出会自动重启容器;
–name registry:创建容器命名为registry,你可以随便命名;
registry:latest:这个是刚才pull下来的镜像;
-e REGISTRY_STORAGE_DELETE_ENABLED=true,允许删除仓库中的镜像;
测试镜像仓库中所有的镜像
[root@registry ~]# curl http://10.18.133.2:5000/v2/_catalog
{“repositories”:[]}
现在是空的,因为才刚运行,里面没有任何镜像内容。
测试镜像仓库(测试端操作)
修改镜像源并重启docker服务
1 | [root@node ~]# vim /etc/docker/daemon.json |
从官方仓库下载busybox镜像
1 | [root@node ~]# docker pull busybox |
为镜像打标签
1 | [root@node ~]# docker tag busybox:latest 10.18.133.2:5000/busybox:v1 |
busybox:lastest 这是源镜像,也是刚才pull下来的镜像文件;
10.18.133.2:500/busybox:v1:这是目标镜像,也是registry私有镜像服务器的IP地址和端口;
查看一下打好的tag:
上传到私有镜像仓库
1 | [root@node ~]# docker push 10.18.133.2:5000/busybox:v1 |
测试下载镜像
上传测试没问题了,我们接下来测试一下从registry服务器上下载刚才上传的busybox镜像,先删除node主机上的镜像:
1 | [root@node ~]# docker rmi f6e427c148a7 |
(注意如果此处报错image is being used by stopped container,说明该镜像被某个容器使用,先删掉这个容器,docker ps -a查看使用这个镜像的容器,然后docker rm -f 容器id)
然后,从registry服务器上下载busybox镜像:
1 | [root@node ~]# docker pull 10.18.133.2:5000/busybox:v1 |
列出所有镜像:
1 | [root@node ~]# curl http://10.18.133.2:5000/v2/_catalog |
列出busybox镜像有哪些tag:
1 | [root@node ~]# curl http://10.18.133.2:5000/v2/busybox/tags/list |
问题解答
1.当上传镜像时会出现上传失败Get https://10.10.8.185:5000/v2/: http: server gave HTTP response to HTTPS client
这是因为Docker与Docker Registry交互默认使用https,然而此处搭建的Docker Registry只提供http服务,所以当和Registry私有仓库交互时会失败,为了解决这个问题需要在启动Docker时配置Registry不安全选项。
1 | sudo vim /etc/docker/daemon.json |
然后sudo systemctl restart docker
重启docker服务即可。