Docker & Docker Compose 필수 가이드
요약
1. Docker 기본 개념
핵심 용어
이미지(Image): 애플리케이션 실행에 필요한 모든 것을 포함한 템플릿 (설계도)
컨테이너(Container): 이미지를 실행한 인스턴스 (실제 실행 중인 프로그램)
Dockerfile: 이미지를 만들기 위한 설정 파일
Docker Compose: 여러 컨테이너를 한 번에 관리하는 도구
비유로 이해하기
이미지 = 붕어빵 틀
컨테이너 = 실제 붕어빵
Dockerfile = 붕어빵 틀 만드는 설명서
Docker Compose = 붕어빵 가게 운영 매뉴얼2. Docker 명령어
이미지 관련
# 이미지 다운로드
docker pull nginx:latest
# 이미지 목록
docker images
# 이미지 삭제
docker rmi image_name
# 모든 미사용 이미지 삭제
docker image prune -a컨테이너 관련
# 컨테이너 실행
docker run -d -p 8080:80 --name myapp nginx
# 실행 중인 컨테이너 보기
docker ps
# 모든 컨테이너 보기 (중지된 것 포함)
docker ps -a
# 컨테이너 중지/시작/재시작
docker stop container_name
docker start container_name
docker restart container_name
# 컨테이너 삭제
docker rm container_name
# 컨테이너 로그 보기
docker logs container_name
docker logs -f container_name # 실시간
# 컨테이너 내부 접속
docker exec -it container_name bash정리 명령어
# 중지된 컨테이너 모두 삭제
docker container prune
# 미사용 이미지, 컨테이너, 네트워크 모두 정리
docker system prune -a
# 디스크 사용량 확인
docker system df3. Dockerfile 작성
기본 구조
# 베이스 이미지
FROM python:3.10-slim
# 작업 디렉토리 설정
WORKDIR /app
# 파일 복사
COPY requirements.txt .
COPY . .
# 의존성 설치
RUN pip install -r requirements.txt
# 포트 노출
EXPOSE 8000
# 실행 명령
CMD ["python", "app.py"]주요 명령어
FROM: 베이스 이미지 지정WORKDIR: 작업 디렉토리 설정COPY: 파일 복사RUN: 빌드 시 실행할 명령EXPOSE: 포트 노출 (문서화 용도)CMD: 컨테이너 실행 시 기본 명령ENV: 환경 변수 설정
4. Docker Compose
기본 구조 (docker-compose.yml)
services:
web:
image: nginx:latest # 또는 build: .
container_name: my-web
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
environment:
- ENV_VAR=value
networks:
- mynetwork
restart: unless-stopped
db:
image: postgres:14
container_name: my-db
environment:
- POSTGRES_PASSWORD=secret
volumes:
- db-data:/var/lib/postgresql/data
networks:
- mynetwork
volumes:
db-data:
networks:
mynetwork:
driver: bridgeDocker Compose 명령어
# 시작 (이미지 다운로드/빌드 + 컨테이너 실행)
docker-compose up
docker-compose up -d # 백그라운드 실행
# 빌드만 (Dockerfile 사용 시)
docker-compose build
docker-compose build --no-cache # 캐시 없이
# 시작 + 빌드
docker-compose up -d --build
# 중지/삭제
docker-compose down # 컨테이너 중지 및 삭제
docker-compose down -v # 볼륨도 함께 삭제
# 상태 확인
docker-compose ps
docker-compose logs
docker-compose logs -f service_name
# 서비스별 명령
docker-compose restart service_name
docker-compose stop service_name
docker-compose start service_name
# 스케일링
docker-compose up -d --scale web=35. image vs build 차이
image 사용 (이미 만들어진 이미지)
services:
app:
image: nginx:latest # Docker Hub에서 가져옴Dockerfile 불필요
docker-compose up -d만 실행
build 사용 (직접 빌드)
services:
app:
build: . # Dockerfile 필요
# 또는
build:
context: ./app
dockerfile: Dockerfile.prodDockerfile 필요
docker-compose build후up -d또는
docker-compose up -d --build
6. 네트워크
네트워크 개념
컨테이너 간 통신을 위한 가상 네트워크
같은 네트워크의 컨테이너끼리만 통신 가능
컨테이너 이름으로 호스트명 사용 가능
네트워크 설정
# 자동 생성
services:
app:
networks:
- mynet
networks:
mynet:
driver: bridge
# 기존 네트워크 사용
networks:
existing-net:
external: true # docker network create existing-net 필요
# 네트워크 없이 (기본 네트워크 자동 생성)
services:
app:
# networks 설정 없음네트워크 명령어
# 네트워크 목록
docker network ls
# 네트워크 생성
docker network create mynetwork
# 네트워크 상세 정보
docker network inspect mynetwork
# 네트워크 삭제
docker network rm mynetwork7. 볼륨 (데이터 저장)
볼륨 타입
services:
app:
volumes:
# 호스트 경로 마운트 (개발용)
- ./src:/app/src
# Named 볼륨 (프로덕션용)
- app-data:/app/data
# Anonymous 볼륨
- /app/temp
volumes:
app-data: # Named 볼륨 정의볼륨 명령어
# 볼륨 목록
docker volume ls
# 볼륨 상세 정보
docker volume inspect volume_name
# 볼륨 삭제
docker volume rm volume_name
# 미사용 볼륨 정리
docker volume prune8. 환경 변수
설정 방법
services:
app:
# 직접 설정
environment:
- NODE_ENV=production
- DB_HOST=postgres
# .env 파일 사용
env_file:
- .env
# 호스트 환경변수 전달
environment:
- API_KEY=${API_KEY} # .env 파일에서 읽음.env 파일
# .env
API_KEY=secret123
DB_PASSWORD=mypassword
NODE_ENV=development9. 실전 팁
개발 vs 프로덕션
# 개발용
services:
app:
build: .
volumes:
- ./src:/app/src # 코드 실시간 반영
command: python manage.py runserver # 개발 서버
# 프로덕션용
services:
app:
image: myapp:v1.0.0
restart: always
command: gunicorn app:app # 프로덕션 서버헬스체크
services:
app:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s리소스 제한
services:
app:
deploy:
resources:
limits:
cpus: '2.0'
memory: 2G
reservations:
cpus: '1.0'
memory: 1G10. 트러블슈팅
자주 발생하는 문제
포트 충돌
# 포트 사용 확인
netstat -ano | findstr :8080 # Windows
lsof -i :8080 # Mac/Linux권한 문제
# Linux/Mac에서 sudo 필요할 수 있음
sudo docker-compose up -d캐시 문제
# 캐시 없이 빌드
docker-compose build --no-cache디스크 공간 부족
# 정리
docker system prune -a --volumes네트워크 오류
# 네트워크 재생성
docker-compose down
docker network prune
docker-compose up -d11. Azure 배포 준비
# 1. Azure Container Registry 로그인
az acr login --name myregistry
# 2. 이미지 태그
docker tag myapp:latest myregistry.azurecr.io/myapp:v1
# 3. 푸시
docker push myregistry.azurecr.io/myapp:v1
# 4. Azure Container Instance 생성
az container create
--resource-group mygroup
--name myapp
--image myregistry.azurecr.io/myapp:v1
--ports 80
--cpu 1
--memory 1.5요약 체크리스트
✅ 시작 전
Dockerfile 또는 image 지정 확인
포트 충돌 확인
.env 파일 생성
✅ 실행
docker-compose up -ddocker-compose ps로 상태 확인docker-compose logs로 로그 확인
✅ 문제 발생 시
docker-compose downdocker system prune -a다시 시작
✅ 종료
docker-compose downdocker-compose down -v(볼륨 삭제 필요 시)
