DEV ℧ Developer Diary

[Docker] 도커 컴포즈 (Docker Compose)란?

해당 포스트는 inflearn에서 subicura님의 초보를 위한 도커 안내서의 강의를 듣고 정리한 문서입니다.

Docker-Compose

컨테이너를 하나하나 docker run 과 같은 명령어를 통해 관리를 해본다고 생각하자.

실제 서비스가 들어갔을 경우 -v-f같은 옵션들이 컨테이너마다 다를것이고, 도커에 대한 컨테이너가 다수일 경우 컨테이너에 대한 관리가 쉽지가 않다.

그래서 도커에서는 Compose 라는 기능을 제공한다.

Docker-Compose 란?

Docker-Compose란, Docker 애플리케이션을 보다 쉽게 정의하고 실행하기 위한 도구이며, YAML 파일을 사용하여 애플리케이션의 서비스를 구성한다.

YAML파일에 Docker에서 사용하는 애플리케이션에 대한 설정들을 작성하면, 하나의 명령어로 사용에 필요한 Docker 컨테이너를 띄울 수 있다.

아래는 redis에 관련된 예시 yaml 파일이다.

# redis-server.yml
version: '3.7'
services:
  redis:
    image: redis:alpine
    command: redis-server --port 6379
    container_name: redis_boot
    hostname: redis_boot
    labels:
      - "name=redis"
      - "mode=standalone"
    ports:
      - 6379:6379

실습

Docker-Compose 버전 확인

아래의 명령어를 사용하면 Docker-compose에 대한 버전을 확인 할 수 있다.

PS C:\WINDOWS\system32> docker-compose version
Docker Compose version v2.15.1

만약 Linux의 경우에는 Docker-compose를 설치해 주어야 한다.

sudo curl -L "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)
sudo chmod +x /usr/local/bin/docker-compose

Docker-Compose 문법

Docker-Compose의 문법에 대해 간략하게 살펴보자.

version

version: '3'

docker-compose.yml 파일을 버전을 명세하는 명령어이다. docker-compose.yml 버전에 따라 지원하는 도커 엔진 버전이 상이하다. 자세한 명세는 아래의 docs 문서에서 확인할 수 있다.

Docker-compose versions

간단하게 정리하자면,

version: '1' : 명시를 생략한다. (service 항목부터 시작) version: '2' : 2버전 이후부터는 2.x의 마이너 버전까지 명시해야 하며, 소수점을 명시하지 않을경우 2.0으로 적용된다. Docker 버전은 Compose 1.6.0+, Engine 1.10.0+ 버전에서 지원된다. version: '3' : Compose와 Docker 엔진의 스웜모드 간에 상호 호환되도록 설계 되었다.

도커 스웜이란? 여러 도커 호스트들을 클러스터로 묶어 주는 컨테이너 오케스트레이션 도구이다.

services

services:
  mysql:
    ...
  redis:
    ...

실행할 컨테이너를 정의한다, service 하단의 mysql는 docker run --name mysql 와 같다고 할 수 있다.

image

services:
  mysql:
    image: mysql:5.7

컨테이너에 사용할 이미지 이름과 태그이다, 태그를 생락하면 :latest의 이미지를 가져온다. 이미지가 없을경우 자동으로 pull을 실행한다.

port

services:
  mysql:
    ...
    ports:
    - "3306:3306"

-p옵션과 같다. 컨테이너와 연결할 포트를 정의한다

{호스트 포트}:{컨테이너 포트}

environment

services:
  mysql:
    ...
    environment:
      - MYSQL_ROOT_PASSWORD=somewordpress: '3'

-e옵션과 같다. 컨테이너에서 사용할 환경변수들을 정의한다.

- {환경변수 이름}:{값}

volumes

services:
  mysql:
    ...
    volumes:
      - ./app:/app

-v옵션과 같다. 컨테이너 디렉토리와 호스트 디렉토리를 연결해주는 옵션을 설정한다.

- {호스트 디렉토리}:{컨테이너 디렉토리}

restart

services:
  mysql:
    restart: always

Docker 컨테이너의 재시작 정책을 정의한다.

restart: no : 기본 정책이며, 어떤 상황에서도 컨테이너가 다시 실행되지 않는다. restart: always : 컨테이너가 중지될 경우 항상 컨테이너를 다시 시작한다. restart: on-failure : 종료코드가 실패시 오류를 나타내는 경우 (0외 다른 종료코드) 컨테이너를 다시 실행한다. restart: unless-stopped : 부팅시 자동으로 컨테이너를 재시작 합니다.

build

django:
  build:
    context: .
    dockerfile: ./compose/django/Dockerfile-dev

도커의 이미지를 자체 빌드 후에 사용한다. image 속성 대신 사용하며, 여기에 사용할 별도의 도커파일을 생성해야 한다.

이하 자세한 문법의 명세는 아래의 공식문서에서 확인 할 수 있다.

  • Version 2

Compose file version 2 reference

  • Version 3

Compose file version 3 reference