Skip to content

Containerd

install by binary

bash
# containerd
# 支持 oci 标准的容器
# https://github.com/containerd/containerd
$ curl -O https://hub.gitmirror.com/https://github.com/containerd/containerd/releases/download/v1.6.0/cri-containerd-cni-1.6.0-linux-amd64.tar.gz
$ tar -tf cri-containerd-cni-1.6.0-linux-amd64.tar.gz
$ tar -xvf cri-containerd-cni-1.6.0-linux-amd64.tar.gz
# 解压到路径
$ tar -xvf cri-containerd-cni-1.6.0-linux-amd64.tar.gz -C /
$ cp usr/local/bin/containerd /usr/local/bin/
$ cp etc/systemd/system/containerd.service /etc/systemd/system/
$ containerd config default > /etc/containerd/config.toml
$ systemctl enable containerd
$ systemctl start containerd
$ systemctl status containerd
$ cp usr/local/bin/ctr /usr/local/bin/
$ ctr help

# runc
# https://github.com/opencontainer/runc
# seccomp 依赖 可能存在不兼容 另装
$ curl -O https://hub.gitmirror.com/https://github.com/opencontainers/runc/releases/download/v1.1.0/runc.amd64
$ mv runc.amd64 /usr/local/sbin/runc
$ chmod +x /usr/local/sbin/runc

config.toml

