티스토리 뷰
홈서버나 개인 프로젝트에 도커 컨테이너를 여러 개 띄워두면 이미지 업데이트를 챙기는 게 일이 된다. 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로 알림만 받는 것을 권한다
'개발 > Etc' 카테고리의 다른 글
| OpenAPI 문서와 실제 API가 어긋날 때 먼저 잡을 기준 (0) | 2026.08.06 |
|---|---|
| JetBrains IDE 한글 언어팩이 안 먹을 때, 설정 위치가 바뀌었다 (0) | 2024.09.26 |
| 맥에서 사진 EXIF 날짜·위치 일괄 변경하기 (ExifTool) (0) | 2024.08.24 |
| 헷갈리는 HTML 태그 정리, em과 i는 무엇이 다른가 (0) | 2024.03.30 |
| JetBrains Translation 플러그인에 DeepL 한국어 API 기여한 이야기 (0) | 2023.11.01 |
