Linux搭建Docker Registry私有镜像仓库

小柒博客 Docker评论74.2K字数 5853阅读19分30秒阅读模式

一、Docker简介

Docker是Docker.Lnc公司开源的一个基于LXC技术之上搭建的Container容器引擎,源代码托管在Github上,基于Go语言并遵从Apache2.0协议开源。

Docker属于Linux容器的一种封装,提供简单易用的容器使用接口。

Docker将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了Docker,就不用担心环境问题。

总体来说,Docker的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

二、Docker概念

Docker是开发人员和系统管理员使用容器开发、部署和运行应用程序的平台。使用Linux容器来部署应用程序称为集装箱化。使用docker轻松部署应用程序。

集装箱化的优点:

  • 灵活:即使是复杂的应用程序也可封装。
  • 轻量级:容器利用并共享主机内核。
  • 便携式:您可以在本地构建,部署到云上并在任何地方运行。
  • 可扩展性:您可以增加和自动分发容器副本。
  • 可堆叠:您可以垂直堆叠服务并及时并及时堆叠服务。

三、背景

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

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

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

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

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

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

四、环境准备

准备两台安装好docker的服务器:

服务端:docker私有仓库服务器,运行registry容器;

测试端:普通的docker服务器,在这台服务器上下载一个测试镜像nginx,然后上传到registry服务器进行测试;

IP地址

操作系统

备注

192.168.1.77

CentOS 7.4.1708 (Core)

服务端

192.168.1.79

CentOS 7.4.1708 (Core)

测试端

五、registry部署(服务端操作)

1)下载镜像registry

[root@localhost ~]# docker pull registry

Using default tag: latest

Trying to pull repository docker.io/library/registry ...

latest: Pulling from docker.io/library/registry

486039affc0a: Pull complete

ba51a3b098e6: Pull complete

8bb4c43d6c8e: Pull complete

6f5f453e5f2d: Pull complete

42bc10b72f42: Pull complete

Digest: sha256:7d081088e4bfd632a88e3f3bcd9e007ef44a796fddfe3261407a3f9f04abe1e7

Status: Downloaded newer image for docker.io/registry:latest

2)查看镜像是否pull下来

[root@localhost ~]# docker images

REPOSITORY             TAG        IMAGE ID             CREATED             SIZE

docker.io/registry     latest     708bc6af7e5e      3 months ago     25.8 MB

3)运行registry容器

[root@localhost ~]# docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest

2cba2cc0ca18d22686b05de30a80ae461c5f29cc10c15d3a5ea47e65238a5941

参数说明

-itd:在容器中打开一个伪终端进行交互操作,并在后台运行;

-v:把宿主机的/data/registry目录绑定 到 容器/var/lib/registry目录(这个目录是registry容器中存放镜像文件的目录),来实现数据的持久化;

-p:映射端口;访问宿主机的5000端口就访问到registry容器的服务了;

--restart=always:这是重启的策略,假如这个容器异常退出会自动重启容器;

--name registry:创建容器命名为registry,你可以随便命名;

registry:latest:这个是刚才pull下来的镜像;

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

[root@localhost ~]# curl http://127.0.0.1:5000/v2/_catalog

{"repositories":[]}

六、测试镜像仓库(测试端操作)

1)修改下镜像源并重启docker服务

[root@localhost ~]# vim /etc/docker/daemon.json

{

    "registry-mirrors": [ "https://registry.docker-cn.com"]

}

# 以下是镜像源地址,选择合适的镜像地址

Docker中国区官方镜像

https://registry.docker-cn.com

网易

http://hub-mirror.c.163.com

ustc

https://docker.mirrors.ustc.edu.cn

中国科技大学

https://docker.mirrors.ustc.edu.cn

阿里云容器服务

https://cr.console.aliyun.com

2)下载nginx镜像

[root@localhost ~]# docker pull nginx

Using default tag: latest

Trying to pull repository docker.io/library/nginx ...

latest: Pulling from docker.io/library/nginx

54fec2fa59d0: Pull complete

4ede6f09aefe: Pull complete

f9dc69acb465: Pull complete

Digest: sha256:86ae264c3f4acb99b2dee4d0098c40cb8c46dcf9e1148f05d3a51c4df6758c12

Status: Downloaded newer image for docker.io/nginx:latest

[root@localhost ~]# docker images

REPOSITORY            TAG          IMAGE ID               CREATED           SIZE

docker.io/nginx       latest        602e111c06b6       5 days ago        127 MB

3)镜像打标签

[root@localhost ~]# docker tag nginx:latest 192.168.1.77:5000/nginx:v1

格式说明:Usage: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

