티스토리 뷰
목차
현재 web과 db 컨테이너가 설정된 환경에서, Python 데몬을 운영하는 새로운 Docker 컨테이너를 추가하려고 합니다. 이 Python 데몬은 30초마다 MySQL test 테이블의 행(row) 수를 확인하는 역할을 수행할 것입니다. 프로젝트 루트 디렉토리 구조도 포함해서 순차적으로 설명드릴게요.
1단계: 프로젝트 디렉토리 구조
현재 프로젝트 루트 디렉토리는 아래와 같이 구성되어 있습니다.
apache-mysql-docker/
│
├── Dockerfile # Apache 웹 서버용 Dockerfile
├── db/ # MySQL 데이터베이스 설정용 디렉토리
│ └── Dockerfile # MySQL Dockerfile
├── html/ # Apache 서버에 배포할 HTML 파일
│ └── index.html # 간단한 HTML 파일
├── docker-compose.yml # Docker Compose 파일
└── daemon/ # Python 데몬을 위한 디렉토리
├── Dockerfile # Python 데몬 컨테이너를 위한 Dockerfile
└── count_rows.py # Python 스크립트
2단계: Python 프로그램 작성하기
먼저, Python 데몬 프로그램을 작성합니다. apache-mysql-docker/daemon/ 디렉토리를 생성하고, 그 안에 count_rows.py 파일을 작성합니다.
daemon/count_rows.py
import time
import mysql.connector
from mysql.connector import Error
# MySQL에 연결하기 위한 설정
db_config = {
'user': 'myuser',
'password': 'myuser_password',
'host': 'db', # Docker Compose에서 MySQL 컨테이너의 서비스 이름
'database': 'mydb',
}
def log_message(message):
"""상태를 콘솔에 출력하는 함수."""
print(f"[INFO] {time.strftime('%Y-%m-%d %H:%M:%S')} - {message}", flush=True)
def count_rows():
connection = None
try:
log_message("Attempting to connect to MySQL...")
# MySQL 연결 시도
connection = mysql.connector.connect(**db_config)
if connection.is_connected():
log_message("Successfully connected to MySQL")
cursor = connection.cursor()
# 테이블의 row 수를 확인하는 SQL 쿼리 실행
log_message("Executing query: SELECT COUNT(*) FROM test")
cursor.execute("SELECT COUNT(*) FROM test")
row_count = cursor.fetchone()[0]
log_message(f"Row count: {row_count}")
else:
log_message("Failed to connect to MySQL")
except Error as err:
log_message(f"Error while connecting to MySQL: {err}")
finally:
if connection and connection.is_connected():
log_message("Closing MySQL connection")
cursor.close()
connection.close()
else:
log_message("MySQL connection was not established")
if __name__ == "__main__":
log_message("Starting Python daemon")
# MySQL 서버에 연결을 반복적으로 시도
while True:
try:
count_rows()
except Error as e:
log_message(f"Retrying in 5 seconds... Error: {e}")
time.sleep(5) # 연결 실패 시 5초 후 재시도
log_message("Sleeping for 30 seconds before the next query")
time.sleep(30) # 30초마다 실행
이 Python 프로그램은 MySQL test 테이블의 행 수를 30초마다 출력하는 간단한 데몬입니다. host로 db를 지정하여 MySQL 컨테이너와 연결할 수 있습니다.
3단계: Python Dockerfile 작성하기
이제 이 Python 프로그램을 실행할 Docker 이미지를 빌드하기 위해 Dockerfile을 작성합니다. apache-mysql-docker/daemon/ 디렉토리 내에 Dockerfile을 생성합니다.
daemon/Dockerfile
# Python 3.9 slim 베이스 이미지 사용
FROM python:3.9-slim
# 작업 디렉토리 설정
WORKDIR /app
# Python 프로그램 복사
COPY count_rows.py .
# MySQL 커넥터 설치
RUN pip install mysql-connector-python
# Python 스크립트 실행
CMD ["python", "count_rows.py"]
이 Dockerfile은 Python 3.9 slim 이미지를 기반으로 MySQL과 통신하기 위한 mysql-connector-python 패키지를 설치한 뒤, Python 스크립트를 실행하는 설정입니다.
4단계: Docker Compose에 Python 데몬 컨테이너 추가
이제 docker-compose.yml 파일에 새로운 Python 데몬 컨테이너를 추가합니다. docker-compose.yml 파일은 이미 web과 db 서비스가 설정되어 있는 상태입니다.
docker-compose.yml
version: '3.8'
services:
web:
build: .
ports:
- "8080:80"
depends_on:
- db
networks:
- webnet
db:
build: ./db
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_DATABASE: mydb
MYSQL_USER: myuser
MYSQL_PASSWORD: myuser_password
ports:
- "3306:3306"
volumes:
- dbdata:/var/lib/mysql
networks:
- webnet
python-daemon:
build: ./daemon # Python 데몬 Dockerfile이 위치한 디렉토리
depends_on:
- db # db 서비스가 준비된 후 실행
networks:
- webnet # 같은 네트워크에 연결
volumes:
dbdata:
networks:
webnet:
이 설정에서는 python-daemon이라는 새로운 서비스를 추가했습니다. build 옵션에서 ./daemon 디렉토리 내에 있는 Dockerfile을 사용해 Python 데몬 컨테이너를 빌드하고, depends_on 옵션으로 MySQL이 준비된 후에 실행되도록 설정했습니다.
5단계: Docker 컨테이너 빌드 및 실행
이제 모든 설정이 완료되었으므로, docker-compose를 사용하여 컨테이너를 빌드하고 실행합니다.
docker-compose up --build
이 명령어는 docker-compose.yml에 정의된 모든 서비스를 빌드하고 실행합니다.
- web: Apache 웹 서버 컨테이너
- db: MySQL 데이터베이스 컨테이너
- python-daemon: Python 데몬 컨테이너 (30초마다 MySQL 테이블의 행 수를 출력)
6단계: Python 데몬 로그 확인
Python 데몬 컨테이너가 제대로 동작하는지 확인하기 위해 로그를 확인합니다.
docker-compose logs -f python-daemon
이 명령어를 실행하면 Python 데몬 컨테이너의 로그를 실시간으로 확인할 수 있습니다. 30초마다 test 테이블의 행 수가 출력됩니다.
7단계: 컨테이너 종료 및 정리
모든 컨테이너를 중지하고 정리하려면 다음 명령어를 사용합니다.
docker-compose down
이 명령어는 현재 실행 중인 모든 컨테이너와 네트워크를 중지하고 삭제합니다.
최종 디렉토리 구조
apache-mysql-docker/
│
├── Dockerfile # Apache 웹 서버용 Dockerfile
├── db/ # MySQL 데이터베이스 설정용 디렉토리
│ └── Dockerfile # MySQL Dockerfile
├── html/ # Apache 서버에 배포할 HTML 파일
│ └── index.html # 간단한 HTML 파일
├── docker-compose.yml # Docker Compose 파일
└── daemon/ # Python 데몬을 위한 디렉토리
├── Dockerfile # Python 데몬 컨테이너를 위한 Dockerfile
└── count_rows.py # Python 스크립트
요약
- Python 데몬 작성: MySQL test 테이블의 행 수를 30초마다 확인하는 Python 프로그램을 작성했습니다.
- Python Dockerfile 작성: Python 프로그램을 실행할 Docker 이미지를 만들기 위한 Dockerfile을 작성했습니다.
- Docker Compose 설정: docker-compose.yml 파일에 새로운 Python 데몬 컨테이너를 추가했습니다.
- Docker Compose 빌드 및 실행: docker-compose up --build 명령어로 모든 서비스를 빌드하고 실행했습니다.
이 과정을 통해 Python 데몬을 독립된 Docker 컨테이너로 실행할 수 있습니다.