Docker Compose Environment 설정 완벽 가이드! 환경 변수와 .env 파일 안전하게 관리하기

Docker Compose로 서버를 운영하다 보면 Database 비밀번호, API Key, Application 설정값 등 다양한 환경 설정 정보를 관리해야 합니다.

이때 사용하는 기능이 바로 Environment Variable(환경 변수) 입니다.

기본 방식:

코드 내부에 설정값 작성

↓

보안 위험 발생

예:

environment:

  PASSWORD: 123456

문제:

  • 비밀번호 노출
  • Git 저장소 업로드 위험
  • 환경별 변경 어려움

Docker Compose 환경 변수 방식:

.env 파일

↓

docker-compose.yml

↓

Container 전달

구조:

환경 설정 관리

↓

Docker Compose

↓

Container 실행

이번 글에서는 Docker Compose Environment의 기본 개념부터 환경 변수 설정, .env 파일 활용, Secret 관리, Production 서버 보안 운영 방법까지 자세히 알아보겠습니다.

Docker Compose Environment란 무엇인가?

Environment는 Container 내부에 전달되는 설정값입니다.

예:

Database 이름

Database 비밀번호

API Key

실행 환경

같은 정보를 저장합니다.

구조:

Host 환경 변수

↓

Docker Compose

↓

Container 내부 환경 변수

Container 내부 확인:

env

결과:

DATABASE_HOST=mysql

DATABASE_USER=admin

NODE_ENV=production

Docker Compose environment 기본 사용법

가장 기본적인 방법:

services:

  app:

    image: node

    environment:

      NODE_ENV: production

결과:

Container 내부

↓

NODE_ENV=production

여러 개 설정:

environment:

  NODE_ENV: production

  PORT: 3000

  API_URL: https://api.example.com

Docker Compose 환경 변수 배열 방식

다른 작성 방식도 있습니다.

예:

environment:

  - NODE_ENV=production

  - PORT=3000

두 방식 모두 사용 가능합니다.

비교:

방식특징
KEY: VALUE가독성 좋음
– KEY=VALUE간단함

운영 환경에서는 Key-Value 방식을 많이 사용합니다.

Docker Compose .env 파일 사용하기

Production에서는 환경 변수를 별도 파일로 관리하는 것이 좋습니다.

프로젝트:

project/

├── docker-compose.yml

└── .env

.env:

MYSQL_ROOT_PASSWORD=password123

MYSQL_DATABASE=myapp

PORT=3000

docker-compose.yml:

services:

  database:

    image: mysql:8

    environment:

      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}

      MYSQL_DATABASE: ${MYSQL_DATABASE}

동작:

.env 읽기

↓

변수 치환

↓

Container 전달

Docker Compose 환경 변수 확인 방법

설정 확인:

docker compose config

결과:

environment:

  MYSQL_ROOT_PASSWORD: password123

Container 내부 확인:

docker compose exec 서비스명 env

예:

docker compose exec app env

Docker Compose env_file 사용 방법

환경 변수가 많아지면 env_file을 사용할 수 있습니다.

예:

.env:

DB_HOST=mysql

DB_USER=root

DB_PASSWORD=password

docker-compose.yml:

services:

  app:

    image: my-app

    env_file:

      - .env

구조:

.env

↓

Container Environment

장점:

  • 설정 분리
  • 관리 편리
  • 파일 재사용 가능

Docker Compose 환경별 설정 관리

실제 서버에서는 개발과 운영 설정이 다릅니다.

구조:

.env.dev

.env.test

.env.prod

예:

개발:

NODE_ENV=development

운영:

NODE_ENV=production

실행:

docker compose --env-file .env.prod up -d

Docker Compose Environment와 Secret 차이

중요한 차이입니다.

Environment:

일반 설정값

예:

  • Port
  • Mode
  • URL

Secret:

민감한 정보

예:

  • Password
  • Token
  • Private Key

Production에서는:

일반 설정

↓

Environment


비밀번호

↓

Secret 관리

방식을 권장합니다.

Docker Compose 민감 정보 관리 방법

좋지 않은 방법:

environment:

  PASSWORD: mypassword

문제:

Git Push

↓

비밀번호 노출

좋은 방법:

.env:

PASSWORD=secure_password

.gitignore:

.env

결과:

코드 저장소

↓

Secret 제외

Docker Compose Environment 우선순위

Docker Compose는 여러 위치에서 값을 가져올 수 있습니다.

우선순위:

1. docker compose run -e

↓

2. environment

↓

3. env_file

↓

4. .env 파일

높은 우선순위 값이 적용됩니다.

Docker Compose Environment 실무 예제

구조:

project/

├── docker-compose.yml

├── .env

└── app/

.env:

APP_PORT=3000

DB_HOST=mysql

DB_PASSWORD=password

docker-compose.yml:

services:

  app:

    image: my-app

    ports:

      - "${APP_PORT}:3000"


    environment:

      DB_HOST: ${DB_HOST}

      DB_PASSWORD: ${DB_PASSWORD}

실행:

docker compose up -d

결과:

.env

↓

Compose

↓

Application 설정 적용

Docker Compose Environment 운영 Best Practice

추천:

.env 파일 사용
Secret 분리 관리
Git에 .env 업로드 금지
환경별 파일 분리
기본값 설정 사용
민감 정보 암호화

운영 구조:

Development

↓

.env.dev


Production

↓

.env.prod

자주 묻는 질문

.env 파일은 꼭 필요한가요?

필수는 아니지만 서버 운영에서는 매우 유용합니다.

비밀번호를 environment에 넣어도 되나요?

가능하지만 Production에서는 Secret 관리 방식을 권장합니다.

환경별 설정을 다르게 할 수 있나요?

가능합니다.

.env.dev, .env.prod처럼 분리해서 사용할 수 있습니다.

Container 내부에서 환경 변수를 확인할 수 있나요?

가능합니다.

docker compose exec 서비스명 env

마무리

Docker Compose Environment 설정은 서버 운영에서 설정값을 안전하고 효율적으로 관리하기 위한 핵심 기능입니다.

Port, Database 정보, API 설정, 실행 환경 등 다양한 값을 코드와 분리하면 유지보수성과 보안성이 크게 향상됩니다.

특히 Production 서버에서는 .env 파일 관리, Secret 분리, 환경별 설정 구성이 안정적인 운영의 기본입니다.

다음 글에서는 Docker Compose의 핵심 기능 중 하나인 Network 구성 방법을 다루면서 Container 간 통신 구조와 서비스 연결 방법을 알아보겠습니다.

댓글 남기기