......Watchtower, 거기 있어?

peterTheAnteater·2025년 3월 7일
9

데브옵스

목록 보기
13/18

오브 콜스, Docker삣삐

글을 쓰게 된 동기

안녕하세요. 오랜만에 새로운 글로 돌아온 개미핥기입니다 (믿기지 않겠지만 제 이름이랑 프사가 개미핥기 입니다)

최근에 일이 많고 프로젝트 배포도 하고... 좀 많이 바빠서 글을 쓸 시간이 없었습니다..

진짜 일은 안하고 월급만 받고싶다....

그래도 그 시간동안 새로운것도 많이 배우고 서비스를 배포하고 실사용자를 받아보며 많은 교훈을 얻게 되었습니다.

좀 정상적으로 돌아갈려면 얼마나 고쳐야할까요?

도커 스웜과 온프렘+클라우드를 합친 하이브리드형 구조로 서비스를 배포 했는데 생각보다 나쁘지 않더라구요. 실서비스에 대해서는 대충 이렇게 넘어가고..

오늘 글 주제인 Docker WatchTower에 대해서 좀 이제 써봅겠습니다.

Watchtower?

깃허브

워치타워는 제가 이번에 클러스팅을 하지 않은 노드에서 컨테이너들을 배포하고 업데이트 할때 사용한 툴입니다.
일부러 클러스터링을 안한건 아니고 맥 미니를 서버로 굴릴려고 했는데 맥은 스웜이나 쿠버네티스로 멀티 노드 클러스터링이 안됩니다

사실 이 친구들 작은 서비스/서버 혹은 개발환경에서 쓰기 좋은 툴이지 회사에서 프로덕션에서 사용할만한 친구는 아닙니다.

하지만 저희 같이 작은 서비스 한두개 정도 업데이트를 하고 배포 할때는 충분히 쓸만합니다.

워치타워를 직역하자면 감시초소 정도로 번역을 할수 있는데 컨테이너들을 감시 한다고 생각하시면 됩니다.

이 툴에 목적은 배포되어 있는 이미지의 새로운 버젼이 올라오면 그 이미지로 자동 업데이트 해주는 역활입니다.

이게 뭔뜻이냐면요.. 예를 들어서 아래와 같이 제가 도커로 서비스를 배포 했다고 합시다. (docker compose up)

services:
  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
      - "3000:3000"

보시다 싶이 저는 지금 latest태그가 붙어있는 이미지를 사용하고 있습니다.

하지만 도커 허브에 grafana:latest이미지가 새로 업데이트 된다고 해도 제가 이미 사용하고 있는 그라파나는 새로운 이미지로 업데이트 되지 않습니다.

즉 제가 사용하는 이미지는 latest이지만 사실 latest가 아닌겁니다. (?)

새로운 latest를 사용하시고 싶으시면 docker pull또는 docker compose pull을 통해 새로운 이미지를 받아주고 다시 docker run 또는 docker compose up를 해줘야 새로운 latest로 업데이트 됩니다.

하지만 워치타워는 이런 문제를 해결해줍니다. 특정 이미지가 새로운 이미지로 업데이트 되면 바로 교체 해줍니다.

그러면 어떻게 사용하면 되는지 한번 알아봅시다.

사용법

일단 도커 컴포즈를 기반으로 하도록 하겠습니다.

services:
  watchtower:
    image: containrrr/watchtower
    container_name: watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    command: test-container --interval 60 --cleanup --include-stopped
  
  test-container:
    image: teami2022/watchtower-test:latest
    container_name: test-container
    ports:
      - 8080:8080

watchtower서비스가 워치타워 컨테이너를 띄운거고 아래 test-container는 제가 테스트용으로 만들어둔 도커 허브 레포 입니다.

한번 설명을 해보도록 하겠습니다
image: containrrr/watchtower

  • 위 줄은 워치타워 이미지를 명시한 줄이고

container_name: watchtower

  • 컨테이너 이름을 부여해주는 줄입니다

