티스토리 뷰
목차
Docker는 복잡한 애플리케이션을 쉽게 배포하고 관리할 수 있도록 설계된 컨테이너화 기술입니다. 이를 통해 count_rows.py가 실행되고 있는 Docker 컨테이너가 어떻게 작동하는지 쉽게 이해할 수 있습니다. 이 가이드에서는 Docker의 기본 개념과 구조를 설명한 후, count_rows.py Python 데몬이 Docker 컨테이너에서 어떻게 실행되는지 설명하겠습니다.
Docker의 기본 개념
이미지(Image)
이미지는 애플리케이션과 그 실행에 필요한 모든 파일(코드, 라이브러리, 환경 설정 등)을 포함하는 읽기 전용 템플릿입니다. 이미지는 Dockerfile을 통해 만들어지며, 일종의 청사진 역할을 합니다. 예를 들어, count_rows.py가 실행되기 위한 Python 이미지는 mysql-connector-python 라이브러리와 함께 Python 프로그램을 실행하는 환경을 제공합니다.
컨테이너(Container)
컨테이너는 이미지를 기반으로 실행되는 독립적인 실행 환경입니다. 컨테이너는 애플리케이션을 격리된 상태에서 실행하며, 필요한 시스템 리소스(메모리, CPU 등)를 호스트 운영체제와 공유합니다. count_rows.py가 실행되는 컨테이너는 Python 이미지를 기반으로 만들어졌으며, MySQL과 통신하여 주기적으로 데이터베이스에서 정보를 조회합니다.
Dockerfile
Dockerfile은 이미지를 만들기 위한 스크립트로, 이미지 빌드 시 필요한 단계들을 정의합니다. count_rows.py가 실행되는 컨테이너는 daemon/Dockerfile을 사용하여 이미지를 빌드합니다. 이 Dockerfile에는 Python과 MySQL 커넥터 라이브러리가 설치되며, 컨테이너가 실행되면 Python 프로그램이 실행됩니다.
Docker Hub
Docker Hub는 이미지 저장소로, Python이나 MySQL 같은 기본 이미지를 Docker Hub에서 다운로드받아 사용할 수 있습니다.
Docker의 구조와 동작 방식
Docker는 클라이언트-서버 구조로 동작하며, 다음의 주요 요소로 구성됩니다.
Docker 클라이언트 (Docker Client)
Docker 클라이언트는 docker run, docker build 등의 명령어를 실행하여, Docker 데몬에게 컨테이너를 실행하거나 관리할 것을 요청합니다.
Docker 데몬 (Docker Daemon)
Docker 데몬은 백그라운드에서 클라이언트의 요청을 처리하며, 컨테이너와 이미지를 관리합니다. 예를 들어, docker-compose up 명령어를 입력하면 Docker 데몬은 count_rows.py가 실행되는 컨테이너를 생성하고 관리합니다.
이미지와 컨테이너의 관계
이미지는 실행 전 상태이고, 컨테이너는 이미지를 기반으로 동작하는 상태입니다. 컨테이너는 특정 이미지를 기반으로 생성되며, 이미지는 읽기 전용이지만, 컨테이너는 데이터를 추가하거나 변경할 수 있는 읽기-쓰기가 가능한 레이어를 가집니다. count_rows.py 컨테이너는 Python:3.9-slim 이미지를 기반으로, MySQL과 연결되는 Python 애플리케이션을 실행합니다.
count_rows.py가 실행되는 컨테이너의 동작 방식
1. Dockerfile을 통한 이미지 빌드
프로젝트 디렉토리에서 작성한 daemon/Dockerfile을 사용해 Python 데몬 이미지를 빌드합니다.
FROM python:3.9-slim # Python 3.9 기반의 가벼운 이미지
WORKDIR /app # 컨테이너 내부에서 작업할 디렉토리
COPY count_rows.py . # Python 스크립트를 컨테이너로 복사
RUN pip install mysql-connector-python # MySQL 통신을 위한 라이브러리 설치
CMD ["python", "count_rows.py"] # 컨테이너 실행 시 Python 스크립트를 실행
이 Dockerfile을 통해 Python 환경을 설정하고 필요한 MySQL 커넥터를 설치하여 이미지를 빌드합니다.
2. 컨테이너 생성 및 실행
이미지가 빌드되면, 컨테이너를 생성하고 실행합니다. 이 컨테이너는 count_rows.py 스크립트를 주기적으로 실행하여, 30초마다 MySQL 데이터베이스의 test 테이블의 행 수를 조회합니다.
컨테이너가 실행되면 Docker가 지정된 Python 프로그램을 실행하고, 계속해서 실행 상태를 유지합니다.
3. 컨테이너 내부에서 Python 데몬 실행
컨테이너 내부에서 count_rows.py가 실행됩니다. 이 스크립트는 MySQL 서버에 연결하여 test 테이블의 행(row) 수를 30초마다 확인하고, 그 결과를 로그로 출력합니다.
docker-compose up 명령어를 사용하면, Docker 데몬이 실행되면서 docker-compose.yml에 정의된 각 서비스(web, db, python-daemon)가 동시에 실행됩니다. python-daemon 컨테이너는 db 컨테이너와 네트워크로 연결되어 서로 통신합니다.
4. 컨테이너의 독립성과 네트워크 통신
컨테이너는 독립적인 실행 환경을 제공하지만, 동일한 네트워크에 있는 다른 컨테이너들과 연결할 수 있습니다. count_rows.py가 실행되는 Python 데몬 컨테이너는 MySQL 컨테이너(db)와 Docker 네트워크를 통해 통신할 수 있습니다. 이 네트워크 설정은 docker-compose.yml 파일의 webnet 네트워크 설정을 통해 가능합니다.
Docker Compose와 컨테이너 관리
docker-compose.yml 파일 관리
docker-compose.yml 파일은 여러 컨테이너를 정의하고, 이를 쉽게 관리하는 데 유용합니다.
services:
python-daemon:
build: ./daemon
depends_on:
- db # Python 데몬은 MySQL 컨테이너가 실행된 후에 실행
networks:
- webnet
여기서 python-daemon 서비스는 MySQL 서비스(db)에 의존하고 있으며, 두 컨테이너는 동일한 네트워크(webnet)에서 통신합니다.
컨테이너 상태 확인
docker-compose ps 명령어를 사용해 현재 실행 중인 컨테이너의 상태를 확인할 수 있으며, docker-compose logs 명령어로 각 컨테이너의 로그를 확인하여 Python 데몬과 MySQL의 통신 상태를 모니터링할 수 있습니다.
컨테이너 간 네트워크 통신
Docker 네트워크를 통해 컨테이너 간의 통신이 이루어집니다. 각 컨테이너는 독립적으로 실행되지만, docker-compose.yml에서 정의된 동일한 네트워크에 속하면 서로 통신할 수 있습니다. 예를 들어, python-daemon 컨테이너는 MySQL 컨테이너와 데이터를 주고받을 수 있습니다.
요약
컨테이너는 독립적인 실행 환경으로, 이미지를 기반으로 생성됩니다. count_rows.py Python 데몬은 Python 이미지를 기반으로 하는 Docker 컨테이너에서 실행되며, MySQL과 연결된 상태로 데이터베이스 정보를 조회합니다. 컨테이너 간의 통신은 Docker 네트워크를 통해 이루어지며, Docker Compose를 사용해 쉽게 관리할 수 있습니다.