下面步骤搭建一个简单的docker registry
- 创建一个独立的registry目录
$ mkdir registry
$ cd registry
$ mkdir data # persistent repository
$ mkdir auth # user account
目录data, 用来存储持久化的repository
目录auth, 用来存储基本认证的账号信息
- 创建一个基本认证的用户
$ cd auth
$ htpasswd -Bc registry.password username
$ cd ..
这样在当前目录(auth)下面会生成一个文件registry.password
如果本地没有htpasswd,可以下载httpd:2 image直接生成:
$ docker run --entrypoint htpasswd httpd:2 -Bbn username password > registry.password
- 创建docker-compose.yaml file
$ cat docker-compose.yml
version: '3'
services:
registry:
image: registry:2
ports:
- "5000:5000"
environment:
REGISTRY_AUTH: htpasswd
REGISTRY_AUTH_HTPASSWD_REALM: Registry
REGISTRY_AUTH_HTPASSWD_PATH: /auth/registry.password
REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
volumes:
- ./auth:/auth
- ./data:/data
- 启动registry
$ docker-compose up -d
或者直接使用docker run启动:
docker run -d \
-p 5000:5000 \
--restart=always \
--name registry \
-v "$(pwd)"/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/registry.password \
-v "$(pwd)"/data:/data \
-e REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/data \
registry:2
再或者创建docker service:
docker service create \
--name registry \
--mount type=bind,src=$(pwd)/auth,dst=/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/registry.password \
--mount type=bind,src=$(pwd)/data,dst=/data \
-e REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/data \
--publish published=5000,target=5000 \
--replicas 1 \
registry:2
- 登录
$ cat ~/my_password.txt | docker login --username username --password-stdin localhost:5000
WARNING! Your password will be stored unencrypted in /home/<username>/.docker/config.json
这个命令登录到registry,地址是localhost:5000;然后我们看到口令文件被存储在了/home/<username>/.docker/config.json里,打开看看:
$ cat ~/.docker/config.json
{
"auths": {
"localhost:5000": {
"auth": "dXNlcm5hbWU6cGFzc3dvcmQ="
}
},
"HttpHeaders": {
"User-Agent": "Docker-Client/19.03.11-ol (linux)"
}
}
这个auth信息确实就是明文存储的;因为我们没有配置SSL。
$ echo dXNlcm5hbWU6cGFzc3dvcmQ= | base64 -d
username:password
其实这个地方不用docker login命令,而直接编辑~/.docker/config.json,按照文件的格式把用户auth信息填写进来也是可以的。
另外如果在做docker命令时碰到这种错误:
Error response from daemon: Get https://<registryserveraddr>:5000/v2/: http: server gave HTTP response to HTTPS client
需要修改/etc/docker/daemon.json,加入一项内容{ "insecure-registries":["host:port"] }
:
$ sudo cat /etc/docker/daemon.json
{ "insecure-registries":["<registryserveraddr>:5000"] }
或者把registry配置成TLS enable的,以docker run为例:
$ docker run -d \
--restart=always \
--name registry \
-v "$(pwd)"/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/registry.password \
-v "$(pwd)"/data:/data \
-e REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/data \
-v /etc/docker/ssl:/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 \
-p 443:443 \
registry:2
几点说明:
- 配置证书文件/certs/domain.crt和key文件/certs/domain.key
- registry缺省监听在5000端口,如果我们要改端口,则需要制定环境变量REGISTRY_HTTP_ADDR
- 然后通过docker run的-p参数把端口导出
- 443是https的缺省端口,如果配置成443端口,那么访问registry地址的时候就不需要指定端口,否则需要带上端口。
如果使用的是自签名的证书,则需要把根证书倒入到/etc/docker/certs.d/<your_registry_host_name>:<your_registry_host_port>
目录下面;如果使用标准443端口,则省略< your_registry_host_port>
域。
$ mkdir /etc/docker/certs.d/<your_registry_host_name>:<your_registry_host_port>
$ cp path/to/domain/rootCA.crt /etc/docker/certs.d/<your_registry_host_name>:<your_registry_host_port>/
根证书文件名可以随意。
这个操作需要在所有的docker client机器上执行,但是不需要再在docker client机器上运行起来的container里面重新再做,也就是说只要在vm上执行了这个cp命令,那么在vm的container里面可以直接运行docker login就行。
- 常用操作
$ docker tag myrepos/myimage:latest localhost:5000/myrepos/myimage:2.1
$ docker push localhost:5000/myrepos/myimage:2.1
$
$ docker pull localhost:5000/myrepos/myimage:2.1
$ docker tag localhost:5000/myrepos/myimage:2.1 myrepos/myimage:2.1
这里要注意的是不管push还是pull,必须使用<registryserver>:<port>/repository的格式,而不能使用本地的格式,所以通常每次push和pull都会有两个命令,一个是改名,然后再push和pull。
查看repository和repository内容:
$ curl -X GET -u'username:password' http://localhost:5000/v2/_catalog
{"repositories":["myrepos/myimage"]}
$ curl -X GET -u'username:password' http://localhost:5000/v2/myrepos/myimage/tags/list
{"name":"myrepos/myimage","tags":["2.1"]}
网友评论