搭建一个私有镜像仓库

一般来说,我们很少将私有的项目上传到公共仓库中去,比如公司的项目、个人的盈利项目等,基本上都是搭建自己的私有仓库,一方面是为了确保机密性,另一方面,也便于管理和供开发人员获取。

搭建一个本地私有镜像仓库

1. 拉取 Docker Registry
Docker Registry 是 Docker 的镜像仓库项目,通过它来部署私有的镜像仓库,用于镜像的存储与分发。
它同样也是一个镜像,直接使用「docker pull」拉取下来:

# docker pull registry

如果要指定某个版本,加上tag,上面默认拉取最新版本。
拉取成功,镜像信息如下:

[root@localhost ~]# docker image list   
REPOSITORY                TAG          IMAGE ID        CREATED          SIZE
docker.io/registry       latest       f32a97de94e1     2 weeks ago      25.8 MB

2. 运行仓库镜像
使用「docker run」来运行这个仓库容器:

[root@localhost ~]# docker run -itd -v /var/registry:/data/registry -p 5000:5000 --restart=always --name bluerepo f32a9
969b57b7312612197a1732b3f051af164c01e25160f61f3f8448e...

运行成功,且容器ID = 969b5
【options】:

  • -it:为容器分配一个伪终端
  • -d:后台模式运行容器
  • - v:将宿主机的目录绑定并映射到仓库容器的目录,用于存放上传到该仓库的镜像文件,例如上面,是将宿主机的/var/registry目录绑定到容器的/data/registry目录
  • - p:映射端口,在宿主机上的应用容器,有自己的私有IP,如果想要访问这个应用容器中的某个应用,对外部来说比较难,但docker提供的这个 -p 参数可以将宿主机上的端口映射到应用容器的端口,例如上面,是将宿主机的5000端口映射到容器的5000端口,访问宿主机的5000端口即可访问这个仓库的服务。
  • --restart=always:若容器异常退出会自动重启容器
  • --name:给容器命名

另外,可以使用「docker ps」查看:

[root@localhost ~]# docker ps
CONTAINER ID    IMAGE      COMMAND                  CREATED           STATUS           PORTS           
969b57b73126    f32a9     "/entrypoint.sh /e..."   40 minutes ago     Up 40 minutes    0.0.0.0:5000->5000/tcp  

最后一列「ports」,表明宿主机的 5000 端口被映射到了容器的 5000 端口。
此时,执行curl http://127.0.0.1:5000/v2/_catalog 获得如下响应:

{"repositories":[]}

响应结果是一个空的 json 数组,表示目前仓库里还没有任何镜像。

OK,私有仓库已经创建和启动完毕了,接下来试试怎样使用?

3. 上传镜像到私有仓库

现在,想将另一台服务器(192.168.1.7)中的nginx镜像上传到该仓库中(宿主机IP:192.168.1.8)

①查看下本地宿主机上的nginx镜像信息:

[root@localhost ~]# docker image list
REPOSITORY          TAG          IMAGE ID           CREATED          SIZE
docker.io/nginx     latest        881bd08c0b08      3 weeks ago        109 MB

需要给这个镜像添加一个带有私有仓库IP的TAG,这样后面才能成功推送到私有仓库:

# docker tag 881bd 192.168.1.8:5000/nginx:v2.9

执行完成后会出现一个新的镜像:

[root@localhost ~]# docker image list
REPOSITORY               TAG           IMAGE ID            CREATED           SIZE
192.168.1.8:5000/nginx   v2.9          881bd08c0b08        3 weeks ago       109 MB
docker.io/nginx          latest        881bd08c0b08        3 weeks ago       109 MB

REPOSITORY = 192.168.1.8:5000/nginx。
②将镜像推送到私有仓库中

[root@localhost ~]# docker push 192.168.1.8:5000/nginx:v2.9
The push refers to a repository [192.168.1.8:5000/nginx]
Get https://192.168.1.8:5000/v1/_ping: http: server gave HTTP response to HTTPS client

显示上传失败,原因是 推送镜像到仓库用的是https ,但现在是http, 修改下该服务器的daemon配置即可(虽然官方不推荐这种方式,但简单,对于内部网络而言已经基本满足要求,免去了制作和部署证书这些繁琐的步骤,有兴趣的话可以google下),修改 /etc/docker/daemon.json:
修改前:

{
"registry-mirrors":["http://f138hde2.m.daocloud.io"]
}

修改后:

{
"registry-mirrors":["http://f138hde2.m.daocloud.io"],
"insecure-registries": [ "192.168.1.8:5000"]
}

执行# systemctl restart docker 使配置生效。
再次上传镜像到私有仓库:

[root@localhost ~]# docker push 192.168.1.8:5000/nginx:v2.9
The push refers to a repository [192.168.1.8:5000/nginx]
3e9eb35b1c23: Pushed 
c59b3ca455e3: Pushed 
6744ca1b1190: Pushing [=======>                                           ] 8.126 MB/55.28 MB

OK,显示正在上传中。

③查看下私有仓库中的镜像信息

[root@localhost ~]# curl 192.168.1.8:5000/v2/_catalog
{"repositories":["nginx"]}

一个 nginx 镜像已经存在仓库中了。

4. 从私有仓库下载镜像到本地

[root@localhost ~]# docker pull 192.168.1.8:5000/nginx:v2.9
Trying to pull repository 192.168.1.8:5000/nginx ... 
v2.9: Pulling from 192.168.1.8:5000/nginx
f7e2b70d04ae: Pull complete 
08dd01e3f3ac: Pull complete 
d9ef3a1eb792: Pull complete 
Digest: sha256:7734a210432278817f8097acf2f72d20e2ccc7402a0509810c44b3a8bfe0094a
Status: Downloaded newer image for 192.168.1.8:5000/nginx:v2.9

执行成功。

✿ 获取更多,请戳这儿

Comments
Write a Comment