在 Docker 中,当我们执行 docker pull xxx 的时候,可能会比较好奇,Docker 会去哪儿查找并下载镜像呢?

它实际上是从 registry.hub.docker.com 这个地址去查找,这就是Docker公司为我们提供的公共仓库,上面的镜像,大家都可以看到,也可以使用。所以,我们也可以带上仓库地址去拉取镜像,如:docker pull registry.hub.docker.com/library/alpine,不过要注意,这种方式下载的镜像的默认名称就会长一些。

如果要在公司中使用 Docker,我们基本不可能把商业项目上传到公共仓库中,那如果要多个机器共享,又能怎么办呢?

正因为这种需要,所以私有仓库也就有用武之地了。

所谓私有仓库,也就是在本地(局域网)搭建的一个类似公共仓库的东西,搭建好之后,我们可以将镜像提交到私有仓库中。这样我们既能使用 Docker 来运行我们的项目镜像,也避免了商业项目暴露出去的风险。

下面我们用官方提供的registry镜像来搭建私有镜像仓库,当然还有其它很多方法。

1.下载镜像registry

 

docker pull registry

 2.查看镜像是否pull下来了

 

 

docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/registry latest b2b03e9146e1 2 weeks ago 33.29 MB

 3.运行registry容器

 

 

docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest

 参数说明

 

-itd:在容器中打开一个伪终端进行交互操作,并在后台运行;
-v:把宿主机的/data/registry目录绑定 到 容器/var/lib/registry目录(这个目录是registry容器中存放镜像文件的目录),来实现数据的持久化;
-p:映射端口;访问宿主机的5000端口就访问到registry容器的服务了;
--restart=always:这是重启的策略,假如这个容器异常退出会自动重启容器;
--name registry:创建容器命名为registry,你可以随便命名;
registry:latest:这个是刚才pull下来的镜像;

4.测试镜像仓库中所有的镜像

 

curl http://127.0.0.1:5000/v2/_catalog

 {"repositories":[]}

 

现在是空的,因为才刚运行,里面没有任何镜像内容

 

我们下载一个nginx的镜像

 

docker pull nginx

 

 

查看现在的镜像

 

docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/nginx latest 8b89e48b5f15 4 days ago 109 MB
docker.io/registry latest b2b03e9146e1 2 weeks ago 33.29 MB

 为镜像打标签

 

 

docker tag docker.io/nginx:latest 127.0.0.1:5000/docker.io/nginx:v1

 查看一下打好的tag:

 

 

docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
127.0.0.1:5000/docker.io/nginx v1 8b89e48b5f15 4 days ago 109 MB
docker.io/nginx latest 8b89e48b5f15 4 days ago 109 MB
docker.io/registry latest b2b03e9146e1 2 weeks ago 33.29 MB

 看一看到v1就是我们刚刚打的标签

 

现在我们把v1这个镜像上传到我们创建的私有仓库里面里面

 

 

docker push 127.0.0.1:5000/docker.io/nginx:v1

 查看仓库里面是否已经有了我们刚刚push的镜像

curl  http://127.0.0.1:5000/v2/_catalog
{"repositories":["docker.io/nginx"]}

 至此镜像已经上传到私有仓库了

我们可以测试一下,从私有仓库里面拉取刚刚push上去的nginx镜像

docker pull 127.0.0.1:5000/docker.io/nginx:v1

 

发现镜像成功的被拉下来