본문 바로가기
개발공부 개발새발/Docker

Docker ) Docker-Compose

by 휴일이 2024. 4. 3.

Docker-Compose

[Orchestration Command Set] 자동화 설정 명령 셋. docker build , docker run 명령을 대체해주는 도구.

다수의 명령들을 하나의 구성 파일로 합친다.

💡 모든 컨테이너를 즉시 시작하고, 필요하다면 모든 이미지를 빌드해버린다. 모든 것을 중지하고 중단하는 것도 가능 !

하지만

  • 도커 컴포즈는 커스텀 이미지를 위한 Dockerfile 을 대체할 순 없다.
    • Dockerfile 과 함께 작동 가능
  • 이미지나 컨테이너를 대체하는 것이 아니라, 그 작업을 더 쉽게 할 수 있게 해주는 것.
  • 다수의 호스트에서 다중 컨테이너 관리에는 적합하진 않다.
    • 하나의 호스트에서 다중 컨테이너를 관리하는 데에 강점이 있음.

컴포즈 파일에서 정의해야하는 것

Service (컨테이너)

  • 다중 컨테이너 애플리케이션을 구성하는 컨테이너
  • 모든 서비스 아래에서 해당 서비스를 구현 가능
  • 포트 , 환경 변수, 볼륨, 네트워크 등을 정의 → 도커 컴포즈에서 ㄱㄱ

도커 컴포즈 사용해보기!

  • 혹시 리눅스라면 먼저 도커 컴포즈 설치를 하자.
1. sudo curl -L "<https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$>(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

2. sudo chmod +x /usr/local/bin/docker-compose

3. sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

4. to verify: docker-compose --version

 

경로 참고

docker-compose.yml

  • 일단 데이터베이스 컨테이너만 올려보며 기본 설정들을 확인하자 😃
# 참고로 docker-compose 는 ?
# defult `-d` (detached 모드) `--rm` (서비스 내려가면 바로 제거)

# DockerCompose 버전 (프로젝트X 도커컴포즈O)
version: '3.8'
# 정의할 컨테이너들...
services:
  mongodb:
    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
    # 하나의 docker-compose 파일에 정의된 서비스는 도커에 생성된 동일한 네트워크의 일부가 됨! -> 네트워크 설정 필요 X
    # 만약 이렇게 따로 추가한다면, 컴포즈에 있는 서비스에 있는 네트워크 `외`에 goals-net 네트워크에도 추가되는 것.
    # networks:
      # - goals-net
  # backend:
  # frontend:

# service 에서 생성중인 '명명' 도커 볼륨 나열해야 함.
# 도커가 추가해야하는 볼륨을 알려주는 것.
volumes:
  data:

Docker-Compose command

# 기본 attached 모드
docker-compose up

# detached 모드 실행
docker-compose up -d

# docker-compose 중지
docker-compose down

# 중지하며 볼륨까지 제거
docker-compose down -v

 

 

Docker-Compose + with Backend

# 참고로 docker-compose 는 ?
# defult `-d` (detached 모드) `--rm` (서비스 내려가면 바로 제거)

# DockerCompose 버전 (프로젝트X 도커컴포즈O)
version: '3.8'
# 정의할 컨테이너들...
services:
	# 코드에서 사용할 수 있는 이름
  mongodb:
    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
    # 하나의 docker-compose 파일에 정의된 서비스는 도커에 생성된 동일한 네트워크의 일부가 됨! -> 네트워크 설정 필요 X
    # 만약 이렇게 따로 추가한다면, 컴포즈에 있는 서비스에 있는 네트워크 `외`에 goals-net 네트워크에도 추가되는 것.
    # networks:
      # - goals-net
	# 코드에서 사용할 수 있는 이름
  backend:
      # image: 'goals-node'
    # 이미 존재하는 이미지를 사용하지 않더라도, Dockerfile이 있는 경로를 알려주면 이미지를 직접 빌드해줌.
    build: ./backend
    # build:
    # 이미지가 생성되는 장소, 즉 이미지에 포함될 모든 파일이 있어야하는 장소이기도 하다.
    # 도커파일이 있는 장소가 아닌 다른 곳으로 설정해야할 수도 있어서 복잡할수도..
      # context: ./backend
      # dockerfile: Dockerfile      
      # arge:
      #   some-arg: 1
    ports:
      - '80:80' # 호스트 포트:앱포트
    volumes:
      - logs:/app/logs
      - ./backend:/app # docker-compose.yml 파일의 상대 경로 사용 가능. (바인드마운트)
      - /app/node_modules
    env_file:
      - ./env/backend.env
    # 어떤 컨테이너에 의존하고 있는지 알려줌.
    # mongodb 를 불러와야 백엔드 앱이 실행 가능하기 때문에 mongodb에 종속성이 있다고 알려줌.
    depends_on:
      - mongodb
  # frontend:

