Dandy Now!
  • 도커 컴포즈를 활용한 다중 컨테이너 관리
    2025년 07월 29일 17시 46분 19초에 업로드 된 글입니다.
    작성자: DandyNow
    728x90
    반응형

    도커 컴포즈를 활용한 다중 컨테이너 관리

    1. 도커 컴포즈(Docker Compose) 개요

    1-1. 도커 컴포즈란?

    도커 컴포즈는 다중 컨테이너로 구성된 도커 애플리케이션을 정의하고 실행하기 위한 도구이다. 이 도구는 compose.yml 또는 docker-compose.yml 파일을 사용하여 애플리케이션의 모든 서비스를 구성하며, 단일 명령어를 통해 전체 애플리케이션 스택의 라이프사이클을 관리하는 것을 가능하게 한다. 이는 복잡한 마이크로서비스 아키텍처 환경에서 여러 컨테이너 간의 상호 의존성을 효율적으로 관리하는 데 필수적인 기능을 제공한다.

    1-2. 주요 기능

    도커 컴포즈는 다음과 같은 주요 기능을 제공한다.

    • 서비스 정의: 애플리케이션을 구성하는 각 컨테이너(서비스)의 이미지, 포트, 환경 변수, 볼륨 등을 명확하게 정의한다.
    • 네트워크 관리: 서비스 간의 통신을 위한 가상 네트워크를 자동으로 생성하고 관리한다. 서비스는 서비스 이름으로 서로 통신할 수 있다.
    • 볼륨 관리: 컨테이너의 데이터를 호스트 시스템에 지속적으로 저장하거나 컨테이너 간에 공유할 수 있도록 볼륨을 정의한다.

    2. compose.yml 파일 분석

    2-1. 파일 구조

    compose.yml 파일은 도커 컴포즈 애플리케이션의 모든 설정을 담고 있는 YAML 형식의 파일이다. 본 실습에서는 services 섹션을 사용하여 세 가지 서비스를 정의하고 있다.

    services:
      my-mysql-db:
        image: mysql
        environment:
          MYSQL_ROOT_PASSWORD: root
        volumes:
          - ./mysql_data:/var/lib/mysql
        ports:
          - 4306:3306
      my-redis-cache:
        image: redis
        ports:
          - 6379:6379
      my-nginx-server:
        build: .
        ports:
          - 80:80

    2-2. my-mysql-db 서비스 구성

    my-mysql-db 서비스는 MySQL 데이터베이스 컨테이너를 나타낸다.

    • image: mysql 공식 이미지를 사용함을 명시하고 있다.

    • environment: 컨테이너 내부에서 사용할 환경 변수를 설정한다. MYSQL_ROOT_PASSWORD: root는 MySQL root 사용자의 비밀번호를 root로 설정한다.

    • volumes: 데이터 지속성을 위해 호스트 시스템의 ./mysql_data 디렉토리를 컨테이너 내부의 /var/lib/mysql 경로에 마운트한다.

      volumes:
        - ./mysql_data:/var/lib/mysql

      이 설정은 컨테이너가 중지되거나 제거되어도 데이터가 손실되지 않고 호스트 시스템에 보존됨을 의미한다.

    • ports: 호스트 시스템의 4306번 포트를 컨테이너의 3306번 포트에 연결한다. 이를 통해 호스트에서 localhost:4306으로 MySQL 데이터베이스에 접근할 수 있다.

    2-3. my-redis-cache 서비스 구성

    my-redis-cache 서비스는 Redis 캐시 컨테이너를 정의한다.

    • image: redis 공식 이미지를 사용한다.
    • ports: 호스트 시스템의 6379번 포트를 컨테이너의 6379번 포트에 연결한다.

    2-4. my-nginx-server 서비스 구성

    my-nginx-server 서비스는 Nginx 웹 서버 컨테이너를 정의한다.

    • build: 현재 디렉토리(.)에 존재하는 Dockerfile을 사용하여 이미지를 빌드한다. 이는 사용자 정의 이미지를 생성할 때 사용된다.

      FROM nginx
      
      COPY ./ /usr/share/nginx/html
    • ports: 호스트 시스템의 80번 포트를 컨테이너의 80번 포트에 연결한다. 이를 통해 웹 브라우저에서 localhost:80으로 Nginx 서버에 접근할 수 있다.

    3. 다중 컨테이너 구동 및 관리

    3-1. 애플리케이션 스택 구동

    compose.yml 파일에 정의된 모든 서비스를 동시에 구동하기 위해서는 docker compose up 명령어를 사용한다. -d 옵션은 컨테이너를 백그라운드에서 실행하도록 한다.

    • docker compose up -d 명령어

      docker compose up -d

      이 명령어를 실행하면 compose.yml 파일에 명시된 이미지 빌드 및 컨테이너 생성이 자동으로 이루어지고, 모든 서비스가 백그라운드에서 시작된다.

      docker compose up -d 명령어를 사용할 때 --build 옵션을 명시적으로 붙이지 않았는데, compose.yml 파일에서 서비스에 build 지시어가 포함되어 있다면, docker compose up 명령어는 해당 서비스의 이미지를 자동으로 빌드하는 동작을 수행한다. 이는 도커 컴포즈가 build 지시어를 감지하고 필요한 경우 이미지를 빌드하거나 재빌드하는 지능적인 메커니즘을 가지고 있기 때문이다. 예를 들어, 사용자님의 compose.yml 파일에서 my-nginx-server 서비스는 다음과 같이 build: .을 명시하고 있다. 이 설정은 도커 컴포즈에게 my-nginx-server 이미지를 현재 디렉토리(compose-practice/)의 Dockerfile을 기반으로 빌드해야 한다고 지시하는 것이다. 따라서 docker compose up을 실행하면, 도커 컴포즈는 my-nginx-server 서비스에 대한 이미지가 최신 상태인지 확인하고, 필요한 경우 자동으로 빌드를 수행한다. --build 옵션은 이미지가 존재하더라도 강제로 재빌드를 수행하고자 할 때 사용된다. 이는 Dockerfile 내용이 변경되었거나, 빌드 컨텍스트에 포함된 파일들이 수정되어 최신 변경 사항을 이미지에 반영하고 싶을 때 유용하다. 하지만 초기 구동 시나 변경 사항이 없는 경우에는 --build를 생략해도 무방하다.

    • 구동 결과 확인

      docker compose ps 명령어를 사용하여 현재 실행 중인 도커 컴포즈 서비스들의 상태를 확인할 수 있다.

      docker compose ps

      명령어 실행 결과는 다음과 같이 각 서비스의 이름, 이미지, 명령어, 생성 시간, 상태, 그리고 포트 매핑 정보를 명확하게 보여준다.

      NAME                                 IMAGE                              COMMAND                   SERVICE           CREATED
        STATUS          PORTS
      compose-practice-my-mysql-db-1       mysql                              "docker-entrypoint.s…"   my-mysql-db       32 seconds ago
       Up 28 seconds   0.0.0.0:4306->3306/tcp, [::]:4306->3306/tcp
      compose-practice-my-nginx-server-1   compose-practice-my-nginx-server   "/docker-entrypoint.…"   my-nginx-server   32 seconds ago
       Up 28 seconds   0.0.0.0:80->80/tcp, [::]:80->80/tcp
      compose-practice-my-redis-cache-1    redis                              "docker-entrypoint.s…"   my-redis-cache    32 seconds ago
       Up 28 seconds   0.0.0.0:6379->6379/tcp, [::]:6379->6379/tcp

      이 출력을 통해 my-mysql-db, my-nginx-server, my-redis-cache 세 가지 서비스가 모두 Up 상태로 정상적으로 실행되고 있음을 확인할 수 있다.

    3-2. 애플리케이션 스택 중단 및 제거

    실행 중인 도커 컴포즈 서비스를 중단하고 제거하기 위해서는 docker compose down 명령어를 사용한다.

    • docker compose down 명령어

      docker compose down

      이 명령어는 compose.yml 파일에 정의된 모든 컨테이너, 네트워크 및 볼륨(별도로 정의된 명시적 볼륨 제외)을 중지하고 제거한다.

      [+] Running 4/4
       ✔ Container compose-practice-my-redis-cache-1   Removed                                                                                                           0.6s
       ✔ Container compose-practice-my-nginx-server-1  Removed                                                                                                           0.7s
       ✔ Container compose-practice-my-mysql-db-1      Removed                                                                                                           2.0s
       ✔ Network compose-practice_default              Removed                                                                                                           0.4s

      docker compose ps 명령어로 다시 확인하면, 실행 중인 서비스가 없음을 확인할 수 있다.

      docker compose ps
      NAME      IMAGE     COMMAND   SERVICE   CREATED   STATUS    PORTS

    4. 결론

    도커 컴포즈는 복잡한 다중 컨테이너 애플리케이션 환경을 효율적으로 관리할 수 있는 강력한 도구이다. compose.yml 파일을 통해 서비스 간의 의존성, 네트워크 설정, 볼륨 등을 선언적으로 정의함으로써, 개발 및 배포 과정을 간소화하고 반복 가능성을 높일 수 있다. 이는 특히 여러 개의 컨테이너가 상호 작용하는 현대적인 애플리케이션 아키텍처에서 개발 생산성을 크게 향상시키는 데 기여한다.


    728x90
    반응형
    댓글