도커 삽질 기록
회사에서 로컬로 테스트를 진행할 때, 준비되어야 할 서버(DB, nginx 등)가 많아서 도커로 관리하고 있었다.
이번에 파이썬으로 실행하는 프로그램도 하나 추가돼서,
원래는 도커를 켜 주고 파이썬은 로컬 컴퓨터에서 파이참으로 프로그램을 켜야 했다.
파이썬 서버를 기존 도커 서비스에 추가해서 합쳐 만들려고 했다!
1. 우분투 이미지를 가져와서 생성한 컨테이너에,
rabbitMQ와 파이썬을 설치하고 프로그램을 실행하는 이미지를 .tar로 추출해서
기존에 세팅된 서버 도커에 이미지로 불러와 함께 실행
이미지, 컨테이너, 도커파일, docker-compose 등이 뭔지 도커에 대해 기본적인 정보를 익힌 후
Dockerfile을 만들기 시작했다.
우분투 컨테이너를 베이스로 시작함
rabbitMQ설치와 파이썬 설치하는데 rabbitMQ 서버가 안 켜짐
켜지긴 하는데 켜지자마자 에러로 강제 종료되어서 컨테이너까지 종료된다.
뭔가 dependency 문제 아닌가 싶은데.. 내가 선택한 이미지가 경량화가 된 버전인지
systemctl, nano 등 기본적으로 깔려있을거라고 기대한 것도 다 apt-get으로 추가해줘야 했다.
아무튼 rabbitMQ 서버가 제대로 켜져 있어야 파이썬 프로그램이 실행가능한데..
이렇게 삽질을 몇시간동안 하다.. rabbitMQ 이미지가 애초에 우분투 기반이라는 걸 알게 됐다!
그럼 굳이 우분투 이미지부터 들어갈 필요가 없어진다...
2. rabbitMQ 이미지를 기반으로 컨테이너를 만들고, 그 컨테이너에 파이썬을 설치
뭐가 원인인지는 결국 파악하지 못했으나 rabbitMQ 서버가 켜지고 나서 파이썬을 실행시켜야 하는데 안된다!
알고 보니, rabbitMQ 서버가 완전히 켜진 다음에 파이썬을 실행해야 하는데 그렇게 타이밍을 조정할 수가 없다!
게다가 CMD는 하나의 도커파일에서 하나만 실행가능하다. 다른건 무시된다. (뭐가 우선인지는 조사필요)
1) CMD로 rabbitMQ 서버를 켜고 + 파이썬 프로그램을 실행
=> 서버를 켜고 나서는 꺼질때까지 해당 커맨드가 완료된 게 아니기 때문에 파이썬 프로그램을 실행하지 않음
2) 파이썬 프로그램을 먼저 실행하고 + rabbitMQ 서버를 켜기
=> 서버가 켜지기 전에는 파이썬 프로그램이 실행되지 않음
3) rabbitMQ 서버가 켜졌는지 아닌지를 계속 확인하면서 서버가 켜진 걸 확인하면 파이썬을 켜도록 쉘스크립트를 작성
=> 마찬가지. 서버 ON/OFF를 확인하는 프로세스가 안끝나니까 rabbitMQ 서버를 시작하는 코드까지 가지 못함
파이썬 코드를 수정하면 어땠을까 싶지만 그렇게 하면 일이 너무 커져서 차마 시도하지 못했다..
4) 서비스파일을 만들어서 쉘스크립트로 실행
=> 마찬가지...
[Unit]
Description=Test Service
After=network.target
[Service]
WorkingDirectory=/work-system
ExecStart=nohup /usr/bin/python3 test.py > /dev/null 2>&1 &
[Install]
WantedBy=multi-user.target
#!/bin/bash
sleep 5
systemctl daemon-reload
service test start
rabbitmq-server
3. 파이썬 이미지를 따로 뺀 후 컨테이너끼리 실행 순서 조정
결국~ rabbitMQ 안에 파이썬을 설치해서 실행하는건 포기하고,
파이썬 컨테이너를 하나 추가해서 별도로 돌리기로 결정했다.
실행은.. 되는데.. 어떨 땐 되고 어떨 땐 안 되는 현상이 발생했다. (주로 안 되는 경우가 많음)
아 맞다. rabbitMQ가 켜지기 전에 파이썬이 시작돼버리면 안됐지. 싶었다.
그래서 컨테이너끼리 실행 순서를 정해줄 수 없나 찾아보던 중,
docker-compose.yml에서 지정할 수 있는 healthcheck와 depends_on을 발견했다.
간단하게 설명하면, depends_on은 어떤 특정 서비스의 상태에 의존하여 실행 시점을 조정할 수 있는 속성이다.
healthcheck는 어떤 명령어를 특정 간격으로 실행하여 그 명령어의 성공실패 여부에 따라 해당 서비스의 health를 판단한다.
이 두 가지를 이용하면 rabbitMQ 서버가 제대로 켜진 후에 파이썬이 켜지게 할 수 있다!!
version: '3.8'
services:
python:
depends_on:
rabbitMQ:
condition: service_healthy #rabbitMQ가 healthy할때...
rabbitMQ:
healthcheck:
test: rabbitmq-server status # 어떤 명령어를 실행할지
interval: 5s # 몇 초에 한 번 확인할지
timeout: 30s # 몇 초 이후에 타임아웃 처리할지
retries: 3 # 몇 번 재시도할지
정확히 위와 같이 세팅한 건 아니라 그대로 실행하면 안 될지도...
이렇게 하니 의도대로 rabbitMQ 서버가 켜지고 상태도 확인가능해졌을 때 파이썬을 정상적으로 켤 수 있게 됐다!!
하지만 결국 도커를 매번 올릴 때마다..
파이썬과 관련 패키지를 설치하는 데 시간이 너무 소요돼서 별도의 프로그램으로 빼기로 결정됐다. :9
그렇게 만든 프로그램도 쉽지는 않았다...
내부 로직은 이미 완성돼있었는데 PySide6라는 아예 처음 겪어보는 패키지로 클라이언트를 만들어보는거라...
그건 언젠가 따로 또 정리해 보는 걸로 :>
참고
https://jupiny.com/2016/11/13/conrtrol-container-startup-order-in-compose/
https://medium.com/@saklani1408/configuring-healthcheck-in-docker-compose-3fa6439ee280
'웹 > Docker' 카테고리의 다른 글
도커(Docker) 기본개념 (0) | 2024.03.12 |
---|