提问人:Nathan Smeltzer 提问时间:11/8/2023 最后编辑:Nathan Smeltzer 更新时间:11/9/2023 访问量:28
Docker overlay2 目录随每次构建而增长(零停机时间 docker compose 部署)
Docker overlay2 directory growing with each build (zero downtime docker compose deployment)
问:
问题:
主机的 /var/lib/docker/overlay2 目录会随着每次构建而不断增长,直到我被迫停止容器并运行以释放空间。这是 overlay2 目录的 ncdu 在 2 或 3 次部署/构建后(还有许多其他目录,但它们被切断了):docker system prune -af
我的零停机部署脚本使一组容器始终保持运行。
脚本如下:
# sources:
# https://www.atlantic.net/vps-hosting/how-to-update-docker-container-with-zero-downtime/
old_container=$(docker container ls --filter name=shipaware-django-* --filter status=running --latest | grep -o shipaware-django-[0-9].*)
old_listener=$(docker container ls --filter name=shipaware-listener-* --filter status=running --latest | grep -o shipaware-listener-[0-9].*)
# need to restart celery in case of new tasks
old_celeryworker=$(docker container ls --filter name=shipaware-celeryworker-* --filter status=running --latest | grep -o shipaware-celeryworker-[0-9].*)
old_celerybeat=$(docker container ls --filter name=shipaware-celerybeat-* --filter status=running --latest | grep -o shipaware-celerybeat-[0-9].*)
echo "old_container: $old_container"
docker compose -f production.yml up -d --scale django=2 --scale listener=2 --scale celeryworker=2 --scale celerybeat=2 --no-recreate --build
echo "scaled up django and listener to 2 containers"
echo "sleeping 60s"
sleep 60
docker container stop $old_container
docker container stop $old_listener
docker container stop $old_celeryworker
docker container stop $old_celerybeat
echo "stopped $old_container"
docker container rm $old_container
docker container rm $old_listener
docker container rm $old_celeryworker
docker container rm $old_celerybeat
echo "removed $old_container"
docker compose -f production.yml up -d --scale django=1 --scale listener=1 --scale celeryworker=1 --scale celerybeat=1 --no-recreate
echo "scaled back down to 1 container"
下面是应用程序服务器的production.yml docker compose 文件(数据库在单独的服务器上运行):
version: '3.8'
volumes:
production_traefik: { }
x-django: &django
depends_on:
- redis
build:
context: .
dockerfile: ./compose/production/django/Dockerfile
target: django
volumes:
# needed for nginx to access the project's static files
- ./staticfiles:/app/staticfiles
restart: unless-stopped
services:
django:
<<: *django
image: shipaware_django_production_django
command:
- /start
listener:
<<: *django
depends_on:
- django
build:
context: .
dockerfile: ./compose/production/django/Dockerfile
target: listener
image: shipaware_django_production_listener
nginx: # https://stackoverflow.com/a/51903852/2469390
image: nginx:1.25-alpine
depends_on:
- django
volumes:
- ./default.conf:/etc/nginx/conf.d/default.conf
- ./staticfiles:/static
selenium:
image: selenium/standalone-chrome
expose:
- 44444
restart: unless-stopped
redis:
image: redis:6
restart: unless-stopped
celeryworker:
<<: *django
image: shipaware_django_production_celeryworker
command: /start-celeryworker
celerybeat:
<<: *django
image: shipaware_django_production_celerybeat
command: /start-celerybeat
traefik:
build:
context: .
dockerfile: ./compose/production/traefik/Dockerfile
image: shipaware_django_production_traefik
depends_on:
- django
volumes:
- production_traefik:/etc/traefik/acme:z
ports:
- "0.0.0.0:80:80"
- "0.0.0.0:443:443"
restart: unless-stopped
临时解决方案
在周末的凌晨运行另一个脚本以停止所有容器,运行 ,然后重新启动容器。这会导致几分钟的停机时间。docker system prune -af
我的问题:
我对 docker 的理解或它在单个应用程序服务器上进行零停机部署而不会最终耗尽主机上的磁盘空间的能力遇到了困难。
只需一台 dockerized 应用程序服务器,是否可以在不停机的情况下防止 overlay2 的磁盘空间蠕变?或者我需要运行第二台服务器。
如果答案是其他服务器,那么在我当前的设置(蓝绿部署、负载均衡器等)下,最佳方法是什么?
答: 暂无答案
评论