가상화 및 컨테이너 기술, Docker Compose로 다중 컨테이너 관리하기

현대의 애플리케이션 개발 및 배포 환경에서 가상화 및 컨테이너 기술은 점점 더 중요해지고 있습니다. 이 글에서는
가상화 및 컨테이너 기술의 기본 개념에 대해 설명하고, Docker Compose를 사용하여 여러 컨테이너를 효과적으로 관리하는 방법을
배워보도록 하겠습니다.

1. 가상화 기술 개요

가상화는 물리적인 하드웨어 위에 가상의 환경을 생성하여 여러 개의 가상 시스템을 동시에 운영할 수 있도록 하는 기술입니다.
이 기술은 주로 서버의 리소스를 효율적으로 활용하기 위해 사용됩니다. 가상화 기술에는 하이퍼바이저 기반 가상화와
컨테이너 기반 가상화가 있습니다.

1.1 하이퍼바이저 기반 가상화

하이퍼바이저는 물리적인 하드웨어 위에서 여러 가상 머신(VM)을 생성하고 관리하는 소프트웨어입니다. 각 가상 머신은
독립적인 운영 체제와 애플리케이션을 실행할 수 있습니다. 하이퍼바이저는 크게 두 가지 유형으로 나뉩니다:

  • Type 1 하이퍼바이저: 물리적인 서버 위에서 직접 실행되며, VMware ESXi, Microsoft Hyper-V, Xen 등이 해당합니다.
  • Type 2 하이퍼바이저: 기존 운영 체제 위에서 실행되며, VirtualBox, VMware Workstation 등이 해당합니다.

1.2 컨테이너 기반 가상화

컨테이너는 가상 머신보다 경량화된 환경을 제공하며, 애플리케이션과 그에 필요한 라이브러리 및 의존성을 함께 패키징합니다.
Docker와 같은 컨테이너 플랫폼을 이용하면, 컨테이너는 격리된 환경에서 실행되지만 동일한 운영 체제를 공유합니다. 이에 따라
리소스 사용이 효율적이며, 빠른 배포와 확장이 가능합니다.

2. Docker와 Docker Compose 소개

Docker는 가장 인기 있는 컨테이너 플랫폼으로, 개발자는 애플리케이션을 컨테이너라는 패키지 형태로 배포할 수 있습니다.
Docker Compose는 여러 개의 컨테이너를 정의하고 실행할 수 있게 해주는 도구입니다. 이를 통해 다중 컨테이너 기반
애플리케이션을 간편하게 관리할 수 있습니다.

2.1 Docker 설치하기

Docker를 설치하기 위해서는 공식 Docker 웹사이트(docker.com)를 방문하여
자신의 운영 체제에 맞는 설치 파일을 다운로드 후 설치를 진행하면 됩니다. 설치가 완료되면 아래의 명령어로 Docker가
정상적으로 작동하는지 확인할 수 있습니다:

docker --version

2.2 Docker Compose 설치하기

Docker Compose도 마찬가지로 Docker와 함께 운영되며, 별도로 설치해야 합니다. 설치는 아래의 명령어로 진행할 수
있습니다:

sudo apt-get install docker-compose

설치가 완료되면 다음 명령어로 버전을 확인할 수 있습니다:

docker-compose --version

3. Docker Compose 파일 구조 이해하기

Docker Compose를 사용하기 위해서는 docker-compose.yml 파일을 작성해야 합니다. 이 파일은
여러 서비스(컨테이너)의 설정을 정의하고 각 서비스 간의 관계를 설정합니다. 기본적인 docker-compose.yml 파일
구조는 다음과 같습니다:

version: '3'
services:
  웹서버:
    이미지: nginx:latest
    포트:
      - "80:80"
  앱서버:
    빌드: ./app
    의존 서비스:
      - 웹서버

