Profile picture

[Docker Compose] YAML 필드 살펴보기

JaehyoJJAng2022년 04월 16일

◾️ Docker Compose


Docker-Compose를 사용하면 여러 개의 컨테이너로 구성된 애플리케이션을 하나의 파일에 정의해놓고 한 번에 올리거나 내릴 수 있다

이러한 편의때문에 docker-compose 는 특히 로컬 개발 환경이나 자동화 환경에서 간단한 컨테이너 오케스트레이션 도구로 많이 사용된다


◾️ 기본 구조

Docker Compose는 기본적으로 docker-compose.yml 파일을 설정 파일로 사용하고 프로젝트의 최상위 디렉토리에 위치시키는게 일반적이다

docker-compose.yml 은 다음과 같은 구조를 갖는다

version: "3"
services:
  web:
    # 웹 어플리케이션 설정
  db:
    # DB 설정

networks:
  # 네트워크 설정
volumes:
  # 볼륨 설정

docker compose에서 서비스는 독립된 컨테이너에서 돌아가는 애플리케이션의 구성 요소라고 생각하면 된다.

가장 먼저 프로젝트에서 개발하는 애플리케이션 자체가 서비스 될 것이고, 그 밖에 해당 애플리케이션이 의존하는 데이터베이스나 캐시 등도 서비스가 될 수 있다.

그렇기 때문에 로컬에 별도로 DB를 구축하거나 설정하는 등의 추가 작업이 필요 없이 docker compose 커맨드 하나로 모든 어플리케이션을 배포하고 관리할 수 있는 것이다.


◾️ 옵션 살펴보기

▪️ build

build 항목은 해당 서비스의 이미지를 빌드하기 위한 Dockerfile이 위치하는 경로를 지정하기 위해 사용된다

예를 들어, docker-compose.yml 파일과 동일한 디렉토리에 위치한 Dockerfile을 사용하여 db 서비스의 이미지를 빌드하려면 아래처럼 사용하면 된다

services:
  db:
    build: .

Dockerfile이 아닌 다른 이름의 파일로 빌드를 하고 싶거나, 빌드 인자를 넘겨야 하는 경우에는 다음과 같이 하위 항목을 사용하여 조금 더 구체적으로 명시가 가능하다.

services:
  db:
    build:
      context: MySQL/
      dockerfile: Dockerfile-prod
      args:
        env: "product"

▪️ image

프로젝트에서 직접 개발하지 않는 데이터베이스나 캐시와 같은 경우에는 이미지를 직접 빌드하는 대신에 이미지 저장소로부터 이미지를 내려받아서 사용하는 것이 일반적이다.

image 항목은 이미지 저장소로부터 내려받을 이미지의 이름과 태그를 명시하는데 사용됨

services:
  flask:
    image: flask:latest

▪️ ports

ports 항목은 외부로 노출시킬 포트의 맵핑을 명시. 바인드가 필요한 호스트 외부 포트와 컨테이너 내부 포트를 지정해주면 된다

services:
  flask:
    ports:
      - "5000:4000"

▪️ volumes

volumes 항목은 볼륨 설정을 위해 쓰인다. 마운트가 필요한 호스트의 경로와 컨테이너의 경로를 명시해주면 된다

services:
  flask:
    volumes:
      - "app/:/app"

driver

driver 항목은 볼륨을 생성할 때 사용될 드라이버를 정의한다.

어떠한 설정도 하지 않으면 기본 값인 local로 설정되고 사용하는 드라이버에 따라 변경해야 한다.

드라이버를 사용하기 위한 추가 옵션은 하위 항목인 driver_opts를 통해 인자로 설정할 수 있다

volumes:
  driver: test-driver
    driver-opts:
      opts: "oog"

▪️ external

Docker Compose는 YAML 파일에서 volume, volume-from 옵션 등을 사용하면 프로젝트마다 볼륨을 자동으로 생성한다.

이 때 external 항목을 사용하면 볼륨을 프로젝트 생성할 때 마다 매번 생성하지 않고 기존 볼륨을 사용하도록 설정할 수 있다.

다음 예시는 test_volume 이라는 이름의 외부 볼륨을 생성하고 해당 외부 볼륨을 db 서비스의 컨테이너에 마운트하는 예시이다.


볼륨 생성

$ docker volume create test_volume

docker-compose.yml

services:
  db:
    image: mysql:5.7
    volumes:
      - "test_volume:/var/lib/mysql"

volumes:
  test_volume:
    external: true

▪️ depends_on

depends_on 항목은 서비스 간 의존 관계를 지정하기 위해서 사용된다.

예를 들면 웹 어플리케이션이 올라오기 전에 데이터베이스가 먼저 올라와야 한다면 다음과 같이 설정하면 된다

services:
  flask:
    depends_on:
      - "mysql:db"
  mysql:
    image: mysql:5.7

▪️ command

command 항목은 해당 서비스가 올라올 때 DockerfileCMD 명령문을 무시하고 실행할 명령어를 설정하기 위해 사용된다

services:
  web:
    command: node server.js

▪️ environment

환경변수를 설정하기 위해 사용된다

services:
  db:
    environment:
      MYSQL_ROOT_PASSWORD: root

▪️ env_file

민감한 환경변수의 경우에는 보안을 위하여 docker-compose.yaml 파일에 노출시키지 않아야 한다.

그런 상황에서 env_fiel 옵션을 사용하면 환경변수를 파일에 저장하고 해당 파일을 읽어와서 컨테이너에 등록 시킬 수 있다.


docker-compose.yml

services:
  db:
    env_file:
      - ".mysql.env"

.mysql.env

MYSQL_ROOT_PASSWORD=root

docker run 명령어의 --link 와 기능이 동일하다.

다른 서비스에 서비스명만으로 접근할 수 있도록 설정한다

SERVICE:ALIAS 형식을 사용하면 서비스에 별칭으로도 접근 가능하다

services:
  db:
    links:
      - "db:_mydb"
      - "flask"
      - "wordpress:wp"
  flask:
    image: yshrim12/web-flask:1.2.1
  wordpress:
    image: yshrim12/wp-test.1.1.1


Loading script...