docker compose 정리

ny0011·2023년 3월 24일

docker compose

  • 여러 컨테이너를 통합 관리하기 위한 툴
  • service, network, volume 등을 정의
  • docker run에서 사용하는 옵션(CMD, EXPOSE, VOLUME, ENV 등)도 설정 가능
  • yaml 파일로 작성.
    • 보통 version: 3으로 작성

build

  • build 에 바로 빌드할 파일이 있는 경로를 적을 수 있음
version: "3.9"
services:
  webapp:
    build: ./dir
  • build 밑에 object를 구성해서 상세하게 적을 수도 있음
    • context : Dockerfile이 있는 디렉토리의 경로 or git repository URL
    • dockerfile : Dockerfile 말고 다른 이름으로 dockerfile을 만들었을 때 설정. context도 같이 지정해줘야 함
    • args : 빌드할 때 추가할 환경 변수를 설정. Dockerfile에 미리 설정해둔 ARG 변수에 값을 전달
      • args에 값을 생략할 수도 있음. 이때 값은 docker compose가 실행 중인 환경에서의 값으로 설정됨
version: "3.9"
services:
  webapp:
    build:
      context: ./dir
      dockerfile: Dockerfile-alternate
      args:
        buildno: 1 # Dockerfile에 buildno라는 ARG가 있어야 함

depends_on

  • service 간의 종속성을 표현
    • 예시 파일을 사용해서 docker-compose up을 실행하면 db, redis가 먼저 실행되고 web이 제일 마지막에 실행됨
    • docker-compose up web을 실행해도 자동으로 depends_on에 있는 서비스 먼저 실행됨
    • docker-compose stop을 하면 web 먼저 종료되고 db, redis가 그 다음에 종료됨
    version: "3.9"
    services:
      web:
        build: .
        depends_on:
          - db
          - redis
      redis:
        image: redis
      db:
        image: postgres
  • depends_on은 web을 실행하기 전에 db와 redis가 준비되었는지 기다리지 않음. 그냥 db와 redis를 시작할 뿐임.
    • 서비스가 준비될 때까지 기다려야 한다면(보통 DB가 web보다 늦게 준비될 때 문제가 생길듯) 다음 condition 속성 사용
      • service_started : depends_oncondition으로 아무것도 적지 않았을 때 기본 설정
      • service_healthy : 이 서비스를 시작하기 전에 의존하고 있는 서비스가 "healthy"(healthcheck에서 감지함)로 예상한다고 설정
      • service_completed_successfully : 이 서비스를 시작하기 전에 의존하고 있는 서비스가 실행 성공했을 것으로 예상한다고 설정
      services:
        web:
          build: .
          depends_on:
            db:
              condition: service_healthy
              restart: true
            redis:
              condition: service_started
        redis:
          image: redis
        db:
         image: postgres
    • restart : true로 설정하면 의존 설정해둔 service가 업데이트되면 이 service도 반드시 재시작해야 한다는 걸 설정
  • swarm mode에서 stack을 배포할 때 depends_on은 무시됨

참고

0개의 댓글