Published 2024. 3. 21. 22:21
다수의 docker build와 docker run 명령을 대체할 수 있는 단 하나의 구성으로 가지며 모든 컨테이너를 즉시 시작할 수 있습니다. 필요하다면 모든 이미지를 빌드하는 오케스트레이션 명령 도구 중 하나입니다.
 
하나의 명령을 사용하여 모든 컨테이너를 중지하고, 시작할 수 있습니다.

 

⁠Docker Compose가 안되는 것

  • Dockerfile을 대체할 수 없습니다.
  • 이미지나 컨테이너를 대체할 수 없습니다
  • 다수의 호스트에서 컨테이너를 관리할 수 없습니다.
 

Docker Compose Files 작성하기

컴포즈 파일에서 중요한 요스는 Service(컨테이너)⁠입니다.
  • 포트 오픈
  • 환경 변수
  • 볼륨
  • 네트워크
  • ...
기본적으로 터미널을 통해 도커 명령으로 할 수 있는 모든 것을 정의할 수 있습니다.
 
컴포즈 버전을 확인할 수 있습니다.
# docker-compose.yaml

#  version속성은 이전 버전과의 호환성을 위해 Compose 사양에 의해 정의됩니다.
version: "3.8"

# service의 하위로 컨테이너를 정의해야합니다.
services:
  mongodb:
    # 사용하려는 이미지 / 로컬 혹은 도커 이미지에서 조회됩니다.
    image: "mongo"
    volumes:
      # -v 플래그와 함께 사용한 것과 정확히 동일합니다.
      # 볼륨이름:/컨테이너 내부 경로 : read only
      - data:/data/db:ro
    environment:
      # 총 3가지 방식으로 지정이 가능합니다.
      Name: value
      env_file:
        - ./.env
      # - PASSWORD=SECRET
    networks:
      # 컴포즈가 모든 서비스를 즉시 네트워크에 추가합니다.

  backend:
    # 완성 이미지를 사용하는 대신, 이미지를 빌드하는데 필요한 모든 정보를 제공할 수 있습니다.
    # image: "goals-node"
    # Dockerfile 위치를 지정하면 찾아서 동작할 수 있습니다.
    # build: ./backend
    # Dockerfile이 여러 개라면 특정 파일을 지정할 수 있습니다.
    build:
      context: ./backend # context의 위치를 주의, 해당 위치만 참조합니다.
      dockerfile: Dockerfile
      args: # 빌드 인수 참조 가능
        - name=value
    ports:
      - "80:80" # 호스트 포트:내부포트 매핑
    volumes:
      - logs:/app/logs
      # 바인드 마운트
      - ./backend:/app
      # 익명 볼륨
      - /app/node_modules

    # 여러 컨테이너가 동시에 생길 때, 의존성을 해결하기 위함
    depends_on:
      - mongodb
      - ...

  frontend:
    # 인터렉티브 모드를 추가
    build: ./frontend
    ports:
      - "3000:3000"
    volumes:
      # 바인드마운트
      - ./frontend/src:/app/src
    # 인터렉티브 모드
    stdin_open: true
    tty: true # -it 플래그 / 터미널에 연결
    depends_on:
      - backend

# 네임드 볼륨을 사용하기 위해 생성해야합니다.
# 다른 서비스에서 동일한 볼륨 이름을 사용하면 볼륨은 공유됩니다.
volumes:
  data:
  logs:
 
  • 컨테이너 시작과 중지
$ docker-compose up
$ docker-compose down
 
  • docker-compose 명령 변형
$ docker-compose --build # build key가 존재한다면 이미지 빌드를 강제합니다. image key가 아님
 
  • service명은 컨테이너 이름 자체가 아닌, 컨테이너 이름의 일부분입니다.
  • 전체 이름은 현재 디렉토리와 여러 정보들끼리 복합적으로 만들어지며 컨테이너 이름을 지정하려고 하는 경우엔 container_name을 입력해야합니다.
services:
  mongodb:
    # 사용하려는 이미지 / 로컬 혹은 도커 이미지에서 조회됩니다.
    image: "mongo"
    volumes:
      # -v 플래그와 함께 사용한 것과 정확히 동일합니다.
      # 볼륨이름:/컨테이너 내부 경로 : read only
      - data:/data/db:ro
    environment:
      # 총 3가지 방식으로 지정이 가능합니다.
      Name: value
      env_file:
        - ./.env
      # - PASSWORD=SECRET
    networks:
      # 컴포즈가 모든 서비스를 즉시 네트워크에 추가합니다.
 

'TIL > 개념정리' 카테고리의 다른 글

Docker 배포  (0) 2024.04.03
PyTorch 튜토리얼  (0) 2024.04.01
Amazon Bedrock과 Langchain Workshop  (0) 2024.03.21
Docker network  (0) 2024.03.20
Docker ARG / ENV Variables(인수와 환경변수)  (0) 2024.03.18
복사했습니다!