docker-compose 기본

이진욱·2025년 1월 10일
0

Docker 공부

목록 보기
19/22

docker-compose는 여러 Docker 컨테이너를 정의하고 관리하는 도구로, 특히 컨테이너 간의 네트워크와 종속성을 손쉽게 설정하고 관리할 수 있도록 도와줍니다. Docker의 핵심 CLI 툴 중 하나로, 애플리케이션을 서비스 단위로 구성해 개발, 테스트, 배포를 간소화하는 데 사용됩니다.

주요 개념

  • docker-compose.yml 파일 :
    컨테이너를 정의하는 설정 파일입니다.
    서비스, 네트워크, 볼륨, 환경 변수 등을 선언적으로 작성합니다.

  • 서비스(Service):
    애플리케이션의 단일 구성 요소를 나타냅니다. 예를 들어, 웹 서버, 데이터베이스 등을 각각 하나의 서비스로 정의합니다.

  • 네트워크(Network):
    컨테이너 간 통신을 지원하며, 별도의 설정 없이도 동일한 Compose 프로젝트 내 컨테이너는 기본 네트워크로 연결됩니다.

  • 볼륨(Volume):
    데이터 영속성을 제공하기 위해 컨테이너와 호스트 간 데이터를 공유하는 저장소입니다

주요 명령어

docker-compose up:

docker-compose.yml에 정의된 서비스를 기반으로 컨테이너를 생성하고 실행합니다.

-d 옵션을 사용하면 백그라운드에서 실행합니다.

docker-compose down:

모든 컨테이너와 네트워크, 볼륨을 정리합니다(옵션에 따라 다름).

docker-compose ps:

실행 중인 컨테이너 목록을 표시합니다.

docker-compose build:

서비스에 대한 이미지를 빌드합니다.

docker-compose logs:

서비스의 로그를 출력합니다.

docker-compose exec:

실행 중인 컨테이너 안에서 명령어를 실행합니다.

docker-compose.yml 예시

version: '3.8'
services:
  web:
    build: .
    ports:
      - "8080:80"
    volumes:
      - ./code:/var/www/html
    networks:
      - app-network

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: example
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - app-network

volumes:
  db-data:

networks:
  app-network:

설명:

  • web: 웹 서버 서비스
    빌드 명령어와 포트 매핑(8080:80), 파일 공유 디렉터리를 정의.

  • db: 데이터베이스 서비스
    MySQL 컨테이너를 사용하며 환경 변수로 루트 비밀번호를 설정.

  • 볼륨(db-data)을 사용해 데이터 영속성을 유지.
    volumes, networks: 볼륨과 네트워크를 정의.

사용 사례

  • 다중 컨테이너 애플리케이션 개발:

    • 예: 웹 서버, 데이터베이스, 캐시 서버(redis) 등 여러 서비스를 함께 실행.
  • 애플리케이션 환경 설정 자동화:

    • 동일한 환경을 여러 팀원이 손쉽게 재현 가능.
  • 로컬 개발 및 테스트:

    • 로컬에서 컨테이너 기반 개발 환경을 쉽게 설정.
  • 복잡한 배포 구성 관리:

    • 여러 서비스를 쉽게 정의하고 배포.

장점

  • 코드로 환경 정의: YAML 파일로 애플리케이션 환경을 선언적으로 관리.

  • 간단한 실행: 단일 명령으로 모든 서비스 시작 및 정리 가능.

  • 포터블 환경: 동일한 구성을 어디서나 재현 가능.

  • 유지보수 용이성: 서비스 추가/변경이 간단.

  • Docker Compose는 특히 개발 환경에서 매우 강력한 도구이며, 운영 환경에서도 Docker Swarm 또는 Kubernetes와 함께 사용 가능합니다.

예제

  • ex06에 docker-compose.yml 추가

  • service는 MySQL을 이용할 것이며 mysql-compose-volume으로 볼륨 폴더를 지정하였다.

  • yml 파일을 추가하였다면 docker-compose를 실행시킨다

docker-compose up -d

  • docker-compose 실행 뒤 mysql 서비스가 구동된 것을 확인


DB 로그인 계정을 yml에 맞게 수정한다 (root 계정으로 로그인)

  • MySQL_ROOT_PASSWORD = root1234 (root 계정 패스워드)
  • MYSQL_DATABASE=rootdb (사용 DB)

rootdb에 테이블 생성과 데이터를 기입하였다

볼륨이 생성된 것을 확인

볼륨 이름 기본값 : 폴더명_불륨명

볼륨 안에 person 테이블이 생성된 것도 확인

컨테이너, 이미지를 삭제 후 재실행 시 볼륨을 그대로 가져오는지 테스트해 볼 것이다.

컨테이너, 이미지를 삭제해도 볼륨이 그대로 남아있다.

docker-compose를 재실행하고 서버가 잘 가동된지 확인한다.

docker-compose를 재구동해도 db, 테이블, 데이터를 잘 가져옴을 확인


이번엔 폴더 경로를 호스팅 폴더로 지정하여서 볼륨 데이터를 보관할 것이다.

  • volumeTest 폴더 내에 저장 할 것이다.

  • docker-compose.yml 에서 볼륨 관련 정보를 수정한다.

※ 볼륨 지정 방법 1
volumes:
- 사용할Docker볼륨이름:/var/lib/mysql

=> '사용할 볼륨 이름'이 Docker Volumes 에 생성됨

※ 볼륨 지정 방법 2
volumes:
- 호스팅폴더경로:/var/lib/mysql

=> /var/lib/mysql의 볼륨 데이터가 호스팅 폴더에 생성되며, Docker Volumes에 생성되지 않는다.

  • /var/lib/mysql은 db서버 데이터 볼륨 경로이다.
  • 데이터 디렉터리(/var/lib/mysql)의 데이터를 호스트 시스템의 지정된 위치Docker 볼륨으로 매핑하게 된다.

  • 설정을 완료하였으면 docker-compose를 재실행한다.

볼륨 데이터들이 윈도우 호스팅 폴더에 저장이 되었으므로, Docker Volumes에는 volume이 존재하지 않는다.

volumeTest폴더에 볼륨 데이터들이 생성되는 것을 확인

rootdb에서 person2 테이블 생성 후 KIM 데이터 기입

volumeTest 폴더의 볼륨 데이터에 person2 테이블이 생성됨을 확인

profile
열심히 하는 신입 개발자

0개의 댓글