通常情况下我们可以使用Docker Hub作为docker image的仓库,但是有些场景下,我们希望能够有本地的仓库。比如:
代码中含有保密的信息,比如环境的账号,密码等等;
代码本身作为公司的资产,不能对外公开,否则有法律风险。
在创建本地仓库之前,请确保已经在目的机器上安装了Docker。这里我们使用docker容器运行registry镜像的方式,来创建registry。
一般情况下安装的docker已经自带了registry镜像,如果没有可以从docker hub上获取。
环境准备
关闭防火墙
systemctl stop firewalld.service |
关闭selinux
sed -i 's/SELINUX=.*/SELINUX=disabled/' /etc/sysconfig/selinux |
搭建私有仓库
下载registry镜像
首先,在192.168.0.200机器上下载registry镜像
docker pull registry |
基于私有仓库镜像运行容器
下载完之后我们通过该镜像启动一个容器
docker run -d -p 5000:5000 localregistry registry |
其中 localregistry表示此容器的名称,registry表示了镜像本身。可以运行docker ps
查看结果:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
默认情况下,会将仓库存放于容器的/tmp/registry目录下,这样如果容器被删除,则存放于容器中的镜像也会丢失,所以我们一般情况下会指定本地一个目录挂载到容器的/tmp/registry下,如下:
docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry --name localregistry registry |
自动启动仓库
如果想让registry作为永久的可用仓库,应该在Docker machine重启或退出之后,设置registry仍然能够自动重启或保持使用状态。可以使用–restart=always达到此目的。
docker run -d -p 5000:5000 --restart=always -v /opt/data/registry:/tmp/registry --name localregistry registry |
访问私有仓库
网上都用这个curl http://127.0.0.1:5000/v1/search
,但是报404 page not found
,后查证是v1版本的api查看方式,我们现在的版本是v2,所以用如下方法查看:
curl -X GET http://127.0.0.1:5000/v2/_catalog |
从Docker Hub获取nginx镜像
docker pull nginx:alpine |
接下来我们尝试将上面的 nginx:alpine
上传到本地的 registry 服务器, 首先为这个镜像定义一个新的标签:
docker tag nginx:alpine 127.0.0.1:5000/nginx:alpine |
然后通过docker images
查看,确认是否存在这个标签,输出如下:
REPOSITORY TAG IMAGE ID CREATED SIZE |
现在可以上传这个镜像:
docker push 127.0.0.1:5000/nginx:alpine |
输出如下 :
The push refers to a repository [127.0.0.1:5000/nginx] |
现在来浏览 http://127.0.0.1:5000/v2/_catalog
, 将会看到这样的结果:
{"repositories":["nginx"]} |
表示已经有了 nginx
这个镜像, 如果要看这个镜像有什么版本, 需要输入地址 http://127.0.0.1:5000/v2/nginx/tags/list
, 结果如下:
{"name":"nginx","tags":["alpine"]} |
如果要在其它装了 docker 的电脑上获取这个镜像, 或者下载局域网其它 registry 服务器上的镜像, 有两个选择: