如果企业大规模应用Docker技术做IT基础实施的管理,不大可能都用三方的仓库,这样费代宽费时间还不安全,势必会涉及到搭建私有Docker仓库。

搭建私有Docker仓库比较简单,下面对搭建过程做个记录。

环境准备

  • Docker仓库服务器:10.10.10.25
  • Docker客户端:10.10.10.30

先准备两台服务器,用的是openSUSE的系统,都要安装docker服务zypper in docker,并启动服务systemctl start docker.service ,可以把设置成开机自动启动systemctl enable docker.service

可以给Docker换一个目录,先停止docker,改配置文件,拷贝文件到新目录,再启动docker服务。配置项如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 安装完docker之后,最好给他换一个目录,否则将来文件可能很多很大
# vi /etc/docker/daemon.json
"registry-mirrors": ["https://h8viyefd.mirror.aliyuncs.com"], 	# 更换仓库镜像
"graph":"/home/dockerRoot", 									# 换根目录

cp -R /var/lib/docker/* /home/dockerRoot/						# copy文件

$ docker info # 服务器端的配置
 Server Version: 19.03.1
 Docker Root Dir: /home/dockerRoot
 Registry: https://index.docker.io/v1/
 Registry Mirrors:
  https://h8viyefd.mirror.aliyuncs.com/

服务端配置

所谓私有仓库服务,其实也是用docker部署的,镜像名称是registry,在服务器 10.10.10.25 上拉取镜像registry

1
docker pull registry

查看镜像,$> docker images

REPOSITORY      TAG           	IMAGE ID            CREATED             SIZE
registry     	latest          2d4f4b5309b1        5 months ago        26.2MB

然后就是启动这个镜像的一个容器,启动之前先确定宿主机的磁盘空间,将来可能会有大量镜像上传,需要具备一定的磁盘空间,将宿主机的大磁盘空间以挂载卷的方式挂载到容器中

1
2
docker run -d -v /home/dockerRegistry:/var/lib/registry -p 5000:5000 --restart=always 
	--privileged=true --name cdregistry registry:latest

容器启动成功之后,私有仓库就配置部署好了。

客户端配置

客户端 10.10.10.30 服务器,先拉取或创建自己的应用镜像,然后给要上传到私有仓库的镜像打标签:

1
2
# 这里以我们常用的 opensuse15.2 系统作为基础镜像
docker tag bmc/opensuse15.2:dev 10.10.10.25:5000/bmcopensuse15.2-v1

成功之后会发现本地镜像库中多了下面这条记录:

REPOSITORY                          TAG     IMAGE ID      CREATED      SIZE
10.10.10.25:5000/bmcopensuse15.2-v1 latest  b06b60600e2a  2 days ago   270MB

接下来就是把打好tag的镜像上传到私有镜像仓库:

1
docker push 10.10.10.25:5000/bmcopensuse15.2-v1

注意:测试发现同样的镜像(版本号也一致)可以重复push到仓库,将把以前的镜像覆盖。

不出意外,你会看到一个错误提示:

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

意思是私有仓库暴露的http端口不支持https协议,而客户端默认使用https上传镜像,怎么办?

https的问题

第一种方法:在客户端配置使用指定服务器采用不安全的http协议传输

1
2
3
4
5
# vi /etc/docker/daemon.json
"registry-mirrors": ["https://h8viyefd.mirror.aliyuncs.com"],
"insecure-registries":["10.10.10.25:5000"],

# 然后重启客户端Docker,应该就可以http推送了

第二种方法:在服务器端配置SSL证书

这种方法以后再补充…

验证是否可用

上面证书的问题解决之后,应该就可以成功将镜像推送到私有仓库了,现在查看一下推送结果:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 1. 可以在私有仓库挂载的宿主机目录中看到变化,比如这个目录
/home/dockerRegistry/docker/registry/v2/repositories/bmcopensuse15.2-v1

# 2. 也可以在客户端执行,查看仓库所有的镜像。
curl http://10.10.200.11:5000/v2/_catalog
# 看到的结果是:
{"repositories":["bmcopensuse15.2-v1"]}
# 获取某个镜像的tag列表
curl http://10.10.200.11:5000/v2/[image-name]/tags/list

# 3. 客户端拉取一个镜像试一试
docker pull 10.10.10.25:5000/bmcopensuse15.2-v1

到这里你就可以在内网任何地方使用私有仓库拉取和推送自己的镜像了。

删除镜像

私有镜像仓库中镜像如果不需要了,如何删除呢?很奇怪这居然是个比较麻烦的事情,可以参考下面的方法:

官方:https://github.com/burnettk/delete-docker-registry-image

民间:https://segmentfault.com/a/1190000018166325

用官方的方法需要先安装一个命令,赋予可执行权限:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 1. 下载并添加可执行权限
curl https://raw.githubusercontent.com/burnettk/delete-docker-registry-image/master/ \
delete_docker_registry_image.py | sudo tee /usr/local/bin/delete_docker_registry_image >/dev/null
sudo chmod a+x /usr/local/bin/delete_docker_registry_image

# 2. 添加环境变量,执行你自己的仓库存放文件的路径
export REGISTRY_DATA_DIR=/home/dockerRegistry/docker/registry/v2

# 3. 删除镜像
delete_docker_registry_image -i bmcwebagent -n    # 查询删除明细
delete_docker_registry_image -i bmcwebagent       # 删除某个镜像
delete_docker_registry_image -i bmcwebagent:111   # 删除某个镜像对应的tag

# 4. 删除之后重新上传同名镜像
##记住这个时候一定要重启私有镜像仓库,否则无法再次上传同名镜像

(完)