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 간 통신 구조와 서비스 연결 방법을 알아보겠습니다.