本博客完全参考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?
因为私有的项目镜像不想开源啊
一些准备工作(前提)
- 部署https证书
启动容器时,将证书文件映射到docker内部,并通过设置环境变量配置证书文件和密钥文件
假设你的证书文件在path/to/certs目录下,并分别为domain.pem
, domain.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。
- 身份认证
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
启动容器了