심심한 개발자의 취미생활

docker compose

Docker Compose는 여러 개의 컨테이너를 사용하는 애플리케이션을 정의하고 실행하기 위한 컨테이너 관리 도구 입니다. 복잡한 컨테이너 환경을 YAML 파일 하나로 구성하고 docker-compose 명령어 하나로 서비스 전체의 실행/관리를 진행할 수 있습니다. docker-compose.yml 설정 파일을 통해 컨테이너의 구성, 네트워크, 볼륨, 환경 변수 등을 선언적으로 정의가 가능하며 명령어 한줄로 모든 서비스를 한번에 관리가 가능합니다.

docker-compose.yml 구조

services:
    CONTAINER_NAME1:
        image: IMAGE_NAME1
        ports:
            - 내컴퓨터포트:컨테이너포트
        environment:
            - 환경변수1=값
            - 환경변수2=값
            - 환경변수3=${외부파일값}
        networks:
            - NETWORK_NAME1
            - NETWORK_NAME2

    CONTAINER_NAME2:
        image: IMAGE_NAME2
        ports:
            - 내컴퓨터포트:컨테이너포트
        environment:
            - 환경변수1=값
            - 환경변수2=값
            - 환경변수3=${외부파일값}
        depends_on:
            - CONTAINER_NAME1
        networks:
            - NETWORK_NAME1

    CONTAINER_NAME3:
        image: IMAGE_NAME3
        ports:
            - 내컴퓨터포트:컨테이너포트
        deploy: 
            mode: replicated
            replicas: 3
        networks:
            - NETWORK_NAME2
        volumes:
            - VOLUME_NAME:path
        restart: always
        build: .
        command: ["arg1", "arg2"]
        develop:
            watch:
                - action: sync
                    path: 내컴퓨터경로
                    target: 컨테이너경로
                    ignore:
                        - 반영안할아이템
                - action: rebuild
                    path: package.json
        

networks:
    NETWORK_NAME1:
    NETWORK_NAME2:

volumes:
    VOLUME_NAME:
        external: true

기본 명령어

  • 컨테이너 생성 및 실행

    • docker compose up -d
  • 컨테이너(서비스) 중지

    • docker compose stop
  • 컨테이너, 네트워크 중지 및 삭제

    • docker compose down

docker compose

네트워크

  • docker compose의 service: 하위 항목에 있는 컨테이너들은 자동으로 하나의 네트워크로 묶이게 된다.
  • 별도의 네트워크를 선언하고 서비스 별로 네트워크를 지정하면 네트워크를 더 세부적으로 분리할 수 있다.

컨테이너간 dependency

  • 컨테이너들을 생성할 때 실행 순서나 컨테이너간의 종속성을 가지게 되는 경우가 있다. 그럴 경우 depends_on: 하위 항목으로 다른 서비스의 이름을 기재하게 되면 기재된 서비스 컨테이너가 먼저 생성 및 실행하고 다음으로 생성된다.

Deploy

  • 서비스 배포 전략, 리소스, 복제 등을 설정한다.

volume

  • docker compose 환경에서 volume: 설정을 활용하여 컨테이너 별 volume을 관리 할 수 있다

restart

  • 컨테이너가 이슈로 인해 종료 되었을 경우 자동으로 재 시작 하기 위해서 설정한다. 다만 docker 명령어나 컨테이너를 직접 정지시켰을 경우에는 자동 재시작은 작동하지 않는다.

빌드 자동화

  • 개발 환경을 컨테이너에 구축하고 프로젝트를 진행하는 경우가 자주 있는데 이 경우 down -> image build -> up 과정을 자동화 할 수 있다.
  • 서비스 내부에 build:도커파일경로를 입력하면 docker compose up 할 때마다 해당 경로에 있는 도커 파일을 자동으로 build 하여 이미지를 생성하고 컨테이너를 생성한다.
  • 하지만 자동으로 build를 진행하기 위해서는 docker compose up --build 명령어를 사용하여야 한다.

watch

  • watch 기능은 특정 파일 및 폴더가 변경될 때 마다 연결된 컨테이너 경로에 동기/비동기적으로 반영한다.
    • action:
      • sync<+restart> : 동적으로 반영, +restart 는 반영 후 자동 재시작
      • rebuild : 반영 후 재 빌드
    • path : 내 컴퓨터의 감지랗 폴더 경로
    • target : 반영할 컨테이너의 경로
    • ignore : 변동사항을 적용할 필요가 없는 파일이나 아이템을 작성. dockerignore파일로 대체 가능

command

  • compose 파일 내부에 command 명령을 사용하면 Dockerfile의 CMD 명령어를 덮어 쓸수 있다.