nginx:lastest 这是源镜像,也是刚才pull下来的镜像文件;
192.168.1.77:5000/nginx:v1:这是目标镜像,也是registry私有镜像服务器的IP地址和端口;

4)查看已打好的标签镜像

[root@localhost ~]# docker images

REPOSITORY                       TAG      IMAGE ID             CREATED         SIZE

192.168.1.77:5000/nginx   v1         602e111c06b6     5 days ago       127 MB

docker.io/nginx                  latest    602e111c06b6     5 days ago       127 MB

5)上传到镜像服务器

[root@localhost ~]# docker push 192.168.1.77:5000/nginx:v1

The push refers to a repository [192.168.1.77:5000/nginx]

Get https://192.168.1.77:5000/v1/_ping: http: server gave HTTP response to HTTPS client

注意了,这是报错了,需要https的方法才能上传,我们可以修改下daemon.json来解决:

[root@localhost ~]# vim /etc/docker/daemon.json

{

    "registry-mirrors": [ "https://registry.docker-cn.com"],

    "insecure-registries": [ "192.168.1.77:5000"]

}

# 重启Docker服务

[root@localhost ~]# systemctl restart docker

# 再次上传镜像

[root@localhost ~]# docker push 192.168.1.77:5000/nginx:v1

The push refers to a repository [192.168.1.77:5000/nginx]

b3003aac411c: Pushed

216cf33c0a28: Pushed

c2adabaecedb: Pushed

v1: digest: sha256:cccef6d6bdea671c394956e24b0d0c44cd82dbe83f543a47fdc790fadea48422 size: 948

6)测试下载镜像

# 上传测试没问题了,我们接下来测试一下从registry服务器上下载刚才上传的nginx镜像,先删除测试端主机上的镜像:

[root@localhost ~]# docker rmi -f $(docker images -aq)

Untagged: 192.168.1.77:5000/nginx:v1

Untagged: 192.168.1.77:5000/nginx@sha256:cccef6d6bdea671c394956e24b0d0c44cd82dbe83f543a47fdc790fadea48422

Untagged: docker.io/nginx:latest

Untagged: docker.io/nginx@sha256:86ae264c3f4acb99b2dee4d0098c40cb8c46dcf9e1148f05d3a51c4df6758c12

Deleted: sha256:602e111c06b6934013578ad80554a074049c59441d9bcd963cb4a7feccede7a5

Deleted: sha256:81eaddad75aaa517b4a597912da28c2f5b905f6e9789dce3aea874b040aad201

Deleted: sha256:73cafa8418003ecfaa02360f181c132b2cf4b61433e1bd5c84012941105865c8

Deleted: sha256:c2adabaecedbda0af72b153c6499a0555f3a769d52370469d8f6bd6328af9b13

# 查看一下测试端主机上的镜像删除情况

[root@localhost ~]# docker images

REPOSITORY      TAG     IMAGE ID     CREATED      SIZE

7)从registry服务器上下载nginx镜像

[root@localhost ~]# docker pull 192.168.1.77:5000/nginx:v1

Trying to pull repository 192.168.1.77:5000/nginx ...

v1: Pulling from 192.168.1.77:5000/nginx

54fec2fa59d0: Pull complete

4ede6f09aefe: Pull complete

f9dc69acb465: Pull complete

Digest: sha256:cccef6d6bdea671c394956e24b0d0c44cd82dbe83f543a47fdc790fadea48422

Status: Downloaded newer image for 192.168.1.77:5000/nginx:v1

[root@localhost ~]# docker images

REPOSITORY                        TAG        IMAGE ID              CREATED          SIZE

192.168.1.77:5000/nginx    v1           602e111c06b6      5 days ago       127 MB

# 列出所有镜像

[root@localhost ~]# curl http://192.168.1.77:5000/v2/_catalog

{"repositories":["nginx"]}

# 列出nginx镜像tag标签

[root@localhost ~]# curl http://192.168.1.77:5000/v2/nginx/tags/list

{"name":"nginx","tags":["v1"]}

至此,Docker搭建私有仓库完毕。

若文章图片、下载链接等信息出错,请在评论区留言反馈,博主将第一时间更新!如本文“对您有用”,欢迎随意打赏,谢谢!

继续阅读
Wechat
微信扫一扫,加我!
weinxin
微信公众号
微信扫一扫,关注我!
weinxin
Docker最后更新:2024-1-24
小柒博客
  • 本文由 小柒博客 发表于 2020年4月29日11:15:20
  • 声明:本站所有文章,如无特殊说明或标注,本站文章均为原创。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。转载请务必保留本文链接:https://www.yangxingzhen.com/6893.html
匿名

发表评论

匿名网友
:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

拖动滑块以完成验证