Install CRI-O (Container Runtime) 
CRI-O is an implementation of the Kubernetes CRI (Container Runtime Interface) to enable using OCI (Open Container Initiative) compatible runtimes.
runc:
runc is a low-level container runtime that directly interacts with the Linux kernel to create and run containers.
runc provides the basic functionality for creating and running containers, while containerd provides a more complete environment for managing and orchestrating container workloads.
ctr is unsupported debug and administrative client for interacting with the containerd daemon.
Because it is unsupported, the commands,options, and operations are not guaranteed to be backward compatible or stable from release to release of the containerd project.
Linux OS -> runc -> CRI
https://github.com/cri-o/cri-o/releases
https://github.com/opencontainers/runtime-tools
https://github.com/kubernetes-sigs/cri-tools/releases
# dnf install container-selinux cri-o cri-tools
# systemctl enable --now crio
Socket File
/var/run/crio/crio.sock 
Install Containerd
Containerd is an open-source CRI (Container Runtime Interface) compatible container runtime. It is created by Docker and donated to CNCF.
# dnf install -y yum-utils
# dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# dnf install -y containerd.io
Generate a default configuration file for Containerd, and then we need to modify it as needed 
SystemdCgroup to true 
# mkdir -p /etc/containerd
# containerd config default > /etc/containerd/config.toml
Edit /etc/containerd/config.toml if necessary, for example:
# sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
# systemctl enable --now containerd
Socket File
var/run/containerd/containerd.sock
Install cri-tools
# curl -L https://github.com/kubernetes-sigs/cri-tools/releases/download/$VERSION/crictl-${VERSION}-linux-${ARCH}.tar.gz --output crictl-${VERSION}-linux-${ARCH}.tar.gz
Extract the downloaded archive and move the crictl binary to a directory within your system's PATH, such as /usr/local/bin/
# tar zxvf crictl-${VERSION}-linux-${ARCH}.tar.gz -C /usr/local/bin
# crictl --version
# crictl info
# crictl info | grep -i containerd
Pull Image
# crictl pull  hello-world:latest
# crictl pull  alpine:latest
List container images 
# crictl images
# crictl images nginx
# crictl images -q # List Image Ids
List all containers:
# crictl ps -a
# crictl ps # List Running Containers
Execute a command in a running container
# crictl exec -i -t <Container-ID> ls
Get Container Logs
# crictl logs <Container-ID>
# crictl logs --tail=1 <Container-ID>
# crictl stop <Container-ID>
# crictl stats <Container-ID>
# crictl inspect <Container-ID>
# crictl rm 
List Pod resourse usage statistics
# crictl statsp <Container-ID>
To set container registries and set priority, edit the file:
# vi /etc/containers/registries.conf
eg 
unqualified-search-registries = ["registry.fedoraproject.org", "registry.access.redhat.com", "registry.centos.org", "docker.io"]
List pods
crictl pods
crictl pods --name <name>
# ctr events
Port Forward
crictl port-forward command allows you to forward local ports to containers running in a Kubernetes CRI (Container Runtime Interface) environment. Here's a comprehensive guide:
# crictl port-forward <container-id> [local-port]:<container-port>
Forward local port 8080 to container port 80
# crictl port-forward <container-id> 8080:80 & $ (&) for background
# Let crictl choose an available local port
crictl port-forward <container-id> :80 
Forward Multiple Ports
Forward multiple ports simultaneously
# crictl port-forward <container-id> 8080:80 8443:443
Pull directly from a registry 
# crictl pull docker.io/nginx:latest
Import a tarball with a specific image name and tag
# crictl import ubuntu-container.tar ubuntu-custom:latest
curl to download and import directly
# curl http://example.com/image.tar | crictl import - custom-image:v1.0
If using containerd directly
# ctr image import image.tar
Import with specific namespace
# ctr -n k8s.io image import image.tar