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

原文:https://mp.weixin.qq.com/s?src=11×tamp=1566889443&ver=1815&signature=O3hrNYkRo7tofNykIu-BdL7QyaSYp4VLpxpF1KW3PGw4GbMl5PFe4r7fhgHhnxW0x4oLOVowqrVj7cFsMaD9-kuURoKzKwkJsuRcLESycLn4*0uMqYbJQe*UOOFt-VW7&new=1

 

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

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

执行成功。

你可能感兴趣的:(运维)