bash
# mirror
# dockerhub: docker.io 
# gcr, google container registry
# kubernetes 项目相关镜像: k8s.gcr.io
# kubernetes 项目相关、docker 镜像: gcr.io
    [plugins."io.containerd.grpc.v1.cri".registry]
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
          endpoint = ["https://dockerhub.mirrors.nwafu.edu.cn"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
          endpoint = ["https://registry.aliyuncs.com/k8sxio"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."gcr.io"]
          endpoint = ["xxx"]
          
"https://docker.anyhub.us.kg",
"https://dockerhub.jobcher.com",
"https://dockerhub.icu",
"https ://docker.ckyl.me",
"https://docker.aws19527.cn",
"https://docker.m.daocloud.io",
"https://docker.laoex.link"

image

bash
$ ctr image pull <host>/<namespace>/<image>:<tag>
# host: docker.io
# namespace: library 官方命名空间,替换用户命名空间
$ ctr image pull docker.io/library/nginx:1.21-alpine
$ ctr image pull dokcer.io/jenkins/jenkins:latest

$ ctr image mount <image> <mount-endpoint>
$ ctr image unmount <mount-enpoint>

$ ctr image export [option] <path> <ref>
$ ctr image import <path>

# copy and rename target of tag
# ref: <host/namespace/image:tag>
$ ctr image tag <source-ref> <targe-ref>

container & task

bash
$ ctr container ls
# static container
# image --> container
$ ctr container create
# namespace share
--with-ns "pid:/proc/<pid>/ns/pid"
# mount file
--mount "type=bind,src=/tmp,dst=/host,options=rbind:ro"
# print container info
$ ctr container info

# dynamic container:
# container -> task
# task: container inside process
$ ctr task start <container>
$ ctr task ls
$ ctr task ps <container>
$ ps -ef | grep <pid>
$ ctr task pause <container>
$ ctr task resume <container>

# entry task
# $RANDOM: 系统随机数字变量
$ ctr task exec --exec-it $RANDOM <container>

# image --> task
$ ctr run -d --net-host <ref> [container]

namespace

bash
# tenant partition, default namespace is default
$ ctr namespace create <NAME>
$ ctr namespace create kubemsb
$ ctr -n kubemsb image pull docker.io/library/nginx:alpine
$ ctr -n kubemsb run -d docker.io/library/nginx:alpine nginx
$ ctr -n kubemsb task ls

copy & mv

bash
# /run/containerd/io.containerd.runtime.v2.task/<namespace>/<CONTAINER>/rootfs

cni

bash
# Container Network Interface
# cni: www.github.com/containernetworking/cni
# cni-plugins: www.github.com/containernetworking/plugins

# download
$ curl -O https://hub.gitmirror.com/https://github.com/containernetworking/cni/archive/refs/tags/v1.1.0.tar.gz
$ curl -O https://hub.gitmirror.com/https://github.com/containernetworking/plugins/releases/download/v1.1.0/cni-plugins-linux-amd64-v1.1.0.tgz

$ mkdir cni
$ tar -xvf v1.1.0.tar.gz -C ./cni
$ mkdir cni/cni-1.1.0/plugins/bin
$ tar -xvf cni-plugins-linux-amd64-v1.0.0.tgz ./cni/cni-1.1.0/plugins/bin

# config
# by www.github.com/containernetworking/cni/main/README.dm
# /etc/cni/net.d/10-mynet.conf
# the "cniVersion" see /cni/release overview
$ cat > /etc/cni/net.d/10-mynet.conf <<EOF
{
	"cniVersion": "1.0.0",
	"name": "mynet",
	"type": "bridge",
	"bridge": "cni0",
	"isGateway": true,
	"ipMasq": true,
	"ipam": {
		"type": "host-local",
		"subnet": "10.23.0.0/16",
		"routes": [
			{ "dst": "0.0.0.0/0" }
		]
	}
}
EOF

# /etc/cni/net.d/99-loopback.conf
$ cat > /etc/cni/net.d/99-loopback.conf <<EOF
{
	"cniVersion": "1.0.0",
	"name": "lo",
	"type": "loopback"
}
EOF

# before execute script
$ cd cni/cni-1.1.0/scripts

# create
# dependencies: iptables, jq
$ apt install iptables
$ apt install jq

# script/priv-net-run.sh
CNI_PATH=`pwd`/../plugins/bin ./priv-net-run.sh

# delete
$ ip link delete <interface>

# scripts/exec-plugins.sh
# add or deletes the container specified by NETNS_PATH to the networks
$ CONTAINER_ID=`ctr task ls | grep <TASK> | awk '{print $2}'`
$ NETNS_PATH=/proc/$container-id/ns/net
$ CNI_PATH=`pwd`/../plugins/bin ./exec-plugins.sh add|del <CONTAINER_ID> <NETNS_PATH>

iptables

bash
$ iptables -t filter -A INPUT -j DROP -p tcp --deport 8081
$ iptables -t filter -A OUTPUT -j DROP -p tcp -d 127.0.0.1
$ iptables -t filter -D INPUT 1


# /etc/sysctl.conf 
# /proc/sys/net/ipv4/ip_forward
$ sysctl -w net.ipv4.ip_forward=1

$ iptables -t nat -L -n
$ iptables -t filter -L -n

# DNAT, Destination Network Address Translation
# SNAT, Source Network Address Translation

# 添加 PREROUTING
$ iptables -t nat -A PREROUTING -j DNAT -p tcp -d <proxy-ip> --dport <proxy-port> --to <target-ip:target-port>
$ iptables -t nat -A PREROUTING -j DNAT -p tcp -d <proxy-ip> --dport <proxy-port> --to-destination <target-ip:target-port>

# 添加 POSTROUTING
$ iptables -t nat -A POSTROUTING -j SNAT -p tcp -d <target-ip> --dport <target-port> --source <proxy-ip>
# 或者
$ iptables -t nat -A POSTROUTING -j MASQUERADE -p tcp -d <target-ip> --dport <target-port>
# eg.
$ iptables -t nat -A POSTROUTING -j CNI-5935cb6e9db3cd5c99e752b0 --source 10.22.0.5

# comment: -m comment --comment '<content>'
# eg.
$ iptables -t nat -A POSTROUTING -j CNI-5935cb6e9db3cd5c99e752b0 --source 10.22.0.5 -m comment --comment 'name: "mynet" id: "586"'

Harbor

开源镜像仓库

bash
# dns 设置 
# /etc/hosts 
127.0.0.1	harbor.kubemsb.com

# modify ref
$ ctr image tag docker.io/library/nginx:alpine harbor.kubemsb.com/library/nginx:alpine
# --plain-http 使用 http,默认 https
$ ctr push --platform linux/amd64 --plain-http -u <username>:<passwd> harbor.kubemsb.com/library/nginx:alpine
$ ctr pull --platform linux/amd64 --plain-http harbor.kubemsb.com/library/nginx:alpine