42 Seoul

[Inception] Docker Compose

jaewpark 2022. 10. 27. 16:37

Docker Compose

  • 다수의 "docker build" 와 "docker run" 명령을 대체할 수 있는 도구로써, 단 하나의 구성 파일로 다수의 명령을 실행할 수 있도록 도와 줍니다
  • 모든 서비스 모든 컨테이너를 즉시 시작하고 필요하다면 모든 필요한 이미지를 빌드하는 orchestraion(컨테이너의 배포, 관리, 확장, 네트워킹을 자동화) 명령 셋 입니다.
  • 누구와도 공유할 수 있는 명확히 정의된 언어를 구성 파일로 가지고 있어, 아래와 같은 코드로 명령을 하는 게 아닌 구성 파일을 활용한 단 하나의 명령으로 전체 다중 컨테이너 애플리케이션을 시작하거나 중단할 수 있습니다.
docker run --name mongodb \
  -e MONGO_INITDB_ROOT_USERNAME=max \
  -e MONGO_INITDB_ROOT_PASSWORD=secret \
  -v data:/data/db \
  --rm \
  - d\
  --network goals-net \
  mongo
  • 하나의 컨테이너만 있어도 사용가능 하지만, 컨테이너가 있을 때 빛을 냅니다.  그 이유는 여러 개의 컨테이너를 핸들링 할 때 많은 부가적인 명령과 시간을 절약이 되기 때문입니다.
구성 파일은 YAML 파일로 애플리케이션 서비스를 구성하는 거라 생각하고 이후 설명 및 작성 방법을 통해서 알아가면 될 거 같습니다.

 

Docker Compose is NOT

  • 도커 컴포즈는 커스텀 이미지를 위한 도커파일을 대체하지 않습니다.
  • 이미지나 컨테이너를 대체하지 않습니다
  • 다수의 호스트에서 다중 컨테이너를 관리하는데 적합하지 않습니다

 

Services (Containers)

: 다중 컨테이너 애플리케이션을 구성하는 컨테이너로 Compose에서 중요한 핵심입니다.

  • 게시해야하는 포트를 정의
  • 컨테이너에 필요한 환경 변수를 정의
  • 컨테이너에 할당해야하는 볼륨을 정의
  • 네트워크를 할당

 

Compose 파일 작성

  • 우선 Compose 파일은 위에서 언급되었듯 Dockerfile를 대체 할 수 없기에 있어야만 합니다.
  • 프로젝트 폴더 안에 yml 혹은 yaml 파일을 만듭니다.
  • 들여쓰기를 통해서 구성 옵션간의 종속성을 표현하는 특정 텍스트 포맷입니다.
Visual Studio에서 작업시, EXTENSION에서 Dokcer를 설치하게 되면 자동완성을 통해 쉽게 작성할 수 있습니다.

구성 

  • version
  • sevices
  • volumes

 

version

// inception.yaml
varsion: "숫자"

YAML파일을 작성할 때, 우선적으로 작성해야 되는 것으로 이름이 version 이지만 앱이나 파일의 버전을 의미하는 게 아닌 도커 컴포즈 사양의 버전을 지정하는 것입니다. 사용하는 버전을 도커에 알리고 우리가 사용하고 싶은 기능과 사용할 수 있기를 원하는 기능에 대해서 알리는 역할을 합니다.(참고)

 

services 

두개의 공백으로 들여쓰기된 모든 것은 직계 후손입니다. services에는 여러 하위 요소를 가질 수 있는 최소한 하나의 하위 요소를 필요로 합니다. services의 자식들은 컨테이너 입니다. 동등한 자식들은 services에서 두 개의 공백의 들여쓰기가 동일선상에 있어야만 합니다. 그리고 자식들의 옵션을 설정하기 위해서는 또다시 두개의 공백을 들여쓰기하면 됩니다.

// inception.yaml
version: "3.0"
services:
  [서비스명1]:
    ... 옵션 설정
  [서비스명2]:
    ... 옵션 설정

 

 

