Docker

[Docker]#20 도커 컴포즈(docker compose) - docker-compose.yml 파일 작성법

TitediosKW 2024. 9. 3. 19:00
반응형

Docker Compose는 여러 개의 Docker 컨테이너를 쉽게 정의하고 관리할 수 있는 도구입니다. 이를 위해 docker-compose.yml 파일을 사용하여 필요한 컨테이너를 정의하고 설정을 한 곳에 모아 관리합니다. 이 블로그 포스팅에서는 docker-compose.yml 파일의 구조와 주요 구성 요소를 설명하고, 예시를 통해 이를 실제로 어떻게 사용하는지 알아보겠습니다.


목차

  1. Docker Compose란?
  2. docker-compose.yml 파일 구조
  3. 예제: 간단한 웹 애플리케이션 구성
  4. Docker Compose 명령어
  5. 결론

1. Docker Compose란?

이전에 알아보았듯이 Docker Compose는 여러 개의 Docker 컨테이너를 하나의 서비스처럼 정의하고 관리할 수 있도록 도와주는 도구입니다. 복잡한 애플리케이션은 종종 여러 서비스(예: 웹 서버, 데이터베이스, 캐시 서버 등)로 구성됩니다. 이때 Docker Compose를 사용하면 여러 컨테이너를 하나의 파일로 정의하고, 한 번의 명령으로 이들을 동시에 실행할 수 있습니다.


2. docker-compose.yml 파일 구조

docker-compose.yml 파일은 YAML 형식으로 작성되며, 기본적으로 version, services, volumes, networks 등의 주요 항목으로 구성됩니다. 각 항목의 구성에 대해 알아보겠습니다.

version

version 키는 Docker Compose 파일의 버전을 지정합니다. 현재 가장 많이 사용하는 버전은 3.x입니다. 버전 3은 Docker Swarm과의 호환성을 제공하며, 다양한 기능을 지원합니다. 하지만, 최근 Docker compose에서는 version을 사용하는 것을 권장하지 않습니다.

version: '3.8'
반응형

services

services는 애플리케이션의 각 컨테이너를 정의하는 가장 중요한 섹션입니다. 서비스 내부에 컨테이너를 정의함으로써 여러분의 서비스를 만들어 가는 것이기 때문입니다. 여기에는 각 컨테이너의 이미지, 명령, 환경 변수, 네트워크 설정 등을 포함할 수 있습니다.

예시:

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html
    networks:
      - my-network

  db:
    image: postgres:13
    environment:
      POSTGRES_USER: example
      POSTGRES_PASSWORD: example
      POSTGRES_DB: example_db
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - my-network

위 예시에서는 두 개의 서비스 web과 db가 정의되어 있습니다. web 서비스는 Nginx 서버를 실행하고, 로컬의 ./html 디렉토리를 Nginx 컨테이너의 /usr/share/nginx/html로 마운트합니다. db 서비스는 PostgreSQL 데이터베이스를 실행하며, 환경 변수를 통해 데이터베이스 설정을 지정합니다.
이전에 살펴본 docker run 명령어에서 필요한 옵션들이 있었죠? 이 옵션들을 yaml에 지정하는 것과 비슷한 개념으로 이해하시면 훨씬 쉽게 접근하실 수 있습니다.

volumes

volumes는 데이터를 영구적으로 저장할 수 있는 Docker 볼륨을 정의합니다. 이를 통해 컨테이너가 삭제되더라도 데이터는 유지됩니다. Volume 역시 명령어로 공부한 것을 yaml로 작성하는 것 뿐입니다.

예시:

volumes:
  db-data:

위 예시에서는 db-data라는 이름의 볼륨이 정의되어 있습니다. 이 볼륨은 db 서비스에서 사용되며, PostgreSQL 데이터베이스 데이터를 영구적으로 저장합니다.

networks

networks는 Docker 네트워크를 정의합니다. 각 서비스는 이 네트워크를 통해 서로 통신할 수 있습니다. 기본적으로 모든 서비스는 동일한 네트워크에 연결되지만, 필요에 따라 여러 네트워크를 정의하고 각 서비스에 연결할 수 있습니다.

예시:

networks:
  my-network:

위 예시에서는 my-network라는 네트워크가 정의되어 있습니다. web과 db 서비스는 이 네트워크를 통해 서로 통신할 수 있습니다.


3. 예제: 간단한 웹 애플리케이션 구성

아래는 간단한 Node.js 애플리케이션과 MongoDB 데이터베이스를 함께 실행하는 docker-compose.yml 파일의 예입니다.

version: '3.8'

services:
  app:
    image: node:14
    working_dir: /app
    volumes:
      - .:/app
    command: npm start
    ports:
      - "3000:3000"
    depends_on:
      - mongo
    networks:
      - app-network

  mongo:
    image: mongo:4.2
    volumes:
      - mongo-data:/data/db
    networks:
      - app-network

volumes:
  mongo-data:

networks:
  app-network:

이 예제에서는 Node.js 애플리케이션(app)과 MongoDB 데이터베이스(mongo)가 정의되어 있습니다. app 서비스는 로컬 코드를 컨테이너 내 /app 디렉토리에 마운트하고, npm start 명령을 실행하여 애플리케이션을 시작합니다. mongo 서비스는 MongoDB 컨테이너를 실행하고, mongo-data라는 볼륨에 데이터를 저장합니다.


4. Docker Compose 명령어

Docker Compose 파일을 작성한 후에는 다음과 같은 명령어를 사용하여 애플리케이션을 관리할 수 있습니다:

  • docker-compose up: 정의된 모든 서비스를 빌드하고 시작합니다.
  • docker-compose down: 실행 중인 모든 서비스를 중지하고 네트워크를 제거합니다.
  • docker-compose ps: 현재 실행 중인 서비스를 확인합니다.
  • docker-compose logs: 모든 서비스의 로그를 출력합니다.

실제로 docker compose up 명령어를 수행한 그림입니다. 해당 그림에서 보듯이 우리가 정의한 2개의 서비스가 정의한대로 일괄적으로 수행되는 것을 볼 수 있습니다. app 컨테이너에 오류가 발생할 수 있는데 이는 우리가 app을 개발한 것이 없기 때문에 발생하는 에러로 지금은 신경쓰지 않으셔도 됩니다.


결론

Docker Compose와 docker-compose.yml 파일을 사용하면 복잡한 애플리케이션을 쉽게 정의하고 관리할 수 있습니다. docker run 명령어 등을 통해 컨테이너를 관리하고자 하면 각각의 컨테이너에 대해 직접 관리하여 관리의 복잡성이 증가합니다. 하지만, docker compose를 통해 여러 컨테이너로 구성된 애플리케이션을 하나의 파일로 정리하면, 명령어 몇 줄만으로 쉽게 개발 환경이나 운영 환경을 구축할 수 있습니다. 이를 통해 개발 및 배포 과정에서의 복잡성을 줄이고, 일관된 환경을 유지할 수 있습니다.


도움이 되셨다면 공감 부탁드리겠습니다. 여러분의 공감이 정말 큰 힘이 됩니다.


감사합니다!

반응형