天天看点

私有docker仓库搭建

1、背景

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

它实际上是从 registry.hub.docker.com 这个地址去查找,这就是Docker公司为我们提供的公共仓库,上面的镜像,大家都可以看到,也可以使用,当然由于天朝的问题,这里可以采用阿里云的镜像地址,地址如下,配置在/etc/docker/daemon.json下面,

("registry-mirrors": ["https://lmb1nmv1.mirror.aliyuncs.com"])。所以,我们也可以带上仓库地址去拉取镜像,如:docker pull registry.hub.docker.com/library/alpine,不过要注意,这种方式下载的镜像的默认名称就会长一些。

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

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

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

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

2、环境

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

服务端机器 (主机名为registry):docker私有仓库服务器,运行registry容器;

测试端机器 (主机名为node):普通的docker服务器,在这台服务器上下载一个测试镜像busybox,然后上传到registry服务器进行测试;

这里我使用的Linux版本是CentOS 7

我的内网地址为:10.18.133.2(服务端即创建registry的主机),记得一定是内网ip

我所用的docker版本如下如所示:

私有docker仓库搭建

3、部署(服务端操作)

3.1 下载镜像registry

[[email protected] ~]# docker pull registry

Using default tag: latest

latest: Pulling from library/registry

81033e7c1d6a: Pull complete 

b235084c2315: Pull complete 

c692f3a6894b: Pull complete 

ba2177f3a70e: Pull complete 

a8d793620947: Pull complete 

Digest: sha256:672d519d7fd7bbc7a448d17956ebeefe225d5eb27509d8dc5ce67ecb4a0bce54

Status: Downloaded newer image for registry:latest

3.2 查看镜下是否pull下来了

私有docker仓库搭建

3.3 运行registry容器

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

06a972de6218b1f1c3bf9b53eb9068dc66d147d14e18a89ab51db13e339d3dc9

参数说明

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

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

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

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

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

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

3.4 测试镜像仓库中所有的镜像

[[email protected] ~]# curl http://10.18.133.2:5000/v2/_catalog

{"repositories":[]}

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

4、测试镜像仓库(测试端操作)(这是访问registry节点的机器!!!!)

这是访问registry节点的机器!!!

这是访问registry节点的机器!!!

这是访问registry节点的机器!!!

重要的事情说三遍!!!(之前在这里踩过坑,一直在registry主机上配置不起作用)

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

[[email protected] ~]# vim /etc/docker/daemon.json

{

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

}

[[email protected] ~]# systemctl restart docker

[[email protected] ~]# vim /usr/lib/systemd/system/docker.service

编辑如下:标红的那行(ExecStart....)

私有docker仓库搭建

4.2 下载busybox镜像

[[email protected] ~]# docker pull busybox

[[email protected] ~]# docker images

REPOSITORY          TAG                IMAGE ID            CREATED            SIZE

busybox            latest              f6e427c148a7        36 hours ago        1.15MB

4.3 为镜像打标签

[root@node ~]# docker tag busybox:latest  10.18.133.2:5000/busybox:v1

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

busybox:lastest 这是源镜像,也是刚才pull下来的镜像文件;

10.18.133.2:500/busybox:v1:这是目标镜像,也是registry私有镜像服务器的IP地址和端口;

查看一下打好的tag:

私有docker仓库搭建

4.4 上传到镜像服务器

[[email protected] ~]# docker push 10.18.133.2:5000/busybox:v1 

The push refers to repository [10.18.133.2:5000/busybox]

Get https://10.18.133.2:5000/v2/: http: server gave HTTP response to HTTPS client

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

[[email protected] ~]# vim /etc/docker/daemon.json 

{

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

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

}

添加私有镜像服务器的地址,注意书写格式为json,有严格的书写要求,然后重启docker服务:

[[email protected] ~]# systemctl  restart docker

常用到的查看docker 状态的命令为 systemctl status docker(可以观察docker运行状态),如下图所示,这样的运行状态是正常的。

私有docker仓库搭建

在次上传可以看到没问题 了:

[[email protected] ~]# docker push 10.18.133.2:5000/busybox:v1 

The push refers to repository [10.18.133.2:5000/busybox]

c5183829c43c: Pushed 

v1: digest: sha256:c7b0a24019b0e6eda714ec0fa137ad42bc44a754d9cea17d14fba3a80ccc1ee4 size: 527

4.5 测试下载镜像

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

[[email protected] ~]# docker rmi -f $(docker images -aq)

私有docker仓库搭建

Untagged: 10.18.133.2:5000/busybox:v1

Untagged: 10.18.133.2:5000/[email protected]:c7b0a24019b0e6eda714ec0fa137ad42bc44a754d9cea17d14fba3a80ccc1ee4

Untagged: busybox:latest

Untagged: [email protected]:2107a35b58593c58ec5f4e8f2c4a70d195321078aebfadfbfb223a2ff4a4ed21

Deleted: sha256:f6e427c148a766d2d6c117d67359a0aa7d133b5bc05830a7ff6e8b64ff6b1d1d

Deleted: sha256:c5183829c43c4698634093dc38f9bee26d1b931dedeba71dbee984f42fe1270d

查看一下node主机上的镜像全部删除了:

[[email protected] ~]# docker images

REPOSITORY          TAG                IMAGE ID            CREATED            SIZE

然后,从registry服务器上下载busybox镜像:

[[email protected] ~]# docker pull 10.18.133.2:5000/busybox:v1

v1: Pulling from busybox

d070b8ef96fc: Pull complete 

Digest: sha256:c7b0a24019b0e6eda714ec0fa137ad42bc44a754d9cea17d14fba3a80ccc1ee4

Status: Downloaded newer image for 10.18.133.2:5000/busybox:v1

[[email protected] ~]# docker images

REPOSITORY                  TAG                IMAGE ID            CREATED            SIZE

172.18.18.90:5000/busybox  v1                  f6e427c148a7        36 hours ago        1.15MB

列出所有镜像:

[[email protected] ~]# curl  http://10.18.133.2:5000/v2/_catalog

{"repositories":["busybox"]}

列出busybox镜像有哪些tag:

[[email protected] ~]# curl  http://10.18.133.2:5000/v2/busybox/tags/list

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