背景
我们的web服务是用python写的,跑在 docker container 里面,并且用docker-compose 来管理。
用bash来生成docker-compose.yml文件
将 docker-compose 的每个 service 写到单独的文件里面。
文件 web/server1
server1:
image: xxx-server:server1
ports:
- 8080:8080
文件 web/server2
server2:
image: xxx-server:server2
ports:
- 8081:8080
bash 生成 docker-compose.yml
文件 build.sh
OUTPUT=docker-compose.yml
WEB=(
web/server1
web/server2
)
merge_files() {
FILES=$@
for F in ${FILES[@]}; do
cat "${F}" >> ${OUTPUT}
done
}
cat > ${OUTPUT} <<EOF
version: "3.6"
services:
EOF
merge_files ${WEB[@]}
禁用和启用服务
可以通过注释server1来禁用server1,注释server2来禁用server2
通过去除注释server1来启用server1,去除注释server2来启用server2
文件 utils.sh
enable_service() {
service=$1
sed -i 's/#*//' ${service}
}
disable_service() {
service=$1
sed -i 's/^\([^#]*\)/#\1/' ${service}
}
nginx 添加或移除服务
通过upstream可以方便添加或移除服务
配置 upstream
upstream server {
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
# server 127.0.0.1:8081 max_fails=3 fail_timeout=30s;
}
添加或移除服务
文件 utils.sh
NGING_CONF=/etc/nginx/conf.d/yisite.conf
disable_port() {
port=$1
sed -i "s/^ server 127.0.0.1:${port}/ # server 127.0.0.1:${port}/" ${NGING_CONF}
}
enable_port() {
port=$1
sed -i "s/^ # server 127.0.0.1:${port}/ server 127.0.0.1:${port}/" ${NGING_CONF}
}
启用脚本
整合启用服务docker-compose.yml 和 nginx 配置文件
#!/usr/bin/env bash
. utils.sh
SERVER=${1:-serverall}
if [ "${SERVER}" == "server1" ]; then
enable_service web/server1
enable_port 8080
elif [ "${SERVER}" == "server2" ]; then
enable_service web/server2
enable_port 8081
elif [ "${SERVER}" == "serverall" ]; then
enable_service web/server1
enable_port 8080
enable_service web/server2
enable_port 8081
fi
./build.sh
禁用服务脚本
整合禁用服务docker-compose.yml 和 nginx 配置文件
文件 disable.sh
#!/usr/bin/env bash
. utils.sh
SERVER=${1}
if [ "${SERVER}" == "server1" ]; then
disable_service web/server1
disable_port 8080
./build.sh
nginx -t || exit 1
nginx -s reload
elif [ "${SERVER}" == "server2" ]; then
disable_service server2
disable_port 8081
./build.sh
nginx -t || exit 1
nginx -s reload
else
echo "disable.sh server1|server2"
fi
便捷启动脚本
将docker-compose启动和nginx重启整合在一起
#!/usr/bin/env bash
docker-compose up -d --remove-orphans
nginx -t || exit 1
nginx -s reload
来实际操作
假设现在运行的是 server1
- 启用 server2
./enable.sh server2
- 运行便捷启动脚本
./start.sh
-
查看 server2 的日志,如果没有问题进入第 6 步
-
关闭 server2
./disable.sh server2
- 进入第一步
- 禁用 server1
./disable.sh server1
- 查看 server1, 等到没有新的请求
- 运行便捷启动脚本移除 server1
./start.sh
- 到此服务器便完成更新
网友评论