1️⃣ 이미지 가져오는 방식: "직접 빌드(Build)" vs "가져오기(Pull)"
도커 컴포즈에서 이미지를 세팅하는 방식은 크게 두 가지가 있고, 용도가 완전히 다릅니다.
A. build 방식 (현재 작성하신 방식)
- 원리: 내 컴퓨터에 있는 소스 코드와
Dockerfile을 읽어서 그 자리에서 즉석에서 빵을 구워(이미지 생성) 컨테이너를 띄우는 방식입니다.
- 언제 쓰나요? 내가 직접 코드를 짜서 자주 수정하는 **내 애플리케이션(Spring, Node.js, React 등)**을 띄울 때 씁니다. 코드가 바뀌면 다시 빌드해야 하니까요.
B. image만 적는 방식 (Pull 방식)
- 원리: 소스 코드가 필요 없습니다. 도커 허브(Docker Hub) 같은 저장소에서 남이 이미 완성해 둔 이미지를 다운로드(Pull) 받아서 바로 실행합니다.
- 언제 쓰나요? 코드를 수정할 일이 없는 **오픈소스 인프라(MySQL, Redis, Nginx, RabbitMQ 등)**를 띄울 때 씁니다.
💡 실무형 혼합 예시:
실무에서는 이 두 개를 보통 섞어서 씁니다.
services:
# 1. 내 앱은 소스코드로 직접 빌드해서 띄우고 (Build)
my-spring-app:
build: ./my-app
ports:
- "8080:8080"
# 2. DB는 남이 만들어둔 공식 이미지를 그냥 땡겨옵니다 (Pull)
my-database:
image: mysql:8.0 # build 옵션이 없음! 도커 허브에서 다운받아옴
ports:
- "3306:3306"
2️⃣ 환경변수 위치: Dockerfile vs docker-compose.yml
이 부분이 정말 중요합니다! 두 곳 모두 환경변수를 넣을 수 있지만, **"언제 적용되느냐"**와 "보안" 측면에서 완전히 다릅니다.
🅰️ Dockerfile에 적을 때 (ENV)
- 특징: "공장 출고 기본값"
- 적용 시점: 이미지를 **빌드(구울 때)**할 때 아예 이미지 안에 박제됩니다.
- 장점: 이 이미지를 다운받아서 쓰는 사람은 별도 세팅 없이도 기본 설정으로 앱을 돌릴 수 있습니다.
- 단점 및 🚨주의사항: 이미지를 뜯어보면 누구나 이 값을 볼 수 있습니다. 따라서 DB 비밀번호나 API 키 같은 민감한 정보(Secret)는 절대 여기에 적으면 안 됩니다.
- 무엇을 적나요? 앱이 돌아가기 위한 시스템적인 기본 경로, 타임존 설정, 기본 포트 번호 등 (예:
ENV TZ=Asia/Seoul)
🅱️ docker-compose.yml에 적을 때 (environment)