Я использую инструмент ctr cmdline, который похож на инструмент docker cmdline для containerd, для загрузки контейнера. Это команда, которую я использовал: sudo ctr run -t --rm docker.io/library/busybox:latest hello sh
.
Я использовал плагины cni для настройки сети контейнера. Я следовал официальной документации cni . Я написал /etc/cni/net.d/10-mynet.conf
и /etc/cni/net.d/99-loopback.conf
как показ учебника. Когда я хотел выполнить эту команду: sudo CNI_PATH=$CNI_PATH ./priv-net-run.sh ifconfig
. Содержание priv- net -run. sh выглядит следующим образом:
#!/usr/bin/env bash
set -e
if [[ ${DEBUG} -gt 0 ]]; then set -x; fi
# Run a command in a private network namespace
# set up by CNI plugins
contid=$(printf '%x%x%x%x' $RANDOM $RANDOM $RANDOM $RANDOM)
netnspath=/var/run/netns/$contid
ip netns add $contid
./exec-plugins.sh add $contid $netnspath
function cleanup() {
./exec-plugins.sh del $contid $netnspath
ip netns delete $contid
}
trap cleanup EXIT
ip netns exec $contid "$@"
И exe c -plugins. sh выглядит следующим образом:
#!/usr/bin/env bash
if [[ ${DEBUG} -gt 0 ]]; then set -x; fi
NETCONFPATH=${NETCONFPATH-/etc/cni/net.d}
function exec_plugins() {
i=0
contid=$2
netns=$3
export CNI_COMMAND=$(echo $1 | tr '[:lower:]' '[:upper:]')
export PATH=$CNI_PATH:$PATH
export CNI_CONTAINERID=$contid
export CNI_NETNS=$netns
for netconf in $(echo $NETCONFPATH/*.conf | sort); do
name=$(jq -r '.name' <$netconf)
plugin=$(jq -r '.type' <$netconf)
export CNI_IFNAME=$(printf eth%d $i)
res=$($plugin <$netconf)
if [ $? -ne 0 ]; then
errmsg=$(echo $res | jq -r '.msg')
if [ -z "$errmsg" ]; then
errmsg=$res
fi
echo "${name} : error executing $CNI_COMMAND: $errmsg"
exit 1
elif [[ ${DEBUG} -gt 0 ]]; then
echo ${res} | jq -r .
fi
let "i=i+1"
done
}
if [ $# -ne 3 ]; then
echo "Usage: $0 add|del CONTAINER-ID NETNS-PATH"
echo " Adds or deletes the container specified by NETNS-PATH to the networks"
echo " specified in \$NETCONFPATH directory"
exit 1
fi
exec_plugins $1 $2 $3
Я думал, что netnspath должен быть моим пространством имен сети контейнеров. Я нашел pid контейнера и установил netnspath как /proc/$(pid)/ns/net
. Тогда я exe c sudo CNI_PATH=$CNI_PATH ./priv-net-run.sh ifconfig
но ничего не произошло. Когда я использую ifconfig
для просмотра информации о сети, на моем хосте появилась только новая сетевая карта с именем cni0
. В контейнере не было сетевой карты, кроме lo
.
Интересно, как использовать плагины cni для настройки сети для контейнера.