# service 에서 생성중인 '명명' 도커 볼륨 나열해야 함.
# 도커가 추가해야하는 볼륨을 알려주는 것.
volumes:
  data:
  logs:

 

Docker-Compose + with Frontend(React)

# 참고로 docker-compose 는 ?
# defult `-d` (detached 모드) `--rm` (서비스 내려가면 바로 제거)

# DockerCompose 버전 (프로젝트X 도커컴포즈O)
version: '3.8'
# 정의할 컨테이너들...
services:
  # 코드에서 사용할 수 있는 이름
  mongodb:
    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
    # 하나의 docker-compose 파일에 정의된 서비스는 도커에 생성된 동일한 네트워크의 일부가 됨! -> 네트워크 설정 필요 X
    # 만약 이렇게 따로 추가한다면, 컴포즈에 있는 서비스에 있는 네트워크 `외`에 goals-net 네트워크에도 추가되는 것.
    # networks:
      # - goals-net
  # 코드에서 사용할 수 있는 이름.
  backend:
      # image: 'goals-node'
    # 이미 존재하는 이미지를 사용하지 않더라도, Dockerfile이 있는 경로를 알려주면 이미지를 직접 빌드해줌.
    build: ./backend
    # build:
    # 이미지가 생성되는 장소, 즉 이미지에 포함될 모든 파일이 있어야하는 장소이기도 하다.
    # 도커파일이 있는 장소가 아닌 다른 곳으로 설정해야할 수도 있어서 복잡할수도..
      # context: ./backend
      # dockerfile: Dockerfile      
      # arge:
      #   some-arg: 1
    ports:
      - '80:80' # 호스트 포트:앱포트
    volumes:
      - logs:/app/logs
      - ./backend:/app # docker-compose.yml 파일의 상대 경로 사용 가능. (바인드마운트)
      - /app/node_modules
    env_file:
      - ./env/backend.env
    # 어떤 컨테이너에 의존하고 있는지 알려줌.
    # mongodb 를 불러와야 백엔드 앱이 실행 가능하기 때문에 mongodb에 종속성이 있다고 알려줌.
    depends_on:
      - mongodb
  frontend:
    build: ./frontend
    ports:
      - '3000:3000'
    volumes:
      - ./frontend/src:/app/src
    # 인터렉티브 모드를 만들고 싶어요
    stdin_open: true # -it (외부 입력 받기 O)
    tty: true # 터미널 연결
    depends_on:
      - backend # backend 가 시작된 경우에만 frontend 시작하기 !

# service 에서 생성중인 '명명' 도커 볼륨 나열해야 함.
# 도커가 추가해야하는 볼륨을 알려주는 것.
volumes:
  data:
  logs:

 

  • 깔ㅡ끔

유용하다 !

docker-compose up

# 이미지 강제 리빌드
docker-compose up --build

# 이미지만 리빌드
docker-compose build

컨테이너 이름 추가

 

  • container_name 으로 추가 가능!
💡 docker-compose 명령은 docker 명령을 대체하지 않는다. 두 명령을 함께 사용할 수 있다. (docker push 등)

 

💡 Docker-Compose 를 사용한다고 Dockerfile 이 필요하지 않은 게 아님. 둘은 함께 작동한다. !
728x90

'개발공부 개발새발 > Docker' 카테고리의 다른 글

Docker ) 유틸리티 컨테이너  (1) 2024.04.03
Docker ) 다중 컨테이너  (0) 2024.04.02
Docker ) Network  (0) 2024.03.29
Docker ) ARG 와 ENV  (0) 2024.03.18
Docker ) 도커 볼륨과 바인드 마운트  (0) 2024.03.18