ops-47 docker registry部署实战-Containerd-docker, ctr, crictl 的命令用法比较

前言

早前本站介绍过使用docker官方registry来部署加速镜像仓库私有镜像仓库的教程.近期由于需要使用gcr.io谷歌的镜像仓库,发现国内无法访问,于是就着手在公网搭建自己的私有镜像仓库方便使用,同时配置HTTPS账号密码确保安全.

本文将安装部署,Push,Pull,查询,管理和删除镜像等基础功能分享给大家.

本文为 Stille 原创文章.经实践,测试,整理发布.如需转载请联系作者获得授权,并注明转载地址.


部署

安装服务端

本文以部署至公网,开启账号密码,并配置域名反向代理为例.
命令参数过多,为方便配置参数,建议使用docker compose部署.

创建 htpasswd 账号密码

启动一个一次性容器用于创建账号密码.密码文件路径以/root/registry/htpasswd为例,账号密码以admin12345678为例.

docker run --rm --entrypoint \
    htpasswd httpd:2 -Bbn \
    admin 12345678 > /root/registry/htpasswd

docker-compose.yml

volumes 挂载htpasswd密码文件,数据目录,时区文件.配置文件config.yml作为高级用户可选挂载.
environment 环境变量开启认证,并开启删除镜像功能.

version: "3"
services:
  registry:
    image: registry:2
    container_name: registry
    volumes:
      # - ./config.yml:/etc/docker/registry/config.yml
      - ./htpasswd:/auth/htpasswd
      - ./registry:/var/lib/registry
      - /etc/localtime:/etc/localtime
    ports:
      - 5000:5000
    environment:
      - REGISTRY_AUTH=htpasswd
      - REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd
      - REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm
      - REGISTRY_STORAGE_DELETE_ENABLED=true
    networks:
      - registry
    restart: always

networks:
  registry:

启动

docker-compose up -d

成功启动后私有镜像仓库内网地址为: 192.168.1.5:5000

配置域名

由于registry在公网访问默认需使用HTTPS协议,博主使用nginx配置反向代理和证书.具体配置文件参考如下:

upstream registry { 
    server 172.17.0.1:5000;
}

server {
    listen 80;
    server_name  registry.yourdomain.com;
    return 301 https://registry.yourdomain.com$request_uri;
}

server {
    listen 443 ssl;
    server_name  registry.yourdomain.com;
    gzip on;    

    ssl_certificate /your_ssl_path/registry.yourdomain.com.crt;
    ssl_certificate_key /your_ssl_path/registry.yourdomain.com.key;

    location / {
        proxy_redirect off;
        proxy_pass http://registry;

        proxy_set_header  Host                $http_host;
        proxy_set_header  X-Real-IP           $remote_addr;
        proxy_set_header  X-Forwarded-Ssl     on;
        proxy_set_header  X-Forwarded-For     $proxy_add_x_forwarded_for;
        proxy_set_header  X-Forwarded-Proto   $scheme;
        proxy_set_header  X-Frame-Options     SAMEORIGIN;

        client_max_body_size        100m;
        client_body_buffer_size     128k;

        proxy_buffer_size           4k;
        proxy_buffers               4 32k;
        proxy_busy_buffers_size     64k;
        proxy_temp_file_write_size  64k;
    }
}

使用

登录

docker login registry.yourdomain.com
# 使用上文创建的账号密码 admin 12345678 登录

登出

docker logout registry.yourdomain.com

Push

将现有镜像tag为私有仓库镜像名

docker images
# 获取现有镜像的 IMAGE ID
docker tag 102816b1ee7d registry.yourdomain.com/mysql:8.0.13

Push 至私有镜像仓库

docker push registry.yourdomain.com/mysql:8.0.13

Pull

docker pull registry.yourdomain.com/mysql:8.0.13

管理

查看镜像仓库清单

curl -u admin:12345678 -X GET https://registry.yourdomain.com/v2/_catalog

查看镜像 tag 清单

curl -u admin:12345678 -X GET https://registry.yourdomain.com/v2/mysql/tags/list

删除镜像

确保docker-compose.yml环境变量中开启REGISTRY_STORAGE_DELETE_ENABLED=true

获取镜像 digest hash

curl -u admin:12345678 --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -I -X GET https://registry.yourdomain.com/v2/mysql/manifests/8.0.13
# 获取 digest hash 如下
sha256:45a2a291xxx223123fc03d9be551e362b460exxs56787736919baa

删除镜像清单

curl -u admin:12345678 -I -X DELETE https://registry.yourdomain.com/v2/mysql/manifests/sha256:45a2a291xxx223123fc03d9be551e362b460exxs56787736919baa

清理磁盘空间

docker exec registry bin/registry garbage-collect /etc/docker/registry/config.yml

手动删除目录

完成上述操作后还可以删除存储目录中的空目录文件,如不删除依旧可以被上述查看镜像仓库的命令查询到结果.
依照上文示例,挂载存储目录路径如下:

./registry/docker/registry/v2/repositories