위 예제에서:

  • version: Compose 파일 형식 버전
  • services: 여러 컨테이너를 정의하는 섹션
  • 이미지: 사용할 Docker 이미지를 지정
  • 포트: 호스트와 컨테이너 간 포트 매핑을 지정
  • 빌드: 도커 이미지를 빌드할 디렉토리 지정
  • 의존 서비스: 특정 서비스가 시작되기 전에 시작되어야 하는 서비스

4. 다중 컨테이너 애플리케이션 구성하기

예시로 간단한 웹 애플리케이션과 데이터베이스를 사용하는 구조를 설계해보겠습니다. 이 구조는 Nginx를 웹 서버로,
Python Flask 애플리케이션을 앱 서버로, PostgreSQL을 데이터베이스로 사용할 것입니다.

4.1 디렉토리 구조 설정

다음과 같은 디렉토리 구조를 설정합니다:

project/
│
├── docker-compose.yml
├── app/
│   ├── Dockerfile
│   └── app.py
└── db/
    └── init.sql

4.2 docker-compose.yml 파일 작성

먼저 docker-compose.yml 파일을 작성합니다:

version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./app:/app

  app:
    build: ./app
    volumes:
      - ./app:/app
    depends_on:
      - db

  db:
    image: postgres:latest
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mydb
    volumes:
      - db_data:/var/lib/postgresql/data
    restart: always

volumes:
  db_data:

4.3 Flask 애플리케이션 작성하기

app/app.py 파일을 아래와 같이 작성합니다:

from flask import Flask
import os
import psycopg2

app = Flask(__name__)

@app.route('/')
def hello_world():
    conn = psycopg2.connect(
        dbname=os.environ.get('POSTGRES_DB'),
        user=os.environ.get('POSTGRES_USER'),
        password=os.environ.get('POSTGRES_PASSWORD'),
        host='db'
    )
    return 'Hello, World!'

if __name__ == '__main__':
    app.run(host='0.0.0.0')

4.4 Dockerfile 작성하기

app/Dockerfile 파일을 아래와 같이 작성합니다:

FROM python:3.9

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

COPY . .

CMD ["python", "app.py"]

4.5 requirements.txt 작성하기

app/requirements.txt 파일을 다음과 같이 작성하여 필요한 패키지를 명시합니다:

flask
psycopg2

4.6 데이터베이스 초기화 스크립트 작성하기

db/init.sql 파일에 데이터베이스 초기화 쿼리를 작성하여 데이터베이스가 생성될 때 필요한 초기 데이터를 설정할 수 있습니다:

CREATE TABLE IF NOT EXISTS test (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50) NOT NULL
);

5. Docker Compose 실행하기

모든 파일을 준비한 후, 터미널에서 해당 프로젝트 디렉토리로 이동하여 아래 명령어로 Docker Compose를 실행합니다:

docker-compose up --build

이 명령어는 Docker Compose가 각 컨테이너를 빌드하고 실행하도록 합니다. 실행 후 웹 브라우저에서 http://localhost에 접속하여
애플리케이션이 정상적으로 실행되는지 확인합니다.

6. 컨테이너 관리하기

Docker Compose를 사용하면 여러 컨테이너를 쉽고 편리하게 관리할 수 있습니다. 예를 들어, 실행 중인
컨테이너 목록을 확인하려면 다음 명령어를 사용합니다:

docker-compose ps

특정 컨테이너를 중지하려면 다음과 같이 명령어를 입력합니다:

docker-compose stop <컨테이너 이름>

모든 컨테이너를 중지하려면 아래 명령어를 사용할 수 있습니다:

docker-compose down

7. 마무리

이번 글에서는 가상화 및 컨테이너 기술에 대해 설명하고, Docker Compose를 사용하여 다중 컨테이너를 관리하는 방법을 배워보았습니다.
이러한 기술들은 현대의 애플리케이션 개발과 배포 환경에서 리소스를 효율적으로 활용하고, 빠른 배포 및 스케일링을 가능하게 하는
데 큰 도움이 됩니다. 앞으로도 다양한 기술을 습득하며 더욱 향상된 개발 환경을 만들어가시길 바랍니다.