管理 Docker 容器的快捷脚本与经验分享
容器化技术极大地简化了工作流程,但同时也带来了一些挑战。例如,容器的依赖管理、数据持久化以及容器的启动和停止等问题都需要我们仔细处理。最近,在群里看到一些朋友在使用各种方法来管理自己的容器服务,也遇到了一些奇怪的问题,比如升级失败、数据丢失等。本文和大家简单探讨一下管理容器的一些小经验。
避坑经验
本文内容仅适用于个人开发者,大型容器集群管理不在本文讨论范围内。
- 资源管理:合理配置容器的资源限制(如 CPU 和内存)可以避免资源争用,确保系统的稳定运行。
- 数据备份:虽然容器化技术提供了数据持久化的解决方案,但定期备份数据仍然是一个好习惯,以防万一。
- 定期更新镜像:定期更新容器镜像是保持容器安全的重要步骤,防止被一些高危漏洞影响,导致不可挽回的损失。
- 监控和日志管理:可以使用 Prometheus 和 Grafana 进行监控,ELK Stack 进行日志管理。这样能帮助我们及时发现和解决问题,但这些工具对于个人开发者来说都很重,非必要不推荐。
简化管理
以下是一个简单的脚本,用于管理一个名为 discuz
的容器,读者可以将脚本保存到 /srv/discuz/docker
,并赋予执行权限。
- 数据持久化:将
/srv/discuz
中的三个子目录挂载到容器中,确保数据的持久化,避免数据丢失的问题。 - 安装:当执行
/srv/discuz/docker install
命令时,脚本会依次拉取最新的镜像、创建新容器。 - 更新:当执行
/srv/discuz/docker update
命令时,脚本会依次拉取最新的镜像、删除容器、创建新容器。 - 移除:当执行
/srv/discuz/docker remove
命令时,脚本会依次执行自定义命令、停止容器、强制删除容器。
#!/bin/sh
#
# @Author Rehiy <[email protected]>
# @Website https://www.rehiy.com/post/583/
#
APP_NAME=discuz
APP_FROM=rehiy/webox
# 资源限制
APP_CPU_LIMIT=2
APP_MEMORY_LIMIT=1g
# 数据目录
APP_PATH=$(cd `dirname $0`; pwd)
########################################################################
# 拉取镜像
if [ "$1" = "install" ] || [ "$1" = "update" ]; then
docker pull $APP_FROM
fi
# 删除容器,请根据业务情况改写
if [ "$1" = "remove" ] || [ "$1" = "update" ]; then
docker exec -it $APP_NAME wkit stop # 自定义命令
docker stop -t 600 $APP_NAME # 尽量优雅的停止
docker rm -f $APP_NAME
fi
# 创建容器,请根据业务情况改写
if [ "$1" = "install" ] || [ "$1" = "update" ]; then
docker run --name $APP_NAME -d \
--restart unless-stopped \
--cpus $APP_CPU_LIMIT \
--memory $APP_MEMORY_LIMIT \
--network host \
--volume $APP_PATH/etc:/var/config \
--volume $APP_PATH/htdoc:/var/www/default \
--volume $APP_PATH/mysql:/var/lib/mysql \
--env TZ=Asia/Shanghai \
$APP_FROM
fi
扩展使用
在 /srv/xxx/docker
目录下创建不同的脚本,可以方便地管理多个容器服务。数据也保存在不同的目录中,如果需要迁移到其他服务器时,只要将数据目录拷贝到新服务器即可。创建不同的服务时,请注意修改 APP_NAME
、APP_FROM
等变量,确保不同的服务不会互相冲突。
专业👍