Docker overlay2 目录随每次构建而增长(零停机时间 docker compose 部署)

Docker overlay2 directory growing with each build (zero downtime docker compose deployment)

提问人:Nathan Smeltzer 提问时间:11/8/2023 最后编辑:Nathan Smeltzer 更新时间:11/9/2023 访问量:28

问:

问题:

主机的 /var/lib/docker/overlay2 目录会随着每次构建而不断增长,直到我被迫停止容器并运行以释放空间。这是 overlay2 目录的 ncdu 在 2 或 3 次部署/构建后(还有许多其他目录,但它们被切断了):docker system prune -af

enter image description here

我的零停机部署脚本使一组容器始终保持运行。

脚本如下:

# 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 的磁盘空间蠕变?或者我需要运行第二台服务器。

如果答案是其他服务器,那么在我当前的设置(蓝绿部署、负载均衡器等)下,最佳方法是什么?

django linux bash docker-compose

评论


答: 暂无答案