티스토리 뷰

홈서버나 개인 프로젝트에 도커 컨테이너를 여러 개 띄워두면 이미지 업데이트를 챙기는 게 일이 된다. docker pull 하고 컨테이너 지우고 다시 띄우는 걸 컨테이너 수만큼 반복해야 한다.

이걸 자동으로 해주는 게 Watchtower다.

실행

docker run -d \
  --name=watchtower \
  -e TZ=Asia/Seoul \
  -v /var/run/docker.sock:/var/run/docker.sock \
  --restart=always \
  containrrr/watchtower --cleanup

각 옵션의 의미는 이렇다.

  • -v /var/run/docker.sock:/var/run/docker.sock : 호스트의 도커 소켓을 마운트해서 다른 컨테이너를 제어할 수 있게 한다. Watchtower 동작의 핵심이다.
  • --cleanup : 업데이트 후 낡은 이미지를 삭제한다. 이걸 빼면 dangling 이미지가 계속 쌓여 디스크를 잡아먹는다.
  • --restart=always : 호스트 재부팅 후에도 Watchtower가 자동으로 뜬다.
  • -e TZ=Asia/Seoul : 로그 시각과 스케줄 기준 시간대.

기본 주기는 24시간이다. 실행하면 등록된 모든 컨테이너의 이미지를 주기적으로 확인해서 새 버전이 있으면 pull 받고 같은 옵션으로 재생성한다.

docker-compose로 쓰기

services:
  watchtower:
    image: containrrr/watchtower
    container_name: watchtower
    restart: always
    environment:
      - TZ=Asia/Seoul
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_SCHEDULE=0 0 4 * * *   # 매일 새벽 4시
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

WATCHTOWER_SCHEDULE은 6자리 cron 형식이다. 맨 앞이 초 단위라는 점만 주의하면 된다. 새벽 시간대로 잡아두면 재시작 순간의 다운타임이 덜 거슬린다.

특정 컨테이너만 대상으로 하기

전부 자동 업데이트하는 게 부담스러우면 대상을 좁힐 수 있다. 두 가지 방식이 있다.

1. 이름으로 지정

docker run -d --name watchtower \
  -v /var/run/docker.sock:/var/run/docker.sock \
  containrrr/watchtower --cleanup nginx redis

2. 라벨 기반 (권장)

services:
  watchtower:
    image: containrrr/watchtower
    environment:
      - WATCHTOWER_LABEL_ENABLE=true
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

  myapp:
    image: myapp:latest
    labels:
      - "com.centurylinklabs.watchtower.enable=true"

라벨 방식이 관리하기 좋다. 새 서비스를 추가할 때 Watchtower 설정을 건드릴 필요 없이 라벨만 붙이면 된다. 반대로 특정 컨테이너만 제외하려면 enable=false를 붙인다.

알림 붙이기

자동으로 돌아가는 만큼 무엇이 언제 업데이트됐는지는 알아야 한다.

environment:
  - WATCHTOWER_NOTIFICATIONS=shoutrrr
  - WATCHTOWER_NOTIFICATION_URL=slack://token@channel
  - WATCHTOWER_NOTIFICATIONS_LEVEL=info

shoutrrr를 통해 Slack, Discord, Telegram, 이메일 등을 지원한다. 업데이트 알림이 오면 그때 해당 서비스가 정상인지 한 번 확인하는 습관을 들이면 좋다.

운영 환경에서 조심할 점

여기가 중요하다. Watchtower는 편하지만 운영 서비스에 그대로 쓰기에는 위험하다.

  • latest 태그는 언제 무엇이 바뀔지 모른다. 메이저 버전이 올라가면서 breaking change가 들어와도 그대로 받아버린다. 자고 일어나면 서비스가 죽어 있을 수 있다.
  • 도커 소켓 마운트는 사실상 호스트 루트 권한이다. Watchtower 컨테이너가 뚫리면 호스트 전체가 뚫린다. 인터넷에 노출된 서버라면 신중해야 한다.
  • 재시작 순간 다운타임이 생긴다. 컨테이너를 지우고 다시 만드는 방식이라 무중단이 아니다.
  • 롤백이 자동이 아니다. 새 이미지가 문제여도 알아서 되돌리지 않는다.

그래서 나는 이렇게 나눠서 쓴다.

환경 방식
홈서버, 개인 프로젝트 Watchtower 자동 업데이트
사내 도구, 스테이징 Watchtower + 알림, 태그는 마이너 고정
운영 서비스 CI/CD 파이프라인에서 명시적 배포

알림만 받고 업데이트는 수동으로

절충안도 있다. 새 이미지가 있는지 확인만 하고 실제 업데이트는 안 하도록 설정할 수 있다.

environment:
  - WATCHTOWER_MONITOR_ONLY=true

이러면 "새 버전 나왔다"는 알림만 오고 컨테이너는 그대로 둔다. 운영 환경에서는 이 모드가 현실적이다.

정리

  • Watchtower는 도커 소켓을 마운트해서 다른 컨테이너를 자동 갱신한다
  • --cleanup을 빼면 낡은 이미지가 디스크에 쌓인다
  • 대상 지정은 라벨 방식이 관리하기 좋다
  • latest 자동 업데이트는 운영에서 위험하다
  • 도커 소켓 마운트 = 사실상 호스트 루트 권한
  • 운영이라면 WATCHTOWER_MONITOR_ONLY=true로 알림만 받는 것을 권한다
댓글


최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday