도커 컴포즈 시작하기

·2023년 2월 17일
0

docker

목록 보기
5/7
post-thumbnail

도커 컴포즈

도커 컴포즈는 docker build , docker run 명령을 대채할 수 있는 도구로, 하나의 구성 파일만으로도 다중 컨테이너를 실행하도록 해준다. docker-compose.yaml 이라는 설정 파일을 작성해주기만 하면, 도커 컴포즈가 해당 파일을 바탕으로 이미지를 빌드하고 네트워크, 볼륨, 포트, 환경변수까지 설정하여 컨테이너를 실행하고 관리해준다. 단 Dockerfile 을 대체하는 것은 아니다. 커스텀 이미지를 생성하는 경우에는 여전히 작성된 Dockerfile 의 내용을 기반으로 이미지를 생성한다.

도커 컴포즈 시작하기

도커 컴포즈를 사용하기 위해서는 모든 어플리케이션을 감싸고 있는 폴더에, docker-compose.yaml 파일을 생성해야 한다.

그리고 docker-compose.yaml 파일에 어플리케이션을 실행하기 위해 필요한 이미지, 컨테이너, 네트워크, 볼륨 등의 설정을 명시해주어야 한다. 또한 다중 컨테이너 간의 의존성을 설정하기 위해서는 docker-compose.yaml 파일을 작성할 때 depends_on 또는 links 키워드를 사용해주어야 한다. 도커 컴포즈는 설정이 끝나면 docker-compose up 명령을 사용하여 모든 컨테이너를 시작할 수 있다. docker-compose up 명령은 기본적으로 또한 docker-compose down 명령을 사용하여 모든 컨테이너를 중지하고, 리소스를 정리할 수도 있다.

  • version : 도커 컴포즈 설정 파일의 구문 버전을 설정해주는 역할을 한다.

  • services : 컨테이너로 실행할 어플리케이션 및 도커 이미지, 네트워크, 볼륨, 환경변수 등의 설정을 기술해준다. 각 서비스는 해당 이름을 가지고 있으며, 각각의 서비스는 각각의 도커 이미지를 실행하게 된다.

  • image : 도커 허브를 통해, 해당 이름의 템플릿 이미지를 가져온다. Dockerfile 을 통한 커스텀 이미지 생성은 build 를 통해 할 수 있다.

  • volumns : 컨테이너 생성 시 사용할 볼륨을 작성한다. 명명된 볼륨의 경우, 다른 컨테이너가 공유할 수도 있기 때문에, 명명된 볼륨을 사용하는 경우에는 services 와 동일한 레벨에서 (top 레벨에서) volumns 를 작성하여, 해당 명명된 볼륨의 이름을 작성해줘야 한다.

  • environment : 환경 변수를 작성한다. 환경 변수는 - 를 통해 커맨드와 같이 작성하거나 혹은 key:value 형식으로 작성하는 것이 가능하다.

  • env_file : environment 로 설정하는 것 외에도, 환경 변수 파일을 만든 후, 파일의 정보를 가져오는 것이 가능하다. env_file 을 사용하는 경우에는 해당 파일의 경로를 작성해주면 된다.

  • build : Dockerfile 경로를 작성하여, 해당 내용을 기반으로 빌드하도록 도와줍니다.

  • depends_on : 다른 컨테이너가 먼저 실행되고 나서 해당 컨테이너를 실행해야할 경우 사용한다.

  • container_name : 해당 컨테이너의 이름을 직접 설정하는 것이 가능하다. 컨테이너 이름을 설정하지 않는 경우, 폴더이름_서비스이름_증가하는숫자 형태로 자동으로 설정된다. 만약 도커 네트워크를 통해 해당 컨테이너의 IP 주소를 가져오는 경우에 폴더이름_서비스이름_증가하는숫자 를 쓰지 않고, 서비스 이름만 작성해도 가져오는 것이 가능하다.

version: 'version'

services:
  mongodb: 
    image: "mongo"
    volumes: 
      - data:/data/db
    # container_name: mongodb
    # environment:
    #  MONGO_INITDB_ROOT_USERNAME: xxx
    #  MONGO_INITDB_ROOT_PASSWORD : xxxxxx
      # - MONGO_INITDB_ROOT_PASSWORD=xxxxxx
    env_file:
      - ./env/mongo.env
  backend: 
    # image: "goals-node"
    build: ./backend
    # build:
      # context: ./backend
      # dockerfile: Dockerfile 
      # 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
    # -it 설정, react-script 버전 최신으로 해서 나는 안해도됨
    # stdin_open: true
    # tty: true
    depends_on:
      - backend    

volumes:
  data:
  logs:

도커 컴포즈 실행하기

  • docker-compose up : docker-compose.yaml 내용을 바탕으로, 설정파일을 읽어들여 도커 이미지를 빌드하고, 네트워크를 구성하고, 볼륨을 연결하고, 환경변수를 설정하고 컨테이너를 실행하는 단계를 수행한다. 기본적으로는 attached mode 로 실행이 된다.

    • —d : docker-compose up 의 전체 실행과정이 detached mode 로 실행된다.
    • —build : 이미지가 존재하여도, 강제적으로 리빌드 한다.
  • docker-compose down : 명령을 사용하여 모든 컨테이너를 중지하고, 리소스를 정리한다.

    • -v : 관련된 볼륨을 삭제한다.
  • docker-compose build : docker-compose.yaml 내용을 바탕으로, 도커 이미지를 빌드한다. (컨테이너는 실행되지 않는다.)

도커 컴포즈의 이점

  • 네트워크 설정이 필요없다. yaml 파일에 의해 실행되는 모든 컨테이너는 하나의 네트워크로 연결이 된다. networks 를 통해 특정 네트워크를 직접 설정하는 것도 가능하다.

  • 다수의 이미지와 컨테이너를 설정만 한다면, 하나의 커맨드만으로 정파일을 읽어들여 도커 이미지를 빌드하고, 네트워크를 구성하고, 볼륨을 연결하고, 환경변수를 설정하고 컨테이너를 실행하는 단계를 수행한다.

  • 동일하게 하나의 커맨드만으로, 컨테이너를 종료하는 것이 가능하다.

profile
새로운 것에 관심이 많고, 프로젝트 설계 및 최적화를 좋아합니다.

0개의 댓글