Tool/Docker

Docker 기본 개념 및 사용법-02

neorc 2026. 2. 26. 14:29

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 요약

  1. .dockerignore 파일 필수 작성 - node_modules, .git, .env 등 제외
  2. 루트 사용자 금지 - Dockerfile에 USER node 등 비루트 사용자 설정
  3. 환경 변수 분리 - 비밀번호·API 키는 .env 파일로 관리하고 .gitignore에 추가
  4. 레이어 캐싱 활용 - 변경 빈도가 낮은 명령어(의존성 설치)를 소스 복사보다 앞에 배치
  5. 태그 관리 - latest 대신 my-app:v1.2.3 처럼 명시적 버전 태그 사용

'Tool > Docker' 카테고리의 다른 글

Docker 기본 개념 및 사용법-01  (0) 2026.02.26