Containerd: docker, ctr, crictl 的命令用法比较

  containerd 相比于docker , 多了namespace概念, 每个image和container 都会在各自的namespace下可见, 目前k8s会使用k8s.io作为命名空间,k8s在1.20以上本版已经默认采用containerd来作为底层容器运行时,因此我们需要掌握新的命令。
参考
https://blog.51cto.com/u_15233520/5238065

1.ctr和docker命令比较,命令区分
ctr 是 containerd 的一个客户端工具。
crictl 是 CRI 兼容的容器运行时命令行接口,可以使用它来检查和调试 k8s 节点上的容器运行时和应用程序。
ctr -v 输出的是 containerd 的版本,crictl -v 输出的是当前 k8s 的版本,从结果显而易见你可以认为 crictl 是用于 k8s 的。

[root@localhost test]# ctr -v
ctr github.com/containerd/containerd v1.4.11
[root@localhost test]# crictl -v
crictl version v1.21.0-k3s1
一般来说你某个主机安装了 k8s 后,命令行才会有 crictl 命令。而 ctr 是跟 k8s 无关的,你主机安装了 containerd 服务后就可以操作 ctr 命令。
常用命令以及对比
Containerd不支持dockerAPl和dockerCLl,但是可以通过crictl命令实现类似的功能。 Docker中有的命令Crictl大部分都有。

            docker       ctr(containerd)              crictl(kubernetes)
查看运行的容器       docker ps           ctr task ls/ctr container ls   crictl ps
查看镜像            docker images       ctr image ls                   crictl images
查看容器日志         docker logs         无                             crictl logs
查看容器数据信息      docker inspect      ctr container info             crictl inspect
查看容器资源         docker stats        无                             crictl stats
启动/关闭已有的容器   docker start/stop   ctr task start/kill            crictl start/stop
运行一个新的容器      docker run          ctr run                        无(最小单元为pod)
修改镜像标签         docker tag          ctr image tag                  无
创建一个新的容器	  docker create       ctr container create           crictl create
导入镜像             docker load         ctr image import               无
导出镜像             docker save         ctr image export               无
删除容器             docker rm           ctr container rm               crictl rm
删除镜像             docker rmi          ctr image rm                   crictl rmi
拉取镜像             docker pull         ctr image pull                 ctictl pull
推送镜像             docker push         ctr image push                 无
在容器内部执行命令	 docker exec         无                             crictl exec

2.ctr用法

<1>ctr image可用操作:

ctr image list, ctr i list , ctr i ls

<2>镜像标记tag:

ctr -n k8s.io i tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2

注意: 若新镜像reference 已存在, 需要先删除新reference, 或者如下方式强制替换

ctr -n k8s.io i tag --force registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2

<3>删除镜像:

ctr -n k8s.io i rm k8s.gcr.io/pause:3.2

<4>拉取镜像:

ctr -n k8s.io i pull -k k8s.gcr.io/pause:3.2

<5>推送镜像:

ctr -n k8s.io i push -k k8s.gcr.io/pause:3.2

<6>导出镜像:

ctr -n k8s.io i export pause.tar k8s.gcr.io/pause:3.2

<7>导入镜像:

ctr -n k8s.io i import pause.tar

不支持 build,commit 镜像

<8>查看容器相关操作:

ctr c

运行容器:

签名:ctr run [command options] [flags] Image|RootFS ID [COMMAND] [ARG…]

例子:

ctr -n k8s.io run --null-io --net-host -d

–env PASSWORD=$drone_password

–mount type=bind,src=/etc,dst=/host-etc,options=rbind:rw

–mount type=bind,src=/root/.kube,dst=/root/.kube,options=rbind:rw

$image sysreport bash /sysreport/run.sh

–null-io: 将容器内标准输出重定向到/dev/null

–net-host: 主机网络

-d: 当task执行后就进行下一步shell命令,如没有选项,则会等待用户输入,并定向到容器内

<9>容器日志:

注意: 容器默认使用fifo创建日志文件, 如果不读取日志文件,会因为fifo容量导致业务运行阻塞

如要创建日志文件,建议如下方式创建:

ctr -n k8s.io run --log-uri file:///var/log/xx.log …

<10>停止容器,:

需要先停止容器内的task, 再删除容器

ctr -n k8s.io tasks kill -a -s 9 {id}

ctr -n k8s.io c rm {id}

3.crictl用法

crictl 工具 是为k8s使用containerd而制作的, 其他非k8s的创建的 crictl是无法看到和调试的, 也就是说用ctr run 运行的容器无法使用crictl 看到

crictl 使用命名空间 k8s.io

cri plugin区别对待pod和container

ps: 列出在k8s.io 命名空间下的业务容器

pods: 列出在k8s.io 命名空间下的sandbox容器,在k8s里,通常是pause容器

logs: 打印业务容器日志

create: 创建容器,这里需要先创建sandbox, 获取sandbox容器的id后,再用此id创建业务容器

inspect: 列出业务容器状态

inspectp: 列出sandbox容器状态

posted @ 2022-08-04 09:48  冰冷的火  阅读(1055)  评论(0)    收藏  举报