서비스를 중단하면 서비스가 제거되며 detached 모드를 사용하는 것으로 간주되는 것이 default 로 설정되어 있습니다.

image: 이미지 이름

volumes: 볼륨을 추가, 추가하고자 하는 모든 볼륨에 대해 '-' 를 추가합니다

// inception.yaml
version: "3.0"
services:
  mongodb:
    image: 'mongo'
    volumes:
      - data:/data/db
      - ... 다중 볼륨
  [서비스명2]:
    ... 옵션 설정

environment: 환경변수를 특정

// inception.yaml
version: "3.0"
services:
  mongodb:
    image: 'mongo'
    volumes:
      - data:/data/db
    environment:
      # YAML에서는 #을 이용해서 주석 처리할 수 있습니다.
      # 아래 둘 다 동일한 역할입니다.
      MONGO_INITDB_ROOT_USERNAME: max
      - MONGO_INITDB_ROOT_USERNAME=max
  [서비스명2]:
    ... 옵션 설정
key: value와 같은 형식이 아닌 경우에는 '-' 를 필수로 사용해야만 합니다.

env_file: environment 를 사용하지 않고 환경변수를 파일로 관리를 할 수도 있습니다.

// env/mongo.env
MONGO_INITDB_ROOT_USERNAME: max
MONGO_INITDB_ROOT_PASSWORD: secret

// inception.yaml
version: "3.0"
services:
  mongodb:
    image: 'mongo'
    volumes:
      - data:/data/db
    env_file:
      - ./env/mongo.env
  [서비스명2]:
    ... 옵션 설정

networks: 자체적인 포트를 추가할 수 있지만, 입력을 하지 않아도 docker에서는 컴포즈 파일에 특정된 모든 서비스에 대해 새 환경을 자동으로 생성하고 모든 서비스를 즉시 그 네트워크에 추가하기 때문입니다.

// env/mongo.env
MONGO_INITDB_ROOT_USERNAME: max
MONGO_INITDB_ROOT_PASSWORD: secret

// inception.yaml
version: "3.0"
services:
  mongodb:
    image: 'mongo'
    volumes:
      - data:/data/db
    env_file:
      - ./env/mongo.env
    networks:
      - goals-net
  [서비스명2]:
    ... 옵션 설정
위와 같이 작성한다면, 자동 생성된 default 네트워크 뿐만 아니라 위에서 지정된 특정 네트워크에도 추가됩니다

 

volumes

servies에서 사용 중인 명명된 볼륨이 나열되어야 합니다

도커가 services를 위해 생성해야 하는 명명된 볼륨을 인식하기 위해 필요한 구문으로 : 콜론 뒤에 값은 없어도 됩니다.

다른 서비스에서 동일한 볼륨 이름을 사용하면 그 볼륨이 공유됩니다

// inception.yaml
version: "3.0"
services:
  mongodb:
    image: 'mongo'
    volumes:
      - data:/data/db
    environment:
      - MONGO_INITDB_ROOT_USERNAME=max
      - MONGO_INITDB_ROOT_PASSWORD=secret
volumes:
  data:
여기에서는 mongodb에서 쓰인 data를 작성하면 됩니다

 

다중 컨테이너 작업

build: 완성된 이미지를 사용하기 보다는 docker-compose에 이미지를 빌드하는데 필요한 모든 정보를 제공할 수도 있습니다. 이미지가 속한 컨테이너 아래에 dockerfile 을 빌드하려 합니다.

// inception.yaml
version: "3.0"
services:
  mongodb:
    image: 'mongo'
    volumes:
      - data:/data/db
    environment:
      - MONGO_INITDB_ROOT_USERNAME=max
      - MONGO_INITDB_ROOT_PASSWORD=secret
  backend:
    build: ./backend
    # build:
    #   context: ./backend
    #   dockerfile: Dockerfile
volumes:
  data:

port: 포트를 연결합니다.

depends_on: docker-compose는 여러 서비스를 만들고 시작하는데 만들어진 컨테이너가 다른 컨테이너를 의존할 수 있게 만듭니다.

