docker搭建registry服务

2021-09-03  本文已影响0人  CodingCode

下面步骤搭建一个简单的docker registry

  1. 创建一个独立的registry目录
$ mkdir registry
$ cd registry
$ mkdir data  # persistent repository
$ mkdir auth  # user account

目录data, 用来存储持久化的repository
目录auth, 用来存储基本认证的账号信息

  1. 创建一个基本认证的用户
$ 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
  1. 创建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
  1. 启动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
  1. 登录
$ 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

几点说明:

如果使用的是自签名的证书,则需要把根证书倒入到/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就行。

  1. 常用操作
$ 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"]}
上一篇 下一篇

猜你喜欢

热点阅读