Docker Compose

EBAB!·2023년 7월 15일
0

Docker

목록 보기
12/15

개요 및 설정 방법

앞서 도커의 컨테이너들을 관리할 때 문제점이 있습니다.
일단 명령어가 너무 길었습니다. 컨테이너마다 해주어야 할 명령어들이 너무 길고 컨테이너들 간의 공유되어야 할 변수들도 있었습니다.

그리고 배포까지 생각한다면 컨테이너 갯수가 늘어날 수도 있고 컨테이너 관계를 생각하면 더더욱 복잡해집니다.

이런 컨테이너 관리를 해결해주는 것이 docker compose입니다.

docker compose는 yaml파일입니다. 컨테이너들의 실행 명령어들을 단 하나의 파일로 관리할 수 있도록 해줍니다. 여러 컨테이너를 실행하고 멈추고 할 필요없이 한번에 여러 컨테이너를 관리한다는 것이 초점이 됩니다.



docker compose

컨테이너를 관리한다는 것은 컨테이너들만 관리한다는 것이지 이미지 수준의 관리까지는 하지 않습니다.
따라서 다음의 docker-compose파일에서 Dockerfile을 대체하는 부분이 있지않고 함께 작동하는 것을 볼 수 있습니다.


# [docker-compose.yaml]
version:"3.8"


services:
  db:
    image: 'mongo'
    volumes:
      - data:/data/db
    environment:
      - MONGO_INITDB_ROOT_USERNAME: admin
      # - MONGO_INITDB_ROOT_USERNAME=admin
      - MONGO_INITDB_ROOT_PASSWORD: secret
    # networks:
    #   - test_net
    
  back:
    build: './backend'
    ports:
      - '80:80'
    volumes:
      - logs:/app/logs
      - ./backend:/app
      - /app/node_modules
    env_file:
      - ./env/backend.env
    depends_on:
      - db
      
  front:
    build: ./frontend
    ports:
      - '3000:3000'
    volumes:
      - ./frontend/src:/app/src
    stdin_open: true
    tty: true
    depends_on:
      - back
      
      
volumes:
  data:
  logs:

version

version은 docker-compose의 버전을 의미합니다. 버전이 달라지면서 명령어의 변화가 생길 수 있고 작동 방식이 바뀔 수 있으므로 사용하는 버전을 명확하게 해두는 것이 좋습니다. docker 공식 문서에서 버전에 대한 정보를 확인할 수 있습니다.


services

compose 파일에서 정의해야 하는 핵심은 Service 컨테이너 입니다. 컨테이너를 관리하는 컨테이너로 보면 됩니다. 앞서 설명에 나왔던 3개의 컨테이너를 넣어서 작성합니다.
services 컨테이너로 묶인 컨테이너들은 자동으로 docker network로 묶입니다. 따라서 컨테이너마다 network 설정을 해줄 필요가 없습니다(단, 특정 네트워크로 넣고싶다면 db 설정에서처럼 특정해줄 수 있습니다).

그리고 docker-compose에서는 컨테이너 중지시 자동삭제, detached모드가 디폴트 값이기 때문에 이후 설명에서 언급되지 않는걸 볼 수 있습니다.

db

db 컨테이너를 정의합니다.
environment에서 보듯이 키-값 형태로 정의해도 되고 =을 사용해서 표시해도 되지만 통일성을 위해 키-값 형태로 정의했습니다.

backend

공식 이미지가 아닌 커스텀 이미지를 사용합니다. 이 때 이미지를 굳이 설정하는 것이 아닌 Dockerfile을 제시하는 방식으로 작성했습니다.
만약 Dockerfile 이름이 다를 시엔 경로만으로 찾지 못하기 때문에 다음과 같이 설정할 수도 있습니다.

  build:
    content: ./backend
    dockerfile: Dockerfile_name
    args:
      another_num: 100

이런 식으로 Dockerfile에 쓸 수 있었던 다양한 설정들을 추가할 수도 가능합니다.
지금은 추가 설정이 필요없고 파일명이 Dockerfile로 되어있으므로 바로 찾기에 짧은 형태로 설정된 것입니다.

여기선 환경변수를 env_file로 제시한 형태입니다. docker-compose 파일을 기준으로 작성합니다.

depends-on 옵션은 docker-compose의 옵션입니다. 이 컨테이너가 어떤 컨테이너에 의존하는지 씁니다. 백엔드는 데이터베이스와 연결을 원하기 때문에 데이터베이스 컨테이너를 추가해줍니다.

frontend

백엔드 컨테이너와 비슷하게 설정을 합니다. 차이점이 있다면 -it설정을 추가해주어야 하는데

    stdin_open:true
    tty: true

를 통해 설정했습니다.
그리고 백엔드와 통신하기 때문에 depends_on에 백엔드 컨테이너를 추가해줍니다.
물론 백엔드 통신이 필요없는 프론트엔드라면 추가하지 않아도 됩니다.

volumes

services 컨테이너와 같은 최상위 수준의 설정입니다. 여기엔 명명된 볼륨만 설정해주면 되고, 익명 볼륨이나 바인드 마운트는 쓸 필요가 없습니다.

services 컨테이너에서 사용중인 명명된 볼륨이 data에 나열되어야 합니다. docker가 services를 위해 생성하면서 명명된 볼륨을 인식하기 위해 필요한 구문입니다.

이곳에 명명된 볼륨은 다른 컨테이너에서도 같은 이름으로 사용할 수 있습니다.

docker-compose up & down

docker-compose up을 통해 서비스를 시작하고 docker-compose down을 통해 서비스를 중지하면서 컨테이너를 삭제합니다.
docker 명령어와 마찬가지로 여러 옵션을 사용할 수있습니다.
docker-compose up -d : 서비스를 백그라운드로 시작
docker-compose down -v : 볼륨까지 제거 (미설정시 볼륨은 삭제x)

앞서 설정들에 문제가 없다면 docker-compose up -d를 통해 백그라운드로 모든 컨테이너가 잘 실행되는것을 확인할 수 있습니다.

명령어 정리

명령어

  • up: 서비스를 빌드하고 컨테이너를 실행합니다.
  • down: 정의된 서비스의 컨테이너를 중지하고 삭제합니다.
  • start: 정의된 서비스의 컨테이너를 시작합니다.
  • stop: 정의된 서비스의 컨테이너를 중지합니다.
  • restart: 정의된 서비스의 컨테이너를 재시작합니다.
  • pause: 정의된 서비스의 컨테이너를 일시 중지합니다.
  • unpause: 일시 중지된 정의된 서비스의 컨테이너를 재개합니다.
  • build : docker-compose 파일에 포함된 커스텀 이미지를 build합니다. up에는 build 과정이 포함되어 있습니다.

추가 옵션

  • -d, --detach: 컨테이너를 백그라운드에서 실행합니다.
  • --build: 서비스 컨테이너를 항상 빌드합니다.
  • -v, --volume <호스트 경로>:<컨테이너 경로>: 호스트와 컨테이너 간의 볼륨을 마운트합니다.
  • -e, --env <환경 변수>: 환경 변수를 설정합니다.
  • --scale <서비스>=<개수>: 서비스의 인스턴스 수를 지정합니다.
  • -l, --log-level <로그 레벨>: 로그 레벨을 설정합니다.
profile
공부!

0개의 댓글