IT·테크/인프라

Docker Compose — 여러 컨테이너를 한 덩어리로 묶어 관리하기

레루루 2026. 7. 26. 20:41
반응형

Docker Compose — 여러 컨테이너를 한 덩어리로 묶어 관리하기

이 글은 2022년 10월 기준 기록입니다.

각 서비스를 필요할 때 사용하기 위해 개별적인 컨테이너로 분리했습니다. 그런데 실제로 애플리케이션을 띄우려면 앱 컨테이너와 DB 컨테이너를 매번 각각 실행해야 합니다. 그것들을 필요에 따라 묶어서 동시에 관리할 수 있다면 어떨까요. 그 요구에 답하는 것이 Docker Compose입니다.

Compose는 컨테이너 여러 개를 하나의 덩어리로 만든다

Docker Compose는 여러 개의 컨테이너를 묶어서 한 덩어리로 사용하는 것을 의미합니다. 묶는 기준은 docker-compose.yml 파일이고, Compose는 이 파일의 내용에 따라 작동합니다.

 

여기서 얻는 것이 두 가지입니다.

첫째, 컨테이너 실행 옵션들과 작동 순서 등을 하나의 파일에서 관리할 수 있습니다.

둘째, Compose로 묶인 컨테이너는 동일한 네트워킹 환경을 공유하므로 호스트를 거치지 않고 서로 접근할 수 있습니다. 이미 만들어 둔 이미지를 사용할 수도 있고, 이미지 빌드 자체를 Compose에 맡길 수도 있습니다.

docker-compose.yml이 곧 구성 전체다

Spring Boot 앱과 PostgreSQL을 함께 띄우는 파일은 다음과 같습니다.

name: spring-db-test # compose 이름 지정
services: # services 항목에서 각 컨테이너를 설정
  postgres-db: # 각 컨테이너의 hostname이 됨
    image: postgres:12
    expose: 
      - "5432" # 접근에 사용할 포트 번호 
    volumes: # 컨테이너 외부 볼륨(저장 공간)을 사용
      - postgres_data:/var/lib/postgresql/data
    environment: # 컨테이너 내부 환경 변수 설정
      - POSTGRES_USER=springtest
      - POSTGRES_PASSWORD=springtest

  spring-crud:
    image: test_crud_app:latest
    depends_on: # 컨테이너 실행 순서 정의
      - postgres-db
    ports:
      - 8080:8080

volumes: # 외부 볼륨에 대한 설정
  postgres_data: # 외부 볼륨의 명칭(compose 내부에서 사용하는 이름)
    driver: local
    name : postgres_data # 외부 볼륨의 실제 이름(docker app에 표시되는 이름)

 

눈여겨볼 것은 services 아래에 적은 이름이 그냥 라벨이 아니라는 점입니다. 그 이름이 각 컨테이너의 hostname이 됩니다. depends_on은 컨테이너 실행 순서를 정의하고, volumes는 컨테이너 바깥의 저장 공간을 붙여 줍니다. 볼륨은 Compose 내부에서 부르는 이름과 실제 이름을 따로 지정할 수 있어서, postgres_data라는 키 아래의 name이 Docker 앱에 표시되는 이름이 됩니다.

 

전체 항목은 Compose specification에 정리되어 있습니다.

세 개의 명령으로 올리고 멈추고 지운다

docker-compose.yml 파일이 있는 위치에서 실행합니다.

$ docker compose up -d

멈출 때는 다음과 같습니다.

$ docker compose stop

아예 제거할 때는 다음과 같습니다.

$ docker compose down

내부 DNS 덕분에 DB를 외부로 노출하지 않아도 된다

하나의 Compose로 동작하는 컨테이너들은 Compose 내부 네트워크를 사용해 통신할 수 있습니다. Compose가 자체적으로 제공하는 내부 DNS가 컨테이너의 services 이름을 그대로 도메인으로 지정해 주기 때문입니다.

 

 

구조를 보면 Spring Boot App만 호스트의 8080 포트로 노출되어 있고, PostgreSQL은 Compose 안쪽에서 5432 포트로만 동작합니다. 즉 DB는 외부로 노출하지 않고, DB에 해당하는 서비스 이름인 postgres-db:5432로 다른 내부 컨테이너에서 연결할 수 있습니다.

 

컨테이너마다 호스트 포트를 뚫어 주고 host.docker.internal로 우회하던 방식과 비교하면, 묶는 것만으로 통신 경로가 단순해집니다.

반응형