如果需要迁移一个容器,需要把现有运行中的容器export打包,并在新主机上import导入。如果没有安装k8s或rancher,这种需求会很麻烦。
即使在导入新服务器上之后,也需要同步开启之前容器的端口、volume、环境变量、commands。如果包含大量的容器这个工作就会很繁琐。
个人写了脚本用于导出之前容器的运行信息,自动构建新服务器上的启动命令。
#!/bin/bash
#网络模式的名称
netName="bridge-apole"
for id in `docker ps -q --no-trunc`; do
echo -e "\n---- begin build ${id} shell cmd.\n.."
containerName=`docker ps --format {{.Names}} --filter id=${id}`
postList=""
for port in `docker port ${id} |grep -v "::" |awk -F '/|:' '{print $1":"$3}'`; do
postList=`echo "${postList} -p ${port}"`
done
IPADDRESS=`docker inspect ${id} -f '{{range .NetworkSettings.Networks}}{{.IPAMConfig.IPv4Address}}{{end}}'`
volumeList=""
for volume in `docker inspect ${id} -f '{{join .HostConfig.Binds "\n"}}'`; do
volumeList=`echo "${volumeList} -v ${volume}"`
done
envList=""
for env in `docker inspect ${id} --format='{{join .Config.Env "\n"}}'`; do
#环境变量需要双引号,这里s///只替换一次
env=`echo ${env} |sed 's/=/="/' |sed 's/$/"/'`
envList=`echo "${envList} -e ${env}"`
done
commandStr=`docker ps --no-trunc --format "table {{.Command}}" --filter id=${id} |grep -v "^COMMAND" |sed 's/.//' |sed 's/.$//'` #删除command首尾的字符
dockerRun="docker run --name ${containerName} -d ${postList} --net ${netName} --ip ${IPADDRESS} ${volumeList} ${envList} ${containerName} ${commandStr}"
echo $dockerRun
echo ""
done
~
ps: 未经过实际测试....