본문 바로가기
DevOps/Docker

Docker Compose

by 민우's 코딩 2024. 2. 6.

5. Docker Compose 섹션

이전까진 여러 컨테이너를 결합하여 하나의 app을 빌드해보았다.

하나하나 실행해야하는 명령어가 너무 많았다.

Docker compose를 쓰면 편하게 많은 컨테이너 설정을 더 쉽게 관리할 수 있다.
설정 프로세스를 자동화하는데 도움되고
하나의 명령으로 각각의 모든 컨테이너와 개별 구성을 지닌 전체 설정을 가져올 수 있게한다.


Docker compose는
docker build 와 docker run 을 대체하는 명령어이다.
다수의 build와 run을 단 하나의 구성 파일로 가지고
모든 서비스 모든 컨테이너를 즉시 시작하고 필요하다면 모든 필요한 이미지를 빌드하는 
자동화 명령 셋이다. (Orchestration)
하나의 명령으로 모든 것을 중지 및 중단이 가능하고
Docker compose는 Dockerfile을 대체하지 않고 함께 작동하는 방식이다.
'docker run' 이나 'docker build'를 부분적으로 대체할 뿐이다.
또한 여전히 도커 명령을 여전히 사용할 수 있다 ex) docker volume ls
도커 컴포즈는 다수의 호스트가 다중 컨테이너를 관리하는데는 적합하진않지만
하나의 동일한 호스트에서 다중 컨테이너를 관리하는게 정말 좋다.

도커 컴포즈 파일에 정의해야하는 가장 중요한 항목은 서비스이다.
다중 컨테이너 app을 구성하는 컨테이너라고 볼 수 있다.
컨테이너에 필요한 환경 변수, 볼륨 정의나 네트워크 할당 등
기본적으로 터미널에서 하는 도커 명령들을 도커 컴포즈에서 할 수 있다.

도커 컴포즈 알아두면 좋을 것
detached 모드와 --rm 플래그가 기본 디폴트이다.
파일 작성시 따로 적을 필요가 없다.

Docker compose.yaml 기본 구조 및 형식 작성해보기
yaml -> 들여쓰기시 위 요소의 하위요소를 이미함
항상 version으로 시작함 -> 도커 컴포즈 사양의 버전을 의미함
그 다음 service:   -> 값을 가지는게 아닌 몇몇의 중첩된 값을 가짐
그렇기에 이 아래 중첩된 값들을 들여쓰기를 사용해서 service의 하위 요소라고 의미시킴
여기서 service의 하위 요소(자식)는 컨테이너이다.

내가 사용할 컨테이너가 3개라면 service 아래에 3개의 하위 요소를 가질 것이다.
services:
  mongodb:
  backend:
  frontend:
내가 지정한 하위 요소는 총 3개이며 이름은 자유이다.

그럼 이제 각 컨테이너의 하위 요소를 적기위해 각 컨테이너 다음 요소를 적을때 들여쓰기를 한번 더 해서 지정한다.

하나의 도커 컴포즈 파일에 정의된 모든 서비스들은 이미 도커에 의해 생성된 동일한 네트워크의 일부가 된다.
따라서 각 서비스마다 네트워크를 지정할 필요가 없다.


최상위 볼륨키
services에서 사용 중인 명명된 볼륨이 나열되어야 한다.
익명 볼륨과 바인드 마운트는 여기에 지정할 필요가 없다.



도커 컴포즈로 서비스 시작하는 방법?
docker-compose up   // attached 모드
이 하나의 명령으로 컴포즈 파일에서 찾을 수 있는 모든 서비스가 시작된다.
docker-compose up -d  // detached 모드
docker-compose down  // 모든 컨테이너 삭제 및 서비스 종료 but 볼륨는 삭제 x
docker-compose down -v // 볼륨까지 삭제



version: "3.8"
services:
  mongodb:
    image: 'mongo'
    volumes: 
      - data:/data/db
  # container_name: mongodb       컨테이너 이름 설정
    # environment: 
    #   MONGO_INITDB_ROOT_USERNAME: max
    #   MONGO_INITDB_ROOT_PASSWORD: secret
      # - MONGO_INITDB_ROOT_USERNAME=max
    env_file: 
      - ./env/mongo.env
  backend:
    build: ./backend
    # build:
    #   context: ./backend
    #   dockerfile: Dockerfile
    #   args:
    #     some-arg: 1
    ports:
      - '80:80'
    volumes: 
      - logs:/app/logs
      - ./backend:/app
      - /app/node_modules
    env_file: 
      - ./env/backend.env
    depends_on:
      - mongodb
  frontend:
    build: ./frontend
    ports: 
      - '3000:3000'
    volumes: 
      - ./frontend/src:/app/src
    stdin_open: true
    tty: true
    depends_on: 
      - backend

volumes: 
  data:
  logs:

 

출처 : https://www.udemy.com/course/docker-kubernetes-2022/