#!/bin/bash
green(){
back='\e[0m'
gr='\e[0;32m'
echo -e "${gr}$1${back}"
}
red(){
re='\e[1;31m'
back='\e[0m'
echo -e "${re}$1${back}"
}
show_container(){
green "已经存在的容器: "
green "-----------------------------------------------"
docker ps -a | awk 'BEGIN{print "\tID","\t\tIMAGES","\t\tNAME"}NR!=1{print " "$1,"\t\t"$2,"\t\t"$NF}'
green "-----------------------------------------------"
}
# 创建
create_bridge(){
docker images
green "请输入镜像名称: "
read images_name
show_container
green "请输入新容器名称: "
read container_name
docker run --name $container_name -dit $images_name /bin/bash &> /dev/null
pd=`docker ps | awk '{print $NF}' | grep -v "NAMES" | grep -x $container_name | wc -l`
if [ $pd -eq 1 ]
then
green "容器 [$container_name] 创建并运行成功"
else
red "容器 [$container_name] 运行失败"
fi
}
create_none(){
docker images
green "请输入镜像名称: "
read images_name
show_container
green "请输入新容器名称: "
read container_name
# 获取宿主机的 docker0 的 ip
docker0_ip=`ifconfig | grep -1 docker0 | awk '/inet/{print $2}'`
# 获取 docker0ip 的网段
docker0_wd=`echo $docker0_ip | sed "s/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1.\2.\3.0\/16/"`
green "请输入网段为 $docker0_wd 的固定ip: "
read ip
docker run --name $container_name -dit --net=none $images_name /bin/bash &> /dev/null
# 获取容器的进程 pid
pid_num=`docker inspect -f "{{.State.Pid}}" $container_name`
mkdir /var/run/netns &> /dev/null
ln -s /proc/$pid_num/ns/net /var/run/netns/$pid_num &> /dev/null
# 获取对应容器的 id 的前 10 个字符
number=`docker ps -a | awk '/[0-9a-z]*\ '"$container_name"'$/{print $1}' | cut -c 1-10`
ip link add veth_$number type veth peer name X
brctl addif docker0 veth_$number
ip link set veth_$number up
ip link set X netns $pid_num
ip netns exec $pid_num ip link set dev X name eth0
ip netns exec $pid_num ip link set eth0 up
ip netns exec $pid_num ip addr add $ip/16 dev eth0
ip netns exec $pid_num ip route add default via $docker0_ip
# 判断该容器是否运行起来
pd=`docker ps | awk '{print $NF}' | grep -v "NAMES" | grep -x $container_name | wc -l`
if [ $pd -eq 1 ]
then
green "容器 [$container_name] 创建并运行成功"
else
red "容器 [$container_name] 运行失败"
fi
}
create(){
clear
while true
do
cat<<EOF
----------------------------
1. 随机IP(bridge)
2. 固定IP(none)
q. 返回
----------------------------
EOF
green "请输入操作选项[1|2|q]: "
read option
case $option in
1)
create_bridge
;;
2)
create_none
;;
q)
break
;;
*)
red "请输入正确的选项"
;;
esac
done
}
# 删除
delete_one(){
show_container
green "请输入要删除的容器名称: "
read name
docker rm -f $name &> /dev/null
green "容器 [$name] 删除成功"
}
delete_all(){
show_container
red "确定将所有容器全部删除吗?(y/n)"
read option
case $option in
y|yes|Y|YES)
docker rm -f $(docker ps -qa)
green "所有容器删除成功"
;;
n|N|NO|no)
green "感谢你的谨慎^-^"
;;
*)
red "请输入正确的选项"
;;
esac
}
delete(){
clear
while true
do
cat<<EOF
----------------------------
1. 删除单个容器
2. 删除所有容器
q. 返回
----------------------------
EOF
green "请输入操作选项[1|2|q]: "
read option
case $option in
1)
delete_one
;;
2)
delete_all
;;
q)
break
;;
*)
red "请输入正确的选项"
;;
esac
done
}
# 整体操作
operation(){
while true
do
clear
cat<<EOF
----------------------------
1. 创建容器
2. 删除容器
q. 退出
----------------------------
EOF
green "请输入操作选项[1|2|q]: "
read option
case $option in
1)
create
;;
2)
delete
;;
q)
exit
;;
*)
red "请输入正确的选项"
;;
esac
done
}
operation
Docker简单管理脚本
最新推荐文章于 2024-04-03 06:04:54 发布