Docker-Compose 서비스 정의 및 사용 방법

Docker-Compose 서비스 정의 및 사용 방법

DevOps
Docker Compose
Docker-Compose 서비스 정의 및 사용 방법
Author

gabriel yang

Published

October 7, 2024


Docker-Compose 서비스 정의 및 사용 방법

Docker-Compose는 여러 Docker 컨테이너를 쉽게 관리할 수 있도록 도와주는 도구입니다. 이 도구의 중심에는 서비스라는 개념이 있습니다. 서비스는 하나의 애플리케이션 구성 요소를 나타내며, 각 서비스는 독립적으로 실행될 수 있습니다. 이번 블로그 글에서는 Docker-Compose 서비스의 정의와 사용 방법에 대해 자세히 설명하겠습니다.

1. Docker-Compose 서비스란?

서비스는 Docker-Compose 파일(docker-compose.yml) 내에서 정의된 특정 기능을 수행하는 단위입니다. 각 서비스는 개별적으로 실행되는 Docker 컨테이너를 나타내며, 서로 다른 이미지와 설정을 가질 수 있습니다. 예를 들어, 웹 애플리케이션을 구축할 때, 다음과 같은 서비스를 정의할 수 있습니다:

  • 웹 서버 (예: Nginx, Apache)
  • 애플리케이션 서버 (예: Node.js, Django)
  • 데이터베이스 서버 (예: MySQL, PostgreSQL)
  • 캐시 서버 (예: Redis)

서비스는 서로 통신할 수 있도록 설정할 수 있으며, 이로 인해 복잡한 애플리케이션 아키텍처를 구성할 수 있습니다.

2. 서비스 정의 방법

서비스는 docker-compose.yml 파일에서 정의합니다. 기본적인 구조는 다음과 같습니다:

version: '3'  # Docker Compose의 버전

services:  # 서비스 정의 시작
  service_name:  # 서비스 이름
    image: <image_name>  # 사용할 Docker 이미지
    build:  # 이미지 빌드 설정
      context: <path>  # Dockerfile 경로
      dockerfile: <file_name>  # 사용할 Dockerfile 이름
    ports:  # 포트 매핑
      - "<host_port>:<container_port>"
    volumes:  # 데이터 볼륨
      - <volume_name>:<container_path>
    environment:  # 환경 변수
      - <KEY>=<VALUE>
    depends_on:  # 서비스 종속성
      - <dependency_service_name>

2.1. 서비스 이름

각 서비스는 고유한 이름을 가져야 합니다. 이 이름을 통해 다른 서비스와의 관계를 정의할 수 있습니다. 서비스 이름은 명확하고 이해하기 쉬운 것이 좋습니다. 예를 들어, web, db, api와 같은 이름을 사용할 수 있습니다.

2.2. 이미지

image 필드는 해당 서비스에서 사용할 Docker 이미지를 지정합니다. Docker Hub와 같은 이미지 레지스트리에서 이미지를 가져오거나, 로컬에서 빌드한 이미지를 사용할 수 있습니다.

2.3. 빌드 설정

build 필드는 Dockerfile을 사용하여 이미지를 빌드하기 위한 설정입니다. context는 Dockerfile의 경로를, dockerfile은 사용할 Dockerfile의 이름을 지정합니다.

build 설정은 docker-compose.yml 파일 내에서 특정 서비스 아래에 정의됩니다. 기본적인 구조는 다음과 같습니다:

services:
  service_name:  # 서비스 이름
    build:  # 빌드 설정 시작
      context: <path>  # Dockerfile의 위치
      dockerfile: <file_name>  # 사용할 Dockerfile 이름 (선택 사항)
  • context: 빌드를 수행할 디렉토리의 경로를 지정합니다. 이 경로는 Dockerfile이 위치한 폴더와 해당 폴더에 포함된 모든 파일을 포함해야 합니다. Docker는 이 경로 내의 파일을 사용하여 이미지를 빌드합니다.

예를 들어, 다음과 같은 디렉토리 구조가 있을 때:

/myapp
|-- docker-compose.yml
|-- Dockerfile
|-- app.py

docker-compose.yml에서 context를 . (현재 디렉토리)로 설정할 수 있습니다:

services:
  app:
    build:
      context: .
  • dockerfile: 사용할 Dockerfile의 이름을 지정합니다. 기본적으로 Docker는 Dockerfile이라는 이름의 파일을 찾습니다. 그러나 다른 이름의 Dockerfile을 사용할 경우 이 옵션을 통해 파일명을 명시할 수 있습니다.

예를 들어, MyDockerfile이라는 이름의 Dockerfile을 사용하려면 다음과 같이 설정할 수 있습니다:

services:
  app:
    build:
      context: .
      dockerfile: MyDockerfile

2.4. 포트 매핑

ports 필드는 호스트와 컨테이너 간의 포트를 매핑합니다. 이 매핑을 통해 외부에서 서비스에 접근할 수 있게 됩니다.

ports:
  - "8080:80"  # 호스트의 8080 포트를 컨테이너의 80 포트와 연결

2.5. 볼륨

volumes 필드는 컨테이너의 데이터를 지속적으로 저장하기 위해 사용하는 볼륨을 정의합니다. 이를 통해 컨테이너가 종료되더라도 데이터가 사라지지 않도록 할 수 있습니다.

volumes:
  - db_data:/var/lib/mysql  # db_data 볼륨을 MySQL 데이터 디렉터리에 연결

2.6. 환경 변수

environment 필드는 서비스의 환경 변수를 정의합니다. 환경 변수를 사용하면 서비스의 동작을 조정할 수 있습니다.

environment:
  - NODE_ENV=production  # NODE_ENV 변수를 production으로 설정

2.7. 종속성

depends_on 필드는 서비스 간의 종속성을 정의합니다. 이를 통해 특정 서비스가 시작되기 전에 다른 서비스가 먼저 실행되도록 설정할 수 있습니다.

depends_on:
  - db  # web 서비스가 db 서비스가 실행된 후에 시작됨

3. 서비스 사용 방법

3.1. Docker-Compose 파일 작성

서비스를 정의한 docker-compose.yml 파일을 작성합니다. 예를 들어, 다음은 웹 애플리케이션과 데이터베이스를 설정한 예제입니다:

version: '3'

services:
  web:
    image: nginx
    ports:
      - "80:80"

  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: example
    volumes:
      - db_data:/var/lib/postgresql/data

volumes:
  db_data:

3.2. 서비스 시작

서비스를 시작하려면, 터미널에서 docker-compose up 명령어를 실행합니다. 이 명령어는 모든 서비스를 실행하고, 필요한 이미지를 자동으로 다운로드합니다.

docker-compose up

3.3. 서비스 중지 및 제거

서비스를 중지하고, 모든 컨테이너를 제거하려면 docker-compose down 명령어를 사용합니다.

docker-compose down

3.4. 서비스 상태 확인

실행 중인 서비스와 컨테이너의 상태를 확인하려면 docker-compose ps 명령어를 사용합니다.

docker-compose ps

결론

Docker-Compose 서비스를 정의하고 사용하는 방법에 대해 알아보았습니다. 서비스는 Docker-Compose의 핵심 요소로, 애플리케이션의 다양한 구성 요소를 효과적으로 관리할 수 있게 해줍니다. 위의 내용을 바탕으로 여러분의 프로젝트에 Docker-Compose를 적용해 보시기 바랍니다. 다양한 서비스의 조합을 통해 복잡한 애플리케이션도 쉽게 관리할 수 있을 것입니다.