본문 바로가기

Docker

도커 컴포즈

도커 컴포즈


여러 개의 컨테이너가 하나의 애플리케이션으로 동작할 때 이를 테스트하려면 각 컨테이너를 하나씩 생성해야 한다. 매번 run 명령어에 옵션을 설정해 CLI로 컨테이너를 생성하기보다는 여러 개의 컨테이너를 하나의 서비스로 정의해 컨테이너 묶음으로 관리할 수 있다면 더욱 편리하다.

 

이를 위해 도커 컴포즈는 컨테이너를 이용한 서비스의 개발과 CI를 위해 여러 개의 컨테이너를 하나의 프로젝트로서 다룰 수 있는 작업 환경을 제공한다. 도커 컴포즈는 여러 개의 컨테이너의 옵션과 환경을 정의한 파일을 읽어 컨테이너를 순차적으로 생성하는 방식으로 동작한다.

 

도커 컴포즈 설치


도커 컴포즈는 따로 설치를 해줘야 한다. 아래 명령어로 curl 을 통해 설치를 하고 chmod +x로 실행권한을 부여한다.

sudo curl -L https://github.com/docker/compose/releases/download/1.25.0-rc2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

 

도커 컴포즈는 yaml 파일을 작성해서 사용한다. 아래 예제는 apache 웹서버와 mysql 데이터베이스를 생성하는 docker-compose.yml 파일이다.

 

version: '3.0'
services:
  web:
    image: develone/composetest:web
    ports:
      - "80:80"
    links:
      - mysql:db
    command: apachectl -DFOREGROUND
  mysql:
    image: develone/composetest:mysql
    command : mysqld

 

YAML 파일에서 들여쓰기할 때 탭(Tab)은 도커 컴포즈가 인식하지 못하므로 2개의 공백(Space)을 사용해 하위 항목을 구분해야 한다.

 

해당 yaml 파일로 컨테이너를 생성하려면 docker-compose up -d 명령어로 컨테이너를 생성해야 한다.

 

도커 컴포즈 파일 설명


version

 

YAML 파일 포맷의 버전을 나타낸다. 도컴 컴포즈 1.8은 버전 2를, 도커 컴포즈 1.9는 버전 2.1을, 도컴 컴포즈 1.10은 버전 3.0을 사용한다.

 

services

 

생성될 컨테이너들을 묶어놓은 단위이다. 서비스 항목 아래에는 각 컨테이너에 적용될 생성 옵션을 지정한다. 

 

web, mysql

 

생성될 서비스의 이름이다. docker run에서 사용하는 옵션과 동일하게 image, ports, links, command 등을 정의할 수 있다.

 

하나의 프로젝트는 여러 개의 서비스로 구성되고, 각 서비스는 여러 개의 컨테이너로 구성된다. docker-compose scale 명령어로 서비스에 여러 개의 컨테이너가 존재할 수 있게 할 수 있다.

 

docker-compose up 명령어 끝에 서비스 이름을 입력해 docker-compose.yml 파일에 명시된 특정 서비스의 컨테이너만 생성할 수 있다. docker-compose run 명령어로 컨테이너를 생성할 수도 있다.

 

생성된 프로젝트는 docker-compose down 명령어로 삭제할 수 있다. 프로젝트는 삭제하면 서비스의 컨테이너 또한 전부 정지된 뒤 삭제된다.

 

도커 컴포즈는 기본적으로 현재 디렉터리의 이름으로 된 프로젝트를 제어한다. 그러나 docker-compose의 -p 옵션에 프로젝트 이름을 사용해 제어할 프로젝트의 이름을 명시할 수도 있다. 

 

도커 컴포즈 활용


기존에 사용하던 run 명령어를 YAML 파일로 변환하는 것이 도커 컴포즈 사용법의 대부분이다.

 

YAML 파일은 크게 버전 정의, 서비스 정의, 볼륨 정의, 네트워크 정의의 4가지 항목으로 구성된다.

 

도커 컴포즈는 기본적으로 현재 디렉터리 또는 상위 디렉터리에서 docker-compose.yml 이라는 이름의 YAML 파일을 찾아서 컨테이넌 생성하지만 -f 옵션을 사용하면 yml 파일의 위치와 이름을 지정할 수 있다.

 

버전 정의

 

YAML 파일 포맷에는 버전 1, 2, 2.1, 3이 있지만 최신 버전의 도커 컴포즈를 사용하는 것이 좋음으로 버전 3으로 사용하는것이 권고된다

 

version: '3.0'

 

서비스 정의

 

서비스는 도커 컴포즈로 생성할 컨테이너 옵션을 정의한다. 주요 컨테이너 옵션만 설명할 것이기 때문에 설명하지 않은 서비스 항목에 대해서는 공식 문서(https://docs.docker.com/compose/compose-file/)에서 참고할 수 있다.

 

  • image

서비스의 컨테이너를 생성할 때 쓰일 이미지의 이름을 설정한다.

 

  • links

docker run 명령어의 --link와 같다. 

 

  • environment

docker run 명령어의 --env, -e 옵션과 동일하다

 

environment:
  - MYSQL_ROOT_PASSWORD=password
  - MYSQL_DATABASE_NAME=mydb

OR

environment:
  MYSQL_ROOT_PASSWORD: password
  MYSQL_DATABASE_NAME: mydb

 

  • command

컨테이너가 실행될 때 수행할 명령어를 설정하며, docker run 명령어의 마지막에 붙는 커맨드와 같다. Dockerfile의 RUN과 같은 배열 형태로도 사용할 수 있다.

 

command: apachectl -DFOREGROUND

OR

command: [apachectl, -DFOREGROUND]

 

  • depends_on

특정 컨테이너에 대한 의존 관계를 나타내며 이 항목에 명시된 컨테이너가 먼저 생성되고 실행된다

 

services:
  web:
    image: develone/composetest:web
    depends_on
      - mysql
  mysql:
    image: develone/composetest:mysql

mysql 컨테이너가 먼저 생성되고 web 컨테이너가 생성이 된다.

 

  • ports

docker run 명령어의 -p 옵션과 같으며 서비스의 컨테이너를 개방할 포트를 설정한다.

  • build

build 항목에 정의된 도커파일에서 이미지를 빌드해 서비스의 컨테이너를 생성하도록 설정한다. 새롭게 빌드될 이미지의 이름은 image 항목에 정의된 이름으로 설정된다.

 

services:
  web:
    build: ./composetest
    image: develone/composetest:web

 

  • extends

다른 YAML 파일이나 현재 YAML 파일에서 서비스 속성을 상속받게 설정한다.

 

### extend-compose.yml
version: '3.0'
  services:
    extend_web:
      image: ubuntu:14.04
      ports:
        - "80:80"

### docker-compose.yml
version: '3.0'
  services:
    web:
      extends:
        file: extend-compose.yml
        service: extend_web

 

web 서비스가 extend-compose.yml 의 extend_web 서비스의 옵션을 물려받는다.

 

도커 컴포즈 네트워크


YAML 파일에 네트워크 항목을 정의하지 않으면 도커 컴포즈는 프로젝트별로 브리지 타입의 네트워크를 생성한다. 생성된 네트워크의 이름은 {프로젝트 이름}_default로 설정되며, docker-compose up 명령어로 생성되고 docker-compose down 명령어로 삭제된다.

 

 

'Docker' 카테고리의 다른 글

도커 스웜  (0) 2021.09.20
도커 데몬 모니터링  (0) 2021.09.18
도커 파일  (0) 2021.09.12
도커 이미지 관리  (0) 2021.09.11
컨테이너 자원 할당 제한  (0) 2021.09.11