1. Docker 핵심 개념 요약
Docker는 Build → Ship → Run 세 단계로 동작합니다.
- Image: 실행 환경의 스냅샷(읽기 전용 템플릿)
- Container: 이미지를 기반으로 실행된 격리된 프로세스
- Volume: 컨테이너 삭제 후에도 데이터를 보존하는 스토리지
- Network: 컨테이너 간 통신을 제어하는 가상 네트워크
2. 컨테이너 라이프사이클
기본 실행 명령어
docker run -d -p 8080:80 --name my-nginx nginx # 백그라운드 실행
docker ps # 실행 중인 컨테이너 목록
docker ps -a # 중단된 컨테이너 포함 전체 목록
docker stop my-nginx # 우아한 종료 (SIGTERM)
docker kill my-nginx # 강제 종료 (SIGKILL)
docker start my-nginx # 중단된 컨테이너 재시작
docker rm my-nginx # 컨테이너 삭제
docker rm -f my-nginx # 실행 중인 컨테이너 강제 삭제
docker run 주요 옵션
옵션설명예시
| -d | 백그라운드 실행 | -d |
| -p | 포트 매핑 (호스트:컨테이너) | -p 3306:3306 |
| --name | 컨테이너 이름 지정 | --name my-app |
| -e | 환경 변수 설정 | -e DB_HOST=localhost |
| -v | 볼륨 마운트 | -v /host/path:/container/path |
| --network | 네트워크 연결 | --network my-net |
| --rm | 종료 시 자동 삭제 | --rm |
| -it | 인터랙티브 터미널 | -it ubuntu bash |
3. 디버깅 명령어 (엔지니어 필수)
실무에서 가장 자주 쓰는 명령어들입니다.
docker logs -f my-nginx # 실시간 로그 스트리밍
docker exec -it my-nginx /bin/bash # 실행 중인 컨테이너 내부 쉘 접속
docker inspect my-nginx # JSON 형식으로 상세 정보 출력 (IP, 마운트 등)
docker stats # CPU, 메모리 실시간 모니터링
docker cp my-nginx:/etc/nginx.conf . # 컨테이너에서 파일 복사
4. Dockerfile 작성 (이미지 빌드)
기본 구조
# 1. 베이스 이미지 (가벼운 alpine 권장)
FROM node:18-alpine
# 2. 작업 디렉토리 설정
WORKDIR /app
# 3. 의존성 먼저 복사 (캐시 레이어 활용)
COPY package*.json ./
RUN npm ci --only=production
# 4. 소스 코드 복사
COPY . .
# 5. 포트 선언
EXPOSE 3000
# 6. 실행 명령어
CMD ["node", "server.js"]
고급: 멀티 스테이지 빌드 (Multi-Stage Build)
빌드 도구를 최종 이미지에서 제거하여 이미지 크기를 극적으로 줄이는 핵심 기법입니다.
# Stage 1: 빌드 환경 (무거운 빌드 도구 포함)
FROM node:18 AS builder
WORKDIR /app
COPY . .
RUN npm install && npm run build # 빌드 아티팩트 생성
# Stage 2: 실행 환경 (빌드 도구 없이 결과물만 복사)
FROM node:18-alpine AS production
WORKDIR /app
COPY --from=builder /app/dist ./dist # builder 스테이지에서 결과물만 복사
COPY --from=builder /app/node_modules ./node_modules
CMD ["node", "dist/server.js"]
이 방식으로 이미지 크기를 수백 MB → 수십 MB로 줄일 수 있습니다.
빌드 명령어:
docker build -t my-app:v1 . # 기본 빌드
docker build --target production . # 특정 스테이지만 빌드 (BuildKit 필요)
docker tag my-app:v1 username/my-app # Docker Hub 배포용 태그
docker push username/my-app # Docker Hub 업로드
5. Volume (데이터 영속성)
컨테이너를 삭제하면 내부 데이터도 사라집니다. Volume으로 데이터를 보존하세요.
# Named Volume (Docker가 관리, 운영 환경 권장)
docker run -v mysql_data:/var/lib/mysql mysql:8.4
# Bind Mount (로컬 디렉토리와 직접 연결, 개발 환경 권장)
docker run -v $(pwd)/src:/app/src my-app # 코드 변경 즉시 반영
# 볼륨 관리
docker volume ls # 볼륨 목록
docker volume inspect mysql_data # 볼륨 상세 정보
docker volume rm mysql_data # 볼륨 삭제
6. Network (컨테이너 간 통신)
같은 네트워크에 속한 컨테이너는 컨테이너 이름으로 서로 통신할 수 있습니다.
# 사용자 정의 네트워크 생성
docker network create my-network
# 컨테이너를 동일 네트워크에 연결
docker run --network my-network --name db mysql:8.4
docker run --network my-network --name app my-app # app에서 "db"라는 호스트명으로 DB 접근 가능
7. Docker Compose (멀티 컨테이너 관리)
여러 컨테이너 설정을 코드로 관리하는 실무 표준입니다.
# docker-compose.yml
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- DB_HOST=db # 서비스 이름(db)이 곧 호스트명
- DB_PASSWORD=${DB_PASSWORD} # .env 파일에서 불러오기
depends_on:
- db
volumes:
- ./src:/app/src # 개발 시 코드 실시간 반영
db:
image: mysql:8.4
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- db_data:/var/lib/mysql
volumes:
db_data: # Named volume 선언
docker-compose up -d # 전체 서비스 백그라운드 실행
docker-compose up --build # 이미지 재빌드 후 실행
docker-compose down # 서비스 중단 + 컨테이너 삭제
docker-compose down -v # 볼륨까지 삭제
docker-compose logs -f app # 특정 서비스 로그 확인
8. 리소스 정리 (Cleanup)
도커를 쓰다 보면 미사용 이미지/컨테이너가 디스크를 잠식합니다.
docker system prune # 미사용 컨테이너, 네트워크, 이미지 일괄 삭제
docker system prune -a # 사용 중이 아닌 모든 이미지 포함 삭제
docker volume prune # 미사용 볼륨 삭제
docker system df # 도커가 사용 중인 디스크 용량 확인
엔지니어 Best Practices 요약
- .dockerignore 파일 필수 작성 - node_modules, .git, .env 등 제외
- 루트 사용자 금지 - Dockerfile에 USER node 등 비루트 사용자 설정
- 환경 변수 분리 - 비밀번호·API 키는 .env 파일로 관리하고 .gitignore에 추가
- 레이어 캐싱 활용 - 변경 빈도가 낮은 명령어(의존성 설치)를 소스 복사보다 앞에 배치
- 태그 관리 - latest 대신 my-app:v1.2.3 처럼 명시적 버전 태그 사용
'Tool > Docker' 카테고리의 다른 글
| Docker 기본 개념 및 사용법-01 (0) | 2026.02.26 |
|---|