본문 바로가기
DevOps/Docker

docker-compose

by Mecodata 2023. 9. 5.

정의

- Docker를 사용하여 멀티 컨테이너 애플리케이션을 정의하고 실행하기 위한 도구

- docker-compose.yml 파일을 통해 여러 개의 컨테이너를 하나의 애플리케이션 스택으로 정의하여 이를 한 번에 실행, 관리 및 확장할 수 있음

- 개발 또는 테스트 환경에서 여러 개의 서비스나 컨테이너들을 조합하여 애플리케이션을 구성하고자 할 때 주로 사용

- 여러 개의 컨테이너를 동시에 실행하고, 서로 간의 네트워크 연결, 데이터 볼륨 공유 등을 손쉽게 설정할 수 있음

docker-compose.yml 형식

version: '3' # docker-compose 버전 지정

services: # 실행하려는 컨테이너들 정의
  # 오픈소스 이미지를 사용하는 경우	
  redis-server: # 서비스명(다른 컨테이너에서 호스트를 지정할 때 사용됨)
    image: # 이미지명 
    container_name: # 컨테이너명 지정
    ports: # 포트 설정
      - 컨테이너 외부:컨테이너 내부
    volumes: # 볼륨 설정
      - 컨테이너 외부:컨테이너 내부 
    restart: # 컨테이너 종료 시 재시작 여부 (주로 always 적용)
    environment: # 환경 변수 설정
      - 
    networks: # 사용할 네트워크 설정 
      -  
      
  # DB의 경우(주로 오픈 소스 이미지 사용)
  mariadb: # 서비스명
    image: # 이미지명
    container_name: # 컨테이너명 지정
    volumes:
      - ./mariadb/conf.d:/etc/mysql/conf.d # 설정 파일 공간
      - ./mariadb/data:/var/lib/mysql # DB의 데이터가 파일 형태로 저장되는 공간
      - ./mariadb/initdb.d:/docker-entrypoint-initdb.d # Docker 컨테이너가 최초 실행 시 불러올 스크립트가 위치하는 공간
    environment: # 환경 변수 지정 
      MYSQL_DATABASE: # DB명
      MYSQL_USER:  # DB 사용자 지정
      MYSQL_ROOT_PASSWORD: # DB ROOT 비밀번호 설정
      TZ: # 시간대 지정
    restart: # 컨테이너 종료 시 재시작 여부 (주로 always 적용)
    ports: # 포트번호 설정(컨테이너 외부:컨테이너 내부)
      - 3306:3306
    networks: # 사용할 네트워크 설정 
      - 
      
  # 이미지를 직접 build하는 경우 
  springboot:
    build: 
      context:  # Dockerfile 경로 지정 (docker-compose.yml 위치 기준)
      dockerfile: # dockerfile의 명칭이 Dockerfile이 아닌 경우 dockerfile 경로 직접 지정 
    container_name: # 컨테이너명 지정
    ports: # 포트번호 설정(컨테이너 외부:컨테이너 내부)
      - "8080:8080"
    volumes: # 볼륨(마운트) 설정(컨테이너 외부:컨테이너 내부)
      - 
    depends_on: # 해당 서비스가 실행되기 전에 의존해야 하는 서비스 목록
      mariadb: # 의존한 서비스명
        condition: service_started # mariadb 컨테이너 실행 후 해당 서비스의 컨테이너 실행
    restart: # 컨테이너 종료 시 재시작 여부 (주로 always 적용)
    networks: # 사용할 네트워크 설정 
      - test_network
      
networks:
  test_network:
    driver: bridge # 네트워크 드라이버 설정 (주로 bridge 적용)

- version, services, networks 세 부분으로 나뉨

- version = docker compose 버전 설정

- services = 각 서비스의 컨테이너 생성에 대한 설정

- networks = 사용할 네트워크에 대한 설정

도커 볼륨(Docker Volume)

- 호스트 머신의 폴더 (로컬 컴퓨터 폴더)

- 컨테이너 내부 폴더와 컨테이너 외부 폴더를 서로 연결해주는 역할

- 익명 볼륨(컨테이너가 존재하는 동안에만 존재), 명명 볼륨(컨테이너가 종료된 후에도 유지)

- docker-compose.yml에서 서로 볼륨으로 지정되어 마운트된 파일들은 변경 시 연결된 다른 파일에도 변경 사항이 반영

ex) /app/A.txt:/etc/app/B.txt인 경우 => A.txt가 변경되면 B.txt에도 변경 사항이 반영되고 그 반대의 경우도 성립 

마운트(Mount) = 물리적인 장치를 특정 디렉터리에 연결 시켜주는 것

기본 명령어

- docker-compose up = docker-compose.yml를 토대로 이미지 생성 => 컨테이너 생성 => 컨테이너 실행
(-d 추가 입력 시 백그라운드 실행, 특정 서비스에 대해서만 명령하고 싶으면 해당 서비스명을 입력)

- docker-compose down = docker-compose.yml에 정의된 서비스의 컨테이너들 모두 삭제

 

'DevOps > Docker' 카테고리의 다른 글

Docker Volume  (0) 2023.09.12
Dockerfile 기본 문법  (0) 2023.02.03
Docker 기본 명령어  (0) 2022.12.21

댓글