본문 바로가기
Docker

Docker Compose 구성요소

by xogns93 2024. 12. 15.

Docker Compose는 여러 개의 Docker 컨테이너를 정의하고 함께 실행할 수 있도록 구성하는 도구입니다. Docker Compose 구성 파일은 주로 docker-compose.yml 형식으로 작성되며, 주요 구성 요소는 아래와 같습니다.


1. version

  • Compose 파일 형식의 버전을 지정합니다.
  • Docker Compose는 다양한 버전이 있으며, 사용하는 Docker 버전에 따라 호환되는 버전을 선택해야 합니다.
  • 최신 버전인 3.9은 다양한 기능을 지원하며, 대부분의 최신 Docker 버전과 호환됩니다.

예시:

version: '3.9'
  • 사용 이유: 파일 구문과 동작 방식의 호환성을 유지합니다. 최신 버전을 사용하면 새로운 기능을 활용할 수 있습니다.

2. services

  • 실행하려는 컨테이너를 정의하는 가장 중요한 섹션입니다.
  • services 아래에 각 컨테이너를 정의하고, 해당 컨테이너의 설정을 포함합니다.

예시:

services:
  web:
    image: nginx
  redis:
    image: redis:alpine
  • 사용 이유: 각 서비스는 애플리케이션의 개별적인 역할(예: 웹 서버, 데이터베이스, 캐시 등)을 수행합니다.

3. image

  • Docker Hub 또는 로컬 레지스트리에 저장된 Docker 이미지를 지정합니다.
  • 컨테이너를 실행할 때 필요한 환경을 포함한 이미지입니다.

예시:

image: redis:latest
  • 추가 설명: redis:latest는 Redis의 최신 버전을 실행하도록 지정합니다. 명시적인 버전 태그(redis:6.2-alpine)를 사용하는 것이 좋습니다.

4. build

  • Dockerfile을 사용하여 이미지를 빌드할 때 사용됩니다.
  • 컨텍스트(파일 경로)와 Dockerfile의 위치를 지정할 수 있습니다.

예시:

build:
  context: ./app
  dockerfile: Dockerfile
  • 사용 이유: 커스터마이즈된 Docker 이미지를 생성하여 서비스에 필요한 특수 설정을 추가할 수 있습니다.

5. ports

  • 호스트(로컬 컴퓨터)와 컨테이너 간의 포트를 매핑합니다.
  • 포트 매핑 형식: <호스트포트>:<컨테이너포트>
    예: 8080:80은 호스트의 8080번 포트를 컨테이너의 80번 포트에 연결합니다.

예시:

ports:
  - "8080:80"
  • 사용 이유: 컨테이너 내부의 서비스(예: 웹 서버)에 외부에서 접근할 수 있도록 설정합니다.

6. volumes

  • 호스트와 컨테이너 간 데이터를 공유하거나, 컨테이너 데이터의 영속성을 유지합니다.
  • 형식: <호스트_경로>:<컨테이너_경로>
    예: ./data:/var/lib/mysql은 호스트의 ./data 디렉토리를 컨테이너의 /var/lib/mysql로 마운트합니다.

예시:

volumes:
  - ./data:/var/lib/mysql
  • 사용 이유: 컨테이너가 삭제되더라도 데이터가 손실되지 않도록 영구적으로 저장할 수 있습니다.

7. environment

  • 컨테이너 내부에서 사용할 환경 변수를 설정합니다.
  • 데이터베이스, 인증 등과 관련된 설정을 외부에서 전달할 때 유용합니다.

예시:

environment:
  - MYSQL_ROOT_PASSWORD=root
  - MYSQL_DATABASE=mydb
  • 사용 이유: 코드를 변경하지 않고도 컨테이너의 동작 방식을 쉽게 변경할 수 있습니다.

8. depends_on

  • 한 서비스가 다른 서비스가 시작된 후 실행되도록 설정합니다.
  • 예를 들어, 데이터베이스가 준비된 후 웹 서버가 실행되도록 설정할 수 있습니다.

예시:

depends_on:
  - db
  • 사용 이유: 서비스 간의 의존성을 관리하여 실행 순서를 보장합니다.
    (단, 의존성을 보장하지만 준비 상태를 확인하지는 않습니다. 준비 상태 확인은 별도로 구현해야 합니다.)

9. networks

  • 컨테이너 간의 네트워크를 설정합니다.
  • 네트워크를 생성하면, 동일한 네트워크에 속한 컨테이너는 이름을 사용해 통신할 수 있습니다.

예시:

networks:
  - app-network

네트워크 정의:

networks:
  app-network:
    driver: bridge
  • 사용 이유: 컨테이너 간의 통신을 안전하고 효율적으로 관리합니다.

10. restart

  • 컨테이너의 재시작 정책을 정의합니다.
  • 서비스가 종료되거나 실패했을 때 재시작 동작을 제어합니다.

예시:

restart: always
  • 옵션 설명:
    • no (기본값): 컨테이너를 재시작하지 않음.
    • always: 컨테이너를 항상 재시작.
    • on-failure: 오류 발생 시에만 재시작.
    • unless-stopped: 컨테이너가 수동으로 중지되지 않는 한 항상 재시작.

11. command

  • 컨테이너가 시작될 때 실행할 명령을 정의합니다.
  • 컨테이너의 기본 명령을 대체하거나 추가 설정이 필요할 때 사용합니다.

예시:

command: ["npm", "start"]
  • 사용 이유: 컨테이너의 실행 동작을 사용자 정의할 수 있습니다.

12. volumes (외부 정의)

  • services 섹션 외부에서 전역 볼륨을 정의합니다.
  • 여러 서비스에서 동일한 볼륨을 공유할 때 유용합니다.

예시:

volumes:
  db-data:
    driver: local
  • 사용 이유: 여러 컨테이너가 데이터를 공유하거나 데이터의 영속성을 보장합니다.

13. networks (외부 정의)

  • services 섹션 외부에서 전역 네트워크를 정의합니다.
  • 모든 컨테이너에 동일한 네트워크를 제공할 수 있습니다.

예시:

networks:
  app-network:
    driver: bridge
  • 사용 이유: 네트워크를 명시적으로 정의하여 컨테이너 간 통신을 제어합니다.

'Docker' 카테고리의 다른 글

멀티스테이지 빌드(Multi-Stage Build)  (0) 2024.12.10
바인드 마운트(Bind Mount)와 볼륨(Volumes)  (0) 2024.12.10
도커 인 액션 8장  (2) 2024.12.06
도커 인 액션 7장  (0) 2024.12.06
Dockerfile 명령어  (0) 2024.12.06