컨테이너/Docker

[Docker] Docker compose 사용 및 .yml 작성법

:) :) 2023. 7. 13. 15:34

 

 

0. Docker compose 사용 이유

 여러 개의 컨테이너로 구성된 application을 단일 파일에 정의하고 이를 한 번에 올리거나 내릴 수 있다.

기존엔 여러 컨테이너를 띄워놓고 어플리케이션을 운용해야 했으나.. 이러한 과정을 간소화하여 불편함을 없앴다 할 수 있겠다.

 이러한 편리함 덕에 Docker Compose는 로컬 개발 환경이나 테스트 자동화 환경에서 간단한 컨테이너 오케스트레이션 도구로 많이 사용되고 있다.

 

1. Docker Compose 파일 위치

 프로젝트의 최상위 디렉토리에 존재해야 한다.

 

2. docker-compose.yml 야믈파일 구조

version: "3.5"
services:
  # 웹 애플리케이션 설정
  web:
    # 의존성 삽입, web 어플리케이션이 올라오기 전 db가 먼저 올라와야 됨을 의미
    depends_on:
      - db
      
    # 명령어 : 해당 서비스가 올라올 때 Dockerfile의 CMD를 무시하고 실행할 명령어
    command: node .
    
  # 데이터베이스 설정
  db:
    # Docker file이 있는 위치에서 빌드
    build: ./database
    
    # 프로젝트에서 직접 개발하지 않을 땐 image를 내려받아서 사용
    image: postgres:13
    
    #내부에서 개방할 포트 : 외부에서 접근할 포트
    ports: "3306:3306"
    
    
 
    
    
    
    
   # 항목명 = 서비스명 = 네트워크 호스트명
  backend:
    build: ./backend # 이곳에 Docker file이 있어야 함
    
    # 연결할 외부 디렉토리 :컨테이너 내 디렉토리
    volumes:
      - ./backend:/usr/src/app
      
    # 포트
    ports:
      - "5000:5000"
    
    # 환경변수 설정
    environment:
      - DBHOST=db



  # 항목명 = 서비스 명 = 네트워크 호스트명
  frontend:
    build:
      - ./frontend
      
    # 연결할 외부 디렉토리 : 컨테이너 내 디렉토리
    volumes:
      - ./frontend:/home/node/app
    
    #포트
    ports: "8080:8080"
    
networks:
  # 네트워크 설정
volumes:
  # 볼륨 설정 - 서비스에서 설정한 외부 디렉토리 볼륨을 작성
  backend:
  frontend:

우선, YAML 형식의 파일에선 키워드를 두 개의 공백에 따라 하위 항목을 구분한다. 탭은 인식 못한다.

  • version
    • YAML 파일 포맷의 버전을 나타냄.
  • services
    • 생성될 컨테이너들을 묶어놓은 단위이다. 서비스 항목 아래에는 각 컨테이너에 적용될 생성 옵션을 지정한다.
  • web, mysql
    • 생성될 서비스의 이름이다. 

 

기존 run 명령어의 옵션을 YAML파일로 변환하는 것이 docker-compose의 대부분이라고 할 수 있다.

 

YAML파일은 크게

  • version 정의
  • services 정의
  • volume 정의
  • network 정의

의 4가지 항목으로 구성된다.

 

 

3. Docker compose 실행

docker-compose up

컴포즈 파일에 정의된 컨테이너 및 네트워크와 같은 주변 환경 생성

 

docker-compose -f [file_path] -p [명시할 project name] up [option]

 

docker-compose up -d mysql

이렇게 하면 mysql 서비스의 컨테이너만 생성하게도 할 수 있다.

 

 

4. docker-compose down

생성 된 컨테이너와 네트워크를 종료하고 삭제

docker-compose -f [file_path] down [option]