Docker Compose 환경 변수의 역할 이해

DockerBeginner
지금 연습하기

소개

이 튜토리얼에서는 Docker Compose 에서 환경 변수의 중요성과 사용법에 대해 안내합니다. Docker 기반 애플리케이션을 구성하기 위해 환경 변수를 정의하고 활용하는 방법을 배우고, 더욱 유연하고 유지 관리 가능한 배포 프로세스를 확보할 수 있습니다. 이 문서를 마치면 Docker Compose 에서 환경 변수의 역할과 효과적인 적용 방법에 대한 확실한 이해를 얻게 될 것입니다.

Docker Compose 에서 환경 변수 이해

Docker Compose 는 다중 컨테이너 애플리케이션을 정의하고 관리하는 강력한 도구입니다. Docker Compose 의 주요 기능 중 하나는 애플리케이션 동작을 구성하고 사용자 지정하는 데 환경 변수를 사용할 수 있다는 것입니다. 환경 변수는 Docker Compose 에서 중요한 역할을 수행하며, 애플리케이션 코드에서 구성을 분리하여 더욱 포터블하고 관리하기 쉽게 만들어줍니다.

환경 변수 이해

환경 변수는 애플리케이션이 실행될 때 사용할 수 있는 키 - 값 쌍의 집합입니다. 애플리케이션이 정상적으로 작동하는 데 필요한 구성 설정, 민감한 정보 및 기타 데이터를 저장하고 액세스하는 방법을 제공합니다.

Docker Compose 의 맥락에서 환경 변수는 서비스 수준에서 정의될 수 있으며, 이를 통해 애플리케이션 내 개별 컨테이너의 동작을 사용자 지정할 수 있습니다. 이러한 유연성을 통해 개발, 스테이징 및 프로덕션과 같은 다양한 환경에 애플리케이션을 쉽게 적응시킬 수 있으며, 애플리케이션 코드를 수정할 필요가 없습니다.

Docker Compose 에서 환경 변수 정의

Docker Compose 파일에서 환경 변수를 정의하려면 environment 또는 env_file 키워드를 사용할 수 있습니다. environment 키워드는 Compose 파일 내에서 직접 환경 변수를 정의하는 데 사용되며, env_file 키워드는 환경 변수가 포함된 파일을 지정하는 데 사용됩니다.

environment 키워드를 사용하여 환경 변수를 정의하는 예는 다음과 같습니다.

version: "3"
services:
  web:
    image: my-web-app
    environment:
      - DB_HOST=database
      - DB_USER=myuser
      - DB_PASSWORD=secretpassword

이 예제에서 web 서비스에는 DB_HOST, DB_USER, DB_PASSWORD의 세 가지 환경 변수가 정의되어 있습니다.

또는 env_file 키워드를 사용하여 환경 변수가 포함된 파일을 지정할 수 있습니다.

version: "3"
services:
  web:
    image: my-web-app
    env_file:
      - web-app.env

이 경우 환경 변수는 web-app.env라는 파일에 정의되어 있으며, 다음과 같을 수 있습니다.

DB_HOST=database
DB_USER=myuser
DB_PASSWORD=secretpassword

두 가지 방법 모두 유효하며, 환경 변수의 복잡성과 사용자의 선호도에 따라 상호 교환적으로 사용할 수 있습니다.

애플리케이션에서 환경 변수 액세스

Docker Compose 파일에서 환경 변수를 정의하면 애플리케이션은 프로그래밍 언어 또는 프레임워크에 적합한 메커니즘을 사용하여 이러한 변수에 액세스할 수 있습니다. 예를 들어, Node.js 애플리케이션에서는 process.env 객체를 사용하여 환경 변수에 액세스할 수 있습니다.

const dbHost = process.env.DB_HOST;
const dbUser = process.env.DB_USER;
const dbPassword = process.env.DB_PASSWORD;

마찬가지로, Python 애플리케이션에서는 os.environ 모듈을 사용하여 환경 변수에 액세스할 수 있습니다.

import os

db_host = os.environ.get('DB_HOST')
db_user = os.environ.get('DB_USER')
db_password = os.environ.get('DB_PASSWORD')

환경 변수를 사용하면 애플리케이션의 구성을 코드와 분리하여 더욱 유연하고 관리하기 쉽게 만들 수 있습니다.

환경 변수 정의 및 사용

Docker Compose 에서 환경 변수 정의

앞서 언급했듯이, Docker Compose 파일에서 environment 또는 env_file 키워드를 사용하여 환경 변수를 정의할 수 있습니다. 이러한 옵션을 자세히 살펴보겠습니다.

environment 키워드 사용

environment 키워드를 사용하면 Compose 파일 내에서 직접 환경 변수를 정의할 수 있습니다. 예제는 다음과 같습니다.

version: "3"
services:
  web:
    image: my-web-app
    environment:
      - DB_HOST=database
      - DB_USER=myuser
      - DB_PASSWORD=secretpassword

이 예제에서 web 서비스에는 DB_HOST, DB_USER, DB_PASSWORD의 세 가지 환경 변수가 정의되어 있습니다.

env_file 키워드 사용

또는 env_file 키워드를 사용하여 환경 변수가 포함된 파일을 지정할 수 있습니다. 많은 환경 변수를 가질 때 또는 Compose 파일과 분리하여 관리하고 싶을 때 유용합니다.

version: "3"
services:
  web:
    image: my-web-app
    env_file:
      - web-app.env

이 경우 환경 변수는 web-app.env라는 파일에 정의되어 있으며, 다음과 같을 수 있습니다.

DB_HOST=database
DB_USER=myuser
DB_PASSWORD=secretpassword

애플리케이션에서 환경 변수 액세스

