Docker-Compose

유현민·2022년 9월 23일
0

도커 & 쿠버네티스

목록 보기
18/28
post-thumbnail

도커 컴포즈

  • docker build와 docker run 명령을 대체할 수 있는 도구
  • 오케스트레이션 명령 set
  • 도커 컴포즈는 dockerfile을 대체하지 않는다
  • 이미지나 컨테이너를 대체하지 않는다
  • 컨테이너를 더 쉽게 시작할 수 있게 한다.
    docker-compose.yaml or .yml파일을 생성

네트워크?

  • 도커 컴포즈를 사용하면 도커가 이 컴포즈 파일에 특정된 모든 서비스에 대해 새 환경을 자동으로 생성하고 모든 서비스를 즉시 그 네트워크에 추가한다.

  • 하나의 동일한 컴포즈 파일에 정의된 모든 서비스는 이미 도커에 의해 생성된 동일한 네트워크의 일부가 된다.

도커 컴포즈 실행

  • 도커 컴포즈 파일이 있는 폴더로 이동 -> docker-compose up
  • 만약 detached 모드에서 실행하고 싶으면 docker-compose up -d

도커 컴포즈 중지

  • docker-compose down
  • docker-compose down -v -> 볼륨도 삭제

version

  • 도커 컴포즈의 버전을 지정

services

-컨테이너의 이름?을 입력

build

  • 빌드 해야하는 Dockerfile의 위치

args

  • 도커 파일이 arg를 사용하는 경우

image

  • 이미지 이름, 로컬이나 도커 허브에서 조회된다.

volumes

  • 볼륨 지정

environment

  • 변수 지정

env_file

  • 환경 변수 파일 지정

networks

  • 도커 컴포즈를 사용하면 네트워크를 따로 추가하지 않아도 되지만 직접 관리하려면 추가

ports

  • 포트 지정

depends_on

  • 하나의 컨테이너가 다른 컨테이너에 의존할 수 있다.
  • 먼저 실행되어야 하는 컨테이너를 설정
depends_on:
	- ...

인터렉티브 모드

stdin_open: true
tty: true

옵션

  • docker-compose --build up -> 이미지 리빌드를 강제
  • docker-compose build -> 만약 빌드만 하려는 경우

exec

docker exec 컨테이너이름 명령어

  • 이 컨테이너가 실행하는 기본 명령 외에 실행 중인 컨테이너 내에서 특정 명령을 실행할 수 있다.
  • Dockerfile에 지정되어 있는 명령 외에 입력된 특정 명령이 실행된다.
  • 애플리케이션은 계속 실행 중인 상태에서 컨테이너 내에 추가적인 명령을 실행할 수 있다.
    -메인 프로세스를 중단하지 않고 컨테이너 내부에 작성된 로그 파일을 읽는데 유용하다.

CMD vs ENTRYPOINT

CMD는 명령어를 입력하면 덮어쓰는 형태이지만 ENTRYPOINT는 뒤에 붙는다.
CMD ["python"]
-> 명령어를 -V 라고 하면 CMD는 python이 -V 로 덮어써짐
반면에
ENTRYPOINT ["python"]
-> 명령어가 뒤에 붙는다. python -V

명령이 종료되면 항상 컨테이너가 종료된다

docker-compose run

docker-compose run 서비스이름 명령어

  • yml 파일에 여러 서비스가 있는 경우 단일 서비스로 실행할 수 있다.
    --rm -> 종료되면 컨테이너 삭제

docker-compose up

그냥 실행하면 전체가 빌드 되지만 각각의 컨테이너 이름을 넣으면 해당 컨테이너만 가능
docker-compose up 이름1 이름2...

--build

docker-compose up -d --build 컨테이너이름 -> 수정하게 되면 docker build .과 같이 사용자가 직접 재빌드를 하지 않아도 컴포즈가 알아서 인식하고 빌드를 진행한다.

docker-compose.yaml

# 도커 컴포즈 사양의 버전을 지정
version: '3.3'

# 서비스의 자식 -> 컨테이너
services:
# 컨테이너 입력
  mongodb:
  # 이미지 이름, 로컬이나 도커 허브에서 조회된다.
  # 서비스를 중단하면 서비스가 제거(rm 기본)
  # detached 모드가 기본
    image: 'mongo'
    # 볼륨
    volumes:
      - data:/data/db
    #environment:
    # 방법이 두개
    # 환경 변수 파일 지정도 가능
      # 
      # MONGO_INITDB_ROOT_USERNAME: max
      # - MONGO_INITDB_ROOT_USERNAME=max
      # - MONGO_INITDB_ROOT_PASSWORD=secret
    env_file:
      - ./env/mongo.env
    # 도커 컴포즈를 사용하면 네트워크 따로 추가 안해도 된다.
    # networks:
    #   - goals-net
  backend:
    # 빌드 해야하는 Dockerfile의 위치
    build: ./backend
    # build:
    #   context: ./backend
    #   dockerfile: Dockerfile
    # 도커 파일이 arg를 사용하는 경우
    # 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


# services에서 사용 중인 명명된 볼륨이 나열되어야 한다.
# 다른 서비스에서 동일한 볼륨 이름을 사용하면 그 볼륨이 공유된다.
# 따라서 다른 컨테이너가 호스팅 머신 상의 동일한 볼륨 동일한 폴더를 사용할 수도 있다.
# 익명 볼륨과 바인드 마운트는 지정할 필요가 없다.
volumes:
  data:
  logs:
profile
smilegate megaport infra

0개의 댓글