volumes: - /var/run/docker.sock:/var/run/docker.sock

  • 도커 컨테이너를 멈추고 올리고 등등을 해야하기 때문에 도커를 조종할수 있도록 docker.sock을 마운팅 해줍니다. (이거 없으면 워치타워가 도커를 조종할수 없습니다)

command: test-container --interval 60 --cleanup --include-stopped

  • 이 커맨드도 중요합니다. 일단 test-container는 제가 "감시"를 하고싶은 컨테이너 이름을 명시한거고
  • --interval 60은 60초 (1분)에 한번씩 도커 허브에 새로운 이미지가 올라와있는지 확인 하라는 커맨드고
  • --cleanup은 내려간 이미지는 이미지를 삭제 해서 시스템 디스크를 비우는거고 (docker image prune, docker image rm <이미지 이름> 을 자동으로 해주는거라고 생각하시면 편합니다)
  • --include-stopped는 멈춘 컨테이너도 만약에 새로운 버젼이 올라오면 바꿔달라는 뜻입니다. 만약에 새로운 이미지를 푸시 했는데 그 이미지가 잘못되어서 서비스가 멈춰도 새로운 이미지를 바로 푸시 하시면 새로운 버젼으로 바꿔서 다시 돌아갈수 있도록 해줍니다

그리고 아래

test-container:
    image: teami2022/watchtower-test:latest
    container_name: test-container
    ports:
      - 8080:8080

는 그냥 기본적인 (8080 포트 들어가면 "Hello World" 나옵니다) 고 언어 기반 서버가 올라가있는 이미지를 사용한 컨테이너입니다.

확인 해보기

일단 docker compose up -d로 한번 올려봤습니다.

지금 상태에서 watchtower로그를 확인 하면 이렇게 뜹니다.

test-container라는 이름을 가진 컨테이너만 확인한다고 뜨고 1분에 한번씩 1개를 스캔 했다고 뜹니다 (Scanned=1)

한번 8080 을 들어가보면

정상적으로 돌아갑니다.

한번 이걸 "Hello, Docker Watchtower!
"로 바꿔서 이미지를 빌드해서 올려보도록 하겠습니다

새로운 이미지를 만들어서 허브에 올리니 워치타워가 알아서 감지를 해서 컨테이너를 새로 만들고 업데이트 해줬습니다. (updated=1)

한번 접속을 해보면

잘 된거 같습니다.

단점

워치타워가 완벽한건 아닙니다.

일단 인터벌을 저는 3600초 (1시간)으로 해뒀긴 하지만 너무 자주 스캐닝을 하면 램/cpu에 무리가 조금 갈수도 있습니다. 물론 많은 사용량은 아니지만 그럴수도 있어요.

그리고 애초에 무중단 배포가 가능한 구조는 아닙니다. 물론 가능은 할수 있겠지만 좀 많이 복잡할겁니다.

그리고 사실 비슷하지만 더 좋은 툴도 존재합니다.

바로 Whats up Docker 라는 친구인데 확실히 더 사용하기도 좋고 기능도 많습니다.

물론 저는 그냥 대충 간단하게 사용하려고 워치타워를 자주 사용합니다.

결론

Watchtower는 간단하게 구성할수 있는 Continuous Deployment (CD)툴입니다.
당연히 완벽하지 않고 프로덕션 환경에서 사용하기 좋은 방법은 아닙니다....만

근데 에초에 대부분 프로덕션 환경에서는 쿠버네티스 쓰지 않나요?

만약에 프로덕션에서 이 툴을 사용하면 그 회사 탈출 하세요

물론 인터벌을 기반으로 소스를 확인해서 업데이트 하는 방식은 argoCD가 동작하는 방식이랑 무척 비슷하긴 합니다.

하여튼 그렇습니다.

다음에도 재미있고 유익한 글로 찾아뵙도록 노력하겠습니다

profile
소프트웨어 개발과 밀당하는 개발자

0개의 댓글