오브 콜스, Docker삣삐
안녕하세요. 오랜만에 새로운 글로 돌아온 개미핥기입니다 (믿기지 않겠지만 제 이름이랑 프사가 개미핥기 입니다)
최근에 일이 많고 프로젝트 배포도 하고... 좀 많이 바빠서 글을 쓸 시간이 없었습니다..
진짜 일은 안하고 월급만 받고싶다....
그래도 그 시간동안 새로운것도 많이 배우고 서비스를 배포하고 실사용자를 받아보며 많은 교훈을 얻게 되었습니다.
좀 정상적으로 돌아갈려면 얼마나 고쳐야할까요?
도커 스웜과 온프렘+클라우드를 합친 하이브리드형 구조로 서비스를 배포 했는데 생각보다 나쁘지 않더라구요. 실서비스에 대해서는 대충 이렇게 넘어가고..
오늘 글 주제인 Docker 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
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가 동작하는 방식이랑 무척 비슷하긴 합니다.
하여튼 그렇습니다.
다음에도 재미있고 유익한 글로 찾아뵙도록 노력하겠습니다