// inception.yaml
version: "3.0"
services:
  mongodb:
    image: 'mongo'
    volumes:
      - data:/data/db
    env_file:
      - ./env/mongo.env
  backend:
    build: ./backend
    ports:
      - '80:80'
    volumes:
      - logs:/app/logs
      - .backend:/app
      - /app/node_modules
    env_file:
      - ./env/backend.env
    depends_on:
      - mongodb
volumes:
  data:
  logs:

 

또 다른 컨테이너 추가하기

build: Dockerfile 이미지가 빌드 되도록 지정하고자 하는 폴더, 도커는 다시 실행할때마다 항상 이미지를 다시 빌드하지 않고 변경된 경우가 있는 경우에만 리빌드가 됩니다.

stdin_open: true로 설정, 개방형 입력 연결이 필요하다는 것을 도커에 알립니다.

tty: true로 설정, 터미널에 연결하기 위한 플래그입니다.

stdin_open 과 tty 옵션을 다 주게 되면  frontend 컨테이너가 인터렉티브 모드에서 시작됩니다.

// inception.yaml
version: "3.0"
services:
  mongodb:
    image: 'mongo'
    volumes:
      - data:/data/db
    env_file:
      - ./env/mongo.env
  backend:
    build: ./backend
    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
      
volumes:
  data:
  logs:
-it 플래그는 개방형 표준입력을 위한 '-'와 입력 플래그의 조합입니다

 

docker-compose up & down

# 이미지를 가져와서 컨테이너를 시작
docker-compose up

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

# 컨테이너를 중지
docker-compose down

# 볼륨도 삭제
docker-compose down -v

 


지금까지의 내용을 통해서 docker-compose의 대략적인 역할을 알 수 있었다 생각이 들며,

docker compose --help (참고)

Define and run multi-container applications with Docker.

Usage:
  docker compose [-f <arg>...] [--profile <name>...] [options] [COMMAND] [ARGS...]
  docker compose -h|--help

Options:
  -f, --file FILE             Specify an alternate compose file
                              (default: docker-compose.yml)
  -p, --project-name NAME     Specify an alternate project name
                              (default: directory name)
  --profile NAME              Specify a profile to enable
  --verbose                   Show more output
  --log-level LEVEL           DEPRECATED and not working from 2.0 - Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
  --no-ansi                   Do not print ANSI control characters
  -v, --version               Print version and exit
  -H, --host HOST             Daemon socket to connect to

  --tls                       Use TLS; implied by --tlsverify
  --tlscacert CA_PATH         Trust certs signed only by this CA
  --tlscert CLIENT_CERT_PATH  Path to TLS certificate file
  --tlskey TLS_KEY_PATH       Path to TLS key file
  --tlsverify                 Use TLS and verify the remote
  --skip-hostname-check       Don't check the daemon's hostname against the
                              name specified in the client certificate
  --project-directory PATH    Specify an alternate working directory
                              (default: the path of the Compose file)
  --compatibility             If set, Compose will attempt to convert deploy
                              keys in v3 files to their non-Swarm equivalent

Commands:
  build              Build or rebuild services
  bundle             Generate a Docker bundle from the Compose file
  config             Validate and view the Compose file
  create             Create services
  down               Stop and remove containers, networks, images, and volumes
  events             Receive real time events from containers
  exec               Execute a command in a running container
  help               Get help on a command
  images             List images
  kill               Kill containers
  logs               View output from containers
  pause              Pause services
  port               Print the public port for a port binding
  ps                 List containers
  pull               Pull service images
  push               Push service images
  restart            Restart services
  rm                 Remove stopped containers
  run                Run a one-off command
  scale              Set number of containers for a service
  start              Start services
  stop               Stop services
  top                Display the running processes
  unpause            Unpause services
  up                 Create and start containers
  version            Show the Docker Compose version information

 

해당 내용은 Docker & Kubernetes 강의 중 docker-compose 부분을 정리한 내용입니다.