Connecting

불좀 꺼줄래? 내 Docker좀 보게 PART 8 - Docker-Compose 기본 개념 본문

Container

불좀 꺼줄래? 내 Docker좀 보게 PART 8 - Docker-Compose 기본 개념

팬도라 2020. 11. 17. 12:21
반응형

Overview of Docker Compose

Docker가 주는 독립된 애플리케이션 실행 환경 덕분에 많은 이득을 얻은 덕분에 개발환경도 빠르게 구축하기 위한 프로젝트인 fig 프로젝트가 나오게 되었다. 초창기 단순 Docker 명령을 한 번에 실행하기 위한 서드파티 도구였지만 인기를 얻자 Docker가 이를 흡수하여 Docker Compose 도구를 개발하게 되었다. 이를 활용하면 컨테이너를 실행하는데 필요한 옵션과 의존성 및 실행 순서를 한 번에 정의하여 작성하고 실행할 수 있다.

Docker Compose install

기본적으로 윈도우, Mac 사용자의 경우 위에서 Docker를 설치하게 되면 같이 Docker Compose도 같이 설치되기 때문에 따로 설정이 필요가 없으나, 리눅스 사용자의 경우 다음과 같이 추가적으로 설치를 진행할 필요가 있다.

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

$ sudo chmod +x /usr/local/bin/docker-compose

How to use Docker Compose ?

실습을 정상적으로 진행하기 위해서 다음 명령을 통해 Docker Compose의 버전을 확인한다.

$ docker-compose --version
docker-compose version 1.27.4, build 40524192

Docker compose command

몇 가지 Docker Compose 파일을 작성해 보고 내용을 실습하도록 하겠다. 모든 파일의 이름은 docker-compose.yml로 작성한다.

version

docker-compose 파일을 작성할 때 버전을 작성하는 부분이다. Docker 버전 혹은 파일 규격에 따라 지원하는 옵션이 달라지게 되는데 버전을 3으로 지정하게 되면 3으로 시작하는 최신 버전을 사용하겠다는 의미가 된다. 현재 가장 최신 버전은 2020년 10월 기준 3.8이며 Docker 19.03.0 이상에서만 정상적으로 동작한다.

하지만 모든 파일과 옵션이 가장 최신의 버전만을 지원하는 것은 아니기 때문에 각 환경 혹은 옵션에 따라서 버전의 차이는 존재할 수 있다.

version: '3.4' 

image

docker-compose에서 실행할 이미지를 지정할 수 있으며, 만약 이미지가 로컬에 없는 경우에는 Docker Hub에서 이미지를 다운로드한다.

services: # 앞으로 실행할 애플리케이션이 서비스임을 지칭한다. 
  xpressengine:
    image: jusk2/xpressengine

build

Docker Hub 혹은 개인 레파지토리에 이미지가 저장되어 있지 않거나, Dockerfile을 통해 이미지를 직접 생성하고자 하는 경우에 사용한다.

services:
  nginx:
    build: .

Dockerfile의 이름이 다르거나 다른 경로에 존재한다면 다음과 같이 수행할 수 있다.

services:
  nginx:
  build:
    context: /home/lucas            # Dockerfile이 있는 경로 (절대경로 또는 상대경로)
    dockerfile: Dockerfile-Dev    # 파일명이 Dockerfile이 아닐 경우 파일명 기입
  odoo13:
    container_name: odoo13
    image: odoo:latest
    command: -- --dev=reload

command / entrypoint

Dockerfile의 cmd, entrypoint와 거의 동일하다. 단, docker-compose의 entrypoint 우선순위가 높으며, Dockerfile에 이미 정의가 되어 있을지라도 docker-compose가 이를 덮어써서 명령을 수행한다.

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

links

각각의 컨테이너와 네트워크, 볼륨 등을 연결시켜주는 명령어이지만 현재는 사용하지 않는다.

links:
  - webserver  

ports

컨테이너와 외부 호스트 간의 포트를 바인딩 하기 위한 명령어로서 바인딩할 포트를 여러 개 지정하거나, 포트의 범위 등을 지정할 수 있다. ""을 통해 문자열로 지정할 수 있다.

services:
  database:
    image: mariadb
       ports:
     - 3306:3306
services:
  controller:
    image: ngrinder/controller
    restart: always
    ports: 
      - "1000:80"
      - "16001:16001"
      - "12000-12009:12000-12009"

depends_on

컨테이너 애플리케이션 즉 서비스가 종속적 순서대로 실행할 수 있음을 보장한다. 예를 들어 웹 애플리케이션과 데이터베이스가 존재한다면, 데이터베이스가 실행되고 그다음 웹 애플리케이션이 실행될 수 있도록 설정할 수 있다.

service:
    db:
      image: postgres

    web:
        image: nginx
    depend_on: db

environment, env_file

컨테이너를 실행할 때 필요한 환경변수를 입력한다. 환경 변수 파일을 직접 읽어서 사용할 수도 있다.

services:
    database:
    image: mariadb
    environment:  
      MYSQL_ROOT_PASSWORD: 1q2w3e4r!!
      MYSQL_DATABASE: xpress
      MYSQL_USER: lucas
      MYSQL_PASSWORD: 1q2w3e4r!!
env_file:
  - ./common.env
  - ./apps/web.env

container_name

컨테이너의 이름을 지정한다.

services:
  db:
    container_name: postgresql-odoo13

volumes

컨테이너와 호스트 간의 볼륨을 마운트 하는 데 사용된다. 추가적으로 :ro를 통해서 볼륨을 읽기 전용으로 실행할 수 있다.

volumes:
  - /var/log/test:/var/log
  - ~/configs:/etc/configs/:ro

docker-compose.yml 실행, 중지, 로그 확인하기

위에서 만들어진 docker-compose.yml을 실행하고 중지하는 방법이다. 다음 명령을 실습하여 진행한다.

$ ls
docker-compose.yml 

$ docker-compose up
$ docker-compose up -d # 데몬으로 실행한다. 

$ docker-compose stop # docker-compose.yml로 실행된 모든 컨테이너 서비스를 중지한다. 

$ docker-compose logs # docker-compose.yml로 정의된 컨테이너의 로그를 보여준다 
$ docker-compose logs -f # 로그를 계속 보여준다. 

Comments