分类
docker shell

shell脚本管理docker容器的打包与部署

之前文章中写到了容器的打包与部署。
所以再写一组shell文件,来更方便的管理docker容器。与教正规的记录部署命令。

shell文件的内容在最下面贴出

首先是打包
目前可以看到,容器和镜像已经存在,tar包还没有生成。

执行 ./pack.sh 脚本来生成tar包


tar文件已经全部生成

然后删除所有的容器和镜像,用刚刚打包的tar包进行部署。

执行 ./deploy.sh 文件

检查镜像和容器

这样就部署完了。

以下是两份shell文件的内容

./pack.sh # 打包

#!/bin/bash
# 这个脚本是用来打包docker环境的

# 设置要打包的容器,镜像,tar文件的名称
nginxConfig=("my_nginx" "my_nginx" "/dockerData/tar/my_nginx.tar")
mysqlConfig=("my_mysql" "my_mysql" "/dockerData/tar/my_mysql.tar")
phpConfig=("my_php5.6" "my_php5.6" "/dockerData/tar/my_php5.6.tar")

# 定义打包
makeTar(){
# 第一个元素是容器名称
containerName=${1}
# 第二个元素是要打包的镜像的名称
imageName=${2}
# 第三个元素是镜像要打包成tar文件的路径以及名称
tarPathName=${3}



# 获取容器的所属镜像的名称
#containerByImageName=$(docker ps -a | grep my_mysql | awk '{print $2}')
# 判断当前的容器
#if [$containerByImageName == $imageName] {
# search(q);
#}


# 执行容器提交
echo "容器$containerName正在提交镜像$imageName"
docker commit $containerName $imageName
echo "容器$containerName提交镜像$imageName完成"
# 执行进行打包
echo "镜像$imageName正在打包为$tarPathName"
docker save -o $tarPathName $imageName
echo "镜像$imageName打包$tarPathName完成"
}

makeTar ${nginxConfig[0]} ${nginxConfig[1]} ${nginxConfig[2]}
makeTar ${mysqlConfig[0]} ${mysqlConfig[1]} ${mysqlConfig[2]}
makeTar ${phpConfig[0]} ${phpConfig[1]} ${phpConfig[2]}

echo "全部环境打包完成,请到对应目录下获取tar包"

./deploy.sh 部署

#!/bin/bash
# 这个脚本是用来部署docker环境的


# 设置配置参数
# 端口
nginxPort=80
# tar包路径
nginxTar="/dockerData/tar/my_nginx.tar"
# 镜像名称
nginxImageName="my_nginx"
# 容器的启动名称
nginxCCMD="docker run -d -p $nginxPort:$nginxPort --name $nginxImageName -v /dockerData/nginx:/etc/nginx/conf.d -v /data:/data $nginxImageName"


mysqlPort=3306
mysqlTar="/dockerData/tar/my_mysql.tar"
mysqlImageName="my_mysql"
mysqlCCMD="docker run -d -p $mysqlPort:$mysqlPort -e MYSQL_ROOT_PASSWORD=root --name $mysqlImageName -v /dockerData/mysql/my.cnf:/etc/mysql/my.cnf -v /dockerData/mysql/db:/var/lib/mysql $mysqlImageName"


phpPort=9000
phpTar="/dockerData/tar/my_php5.6.tar"
phpImageName="my_php5.6"
phpCCMD="docker run -p $phpPort:$phpPort -d --name $phpImageName -v /data:/data $phpImageName"


echo "正在检查端口是否被docker以外的应用占用"

# 检查端口是否被非docker应用占用
checkPort(){
# 端口号
portNumber=${1}

# 检查端口是否被docker以外程序占用
portHas=$(netstat -nap | grep $portNumber | awk '{print $4}')

for var in $portHas
do
if [ $var == "0.0.0.0:$portNumber" ]
then
dockerPortHas=$(netstat -nap | grep $portNumber | grep docker |awk '{print $4}')
# 判断是否为Null
if [ -z $dockerPortHas ]
then
echo "端口$portNumber被非docker容器的应用占用,请手动关闭后从新执行脚本"
exit 1
fi
fi
done
return 1
}

checkPort $nginxPort
checkPort $mysqlPort
checkPort $phpPort
# checkPort 8087

echo "正在检查端口是否被docker应用占用"

# 检查docker运行的端口,并关闭
checkDockerPort(){
# 端口号
portNumber=${1}

# 检查端口是否被docker程序占用
dockerName=$(docker ps -a| grep $portNumber/tcp | awk '{print $2}')

# 是否存在dockerID 如果存在则停止和删除
if [ $dockerName ]
then
echo "发现容器$dockerName正在占用端口$portNumber,正在停止容器"
docker stop $dockerName
# docker rm $dockerName
fi
}

checkDockerPort $nginxPort
checkDockerPort $mysqlPort
checkDockerPort $phpPort

echo "正在检查是否有指定的docker容器已经启动"

# 检查 容器名称是否被占用
checkDockerName(){
# 容器名称
dockerName=${1}

# 检查是否存在指定名称的容器
dockerID=$(docker ps -a| grep $dockerName | awk '{print $1}')

# 是否存在dockerID 如果存在则停止和删除
if [ $dockerID ]
then
echo "发现指定容器$dockerName已经存在,正在对其关闭与删除"
docker stop $dockerName
docker rm $dockerName
fi
}

checkDockerName $nginxImageName
checkDockerName $mysqlImageName
checkDockerName $phpImageName

echo "开始加载镜像与启动容器"

# 加载镜像与启动容器
makeImageAndContainer(){
# 第一个元素tar文件
tarPathName=${1}
# 第二个元素是要load的镜像
imageName=${2}
# 第三个元素启动容器的命令
containerCMD=${3}

# 从tar包恢复成镜像
echo "正在加载tar文件$tarPathName";
docker load -i $tarPathName
# 执行容器部署
echo "正在启动容器$imageName。启动命令:$containerCMD";
$containerCMD
}

makeImageAndContainer $nginxTar $nginxImageName "$nginxCCMD"
makeImageAndContainer $mysqlTar $mysqlImageName "$mysqlCCMD"
makeImageAndContainer $phpTar $phpImageName "$phpCCMD"


echo "执行完成"

发表评论

邮箱地址不会被公开。 必填项已用*标注