DockerHub私有镜像源Register搭建

600 阅读2分钟

本博客完全参考docker-docs:Docker Registry

什么是 Docker Register?

Docker Register是Docker官方的一个开源项目,是一个类似Docker Hub可以部署在私有服务器的镜像源。

官方文档也有解释:

我们平时从Docker Hub拉取镜像,比如

docker pull ubuntu

命令,其实是下面👇命令的简写。

docker pull docker.io/library/ubuntu

而我们部署了自己的Register后,就可以从私有的镜像源拉去镜像了:

docker pull mydomain.com:port/ubuntu:tag

为什么要自己部署Register?

因为私有的项目镜像不想开源啊

一些准备工作(前提)

  1. 部署https证书

启动容器时,将证书文件映射到docker内部,并通过设置环境变量配置证书文件和密钥文件 假设你的证书文件在path/to/certs目录下,并分别为domain.pemdomain.key两个文件

  -v path/to/certs:/certs \
  -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \

如果部署Register的服务器没有部署https证书,那么需要在docker客户端daemon.json配置信任它

    {
    	"insecure-registries" : ["my-server:port"]
    }

但是按以上方式使用http,那么将没有办法使用下面的身份认证,身份认证必须部署https。

  1. 身份认证 Register默认是没有身份认证的,官方提供了几种认证方式,我选择了最简单的htpasswd方式。想生成htpasswd认证,需要安装apache2-utils
apt install apache2-utils

然后生成密码并保存到htpasswd文件中:

htpasswd -Bbn username password > htpasswd

部署

docker-compose.yml文件

registry:
  restart: always
  image: registry:latest
  ports:
    - 5000:5000
  environment:
    REGISTRY_HTTP_TLS_CERTIFICATE: /certs/domain.pem
    REGISTRY_HTTP_TLS_KEY: /certs/domain.key
    REGISTRY_AUTH: htpasswd
    REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
    REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
  volumes:
    - /my/servdata/registry:/var/lib/registry
    - /my/certs:/certs
    - /my/auth:/auth

这里的/my/servdata/registry/my/certs/my/auth都是我自己部署时的真实路径,分别是Registry的持久化存储目录,https证书目录和身份认证文件目录。

最后,在docker-compose.yml所在目录部署运行

docker-compose up -d

测试

push镜像

首先在客户端login到刚刚部署到镜像服务器:

docker login mydomain.com:port -u username -p password

本地编译一个镜像测试一下:

docker build -t mydomain.com:port/test:tag1 .

注意,这里镜像的tag要加前缀mydomain.com:5000,是部署服务器的域名和端口号(如果使用443可省略)

push 镜像到私有镜像源:

docker push mydomain.com:port/test:tag1

结果如下:

The push refers to repository [mydomain.com:port/test]
5e2258fcdab3: Pushed 
b2d5eeeaba3a: Layer already exists 
tag1: digest: sha256:6079642299164862e7ece3405843d0e490592d513uf74h6ix62f9b4a6e966561 size: 738

镜像发布成功

pull镜像

换另一台机器,首先也是要登陆:

docker login mydomain.com:port -u username -p password

然后pull镜像:

root@VM-12-2-ubuntu:/home/ubuntu# docker pull mydomain.com:port/test:tag1
202104180233: Pulling from test
540db60ca938: Already exists 
218ddf0927aa: Pull complete 

之后就可以正常从该镜像mydomain.com:port/test:tag1启动容器了