Docker Compose 파일에서 환경 변수를 정의하면 애플리케이션은 프로그래밍 언어 또는 프레임워크에 맞는 메커니즘을 사용하여 이러한 변수에 액세스할 수 있습니다.

Node.js 애플리케이션에서 환경 변수에 액세스하는 예는 다음과 같습니다.

const dbHost = process.env.DB_HOST;
const dbUser = process.env.DB_USER;
const dbPassword = process.env.DB_PASSWORD;

그리고 Python 애플리케이션에서는 다음과 같습니다.

import os

db_host = os.environ.get('DB_HOST')
db_user = os.environ.get('DB_USER')
db_password = os.environ.get('DB_PASSWORD')

환경 변수를 사용하면 애플리케이션의 구성을 코드와 분리하여 더욱 유연하고 관리하기 쉽게 만들 수 있습니다.

환경 변수를 이용한 구성 적용

코드에서 구성 분리

Docker Compose 에서 환경 변수를 사용하는 주요 이점 중 하나는 애플리케이션 코드에서 구성을 분리할 수 있다는 것입니다. 이러한 분리는 애플리케이션을 더욱 포터블하고 유지 관리 가능하며 관리하기 쉽게 만듭니다.

구성 설정을 환경 변수에 저장함으로써 개발, 스테이징 및 프로덕션과 같은 다양한 환경에 애플리케이션을 쉽게 적응시킬 수 있으며, 애플리케이션 코드를 수정할 필요가 없습니다. 이 접근 방식은 데이터베이스 자격 증명이나 API 키와 같은 민감한 정보가 애플리케이션에 직접 하드코딩되지 않도록 하는 데에도 도움이 됩니다.

다양한 환경 구성

데이터베이스에 연결해야 하는 웹 애플리케이션의 예를 살펴보겠습니다. 환경 변수를 사용하여 다양한 환경에 대한 데이터베이스 연결 설정을 구성할 수 있습니다.

다음과 같은 Docker Compose 파일이 있다고 가정합니다.

version: "3"
services:
  web:
    image: my-web-app
    environment:
      - DB_HOST=${DB_HOST}
      - DB_USER=${DB_USER}
      - DB_PASSWORD=${DB_PASSWORD}
  database:
    image: postgres
    environment:
      - POSTGRES_DB=${DB_NAME}
      - POSTGRES_USER=${DB_USER}
      - POSTGRES_PASSWORD=${DB_PASSWORD}

이 예제에서 webdatabase 서비스는 각각의 설정을 구성하기 위해 환경 변수를 사용합니다. DB_HOST, DB_USER, DB_PASSWORD, DB_NAME 변수는 Compose 파일 내에서 정의되지 않고 Compose 파일이 실행되는 환경에서 정의됩니다.

다양한 환경에서 애플리케이션을 실행하려면 별도의 환경 변수 파일을 만들거나 셸에서 직접 변수를 설정할 수 있습니다. 예를 들어 다음과 같은 환경 변수 파일이 있을 수 있습니다.

development.env

DB_HOST=localhost
DB_USER=myuser
DB_PASSWORD=devpassword
DB_NAME=myapp_dev

production.env

DB_HOST=production-db.example.com
DB_USER=produser
DB_PASSWORD=prodpassword
DB_NAME=myapp_prod

그런 다음 Docker Compose 명령을 실행할 때 적절한 환경 변수 파일을 사용할 수 있습니다.

## 개발 환경에서 실행
docker-compose --env-file=development.env up -d

## 프로덕션 환경에서 실행
docker-compose --env-file=production.env up -d

애플리케이션을 구성하는 데 환경 변수를 사용하면 Compose 파일이나 애플리케이션 코드를 수정하지 않고도 다양한 환경에 쉽게 적응시킬 수 있습니다.

환경 변수를 위한 권장 사항

Docker Compose 에서 환경 변수를 사용할 때는 다음과 같은 권장 사항을 따르는 것이 중요합니다.

  1. 의미 있는 변수 이름 사용: 환경 변수에 이해하고 유지 관리하기 쉬운 설명적인 이름을 선택합니다.
  2. 민감한 정보 보호: 데이터베이스 자격 증명이나 API 키와 같은 민감한 정보가 Compose 파일이나 환경 변수 파일에 노출되지 않도록 합니다.
  3. 기본값 제공: Compose 파일에 환경 변수에 대한 기본값을 제공하여 변수가 설정되지 않은 경우에도 애플리케이션이 실행될 수 있도록 합니다.
  4. 변수 문서화: 각 환경 변수의 목적과 예상 값을 프로젝트 설명서 또는 README 파일에 문서화합니다.
  5. 환경별 파일 사용: 환경별 구성을 서로 다른 환경 변수 파일에 분리하여 설정을 정리하고 유지 관리 가능하게 만듭니다.

이러한 권장 사항을 따르면 Docker Compose 기반 애플리케이션의 구성을 효과적으로 관리하는 데 환경 변수를 사용할 수 있습니다.

요약

이 튜토리얼에서는 Docker Compose 에서 환경 변수의 역할을 살펴보았습니다. Docker 기반 애플리케이션을 구성하는 데 환경 변수를 정의하고 사용하는 방법을 배워, 더욱 유연하고 적응력 있는 배포 프로세스를 확보했습니다. 환경 변수를 활용하여 데이터베이스 연결 문자열, API 키 및 기타 민감한 정보와 같은 다양한 구성을 쉽게 관리할 수 있으며, Docker Compose 파일 내에 직접 하드코딩하지 않아도 됩니다. Docker Compose 에서 환경 변수의 힘을 이해하는 것은 강력하고 확장 가능하며 유지 관리 가능한 Docker 기반 애플리케이션을 구축하고 유지 관리하는 데 필수적인 기술입니다.