Docker 기본

컨테이너 기술의 핵심인 Docker의 기본 개념과 사용법


컨테이너 기술의 핵심인 Docker의 기본 개념과 사용법

목표: Docker를 사용하여 애플리케이션을 컨테이너화하고 관리할 수 있는 수준


🐳 Docker 개요

컨테이너란?

graph TB
    subgraph "전통적 VM"
        VM_HOST["Host OS"] -->|"Hypervisor"| VM_GUEST["Guest OS"]
        VM_GUEST -->|"Bin/Lib"| VM_APP["App A"]
    end
    
    subgraph "Docker 컨테이너"
        DOCKER_HOST["Host OS"] -->|"Docker Engine"| DOCKER_APP1["App A<br/>+ Bin/Lib"]
        DOCKER_HOST -->|"Docker Engine"| DOCKER_APP2["App B<br/>+ Bin/Lib"]
    end

특징:

  • 가벼운 격리 환경
  • 빠른 시작/중지
  • 일관된 실행 환경
  • 이미지 기반 배포

📝 기본 명령어

이미지

# 이미지 검색
 docker search nginx

# 이미지 다운로드
 docker pull nginx:latest
 docker pull nginx:alpine

# 이미지 목록
 docker images
 docker image ls

# 이미지 삭제
 docker rmi nginx:latest
 docker image prune          # 사용 안 하는 이미지 삭제

컨테이너

# 컨테이너 실행
 docker run -d --name my-nginx -p 80:80 nginx

# 실행 중인 컨테이너
 docker ps
 docker container ls

# 모든 컨테이너
 docker ps -a

# 컨테이너 중지
 docker stop my-nginx

# 컨테이너 시작
 docker start my-nginx

# 컨테이너 재시작
 docker restart my-nginx

# 컨테이너 삭제
 docker rm my-nginx
 docker rm -f my-nginx       # 강제 삭제

# 컨테이너 로그
 docker logs my-nginx
 docker logs -f my-nginx     # 실시간

# 컨테이너 내부 접속
 docker exec -it my-nginx /bin/bash
 docker exec -it my-nginx sh

실행 옵션

# 백그라운드 실행
 docker run -d nginx

# 포트 매핑
 docker run -p 8080:80 nginx
 docker run -p 127.0.0.1:8080:80 nginx

# 볼륨 마운트
 docker run -v /host/path:/container/path nginx
 docker run -v my-volume:/data nginx

# 환경변수
 docker run -e MYSQL_ROOT_PASSWORD=secret mysql
 docker run --env-file .env mysql

# 리소스 제한
 docker run --memory=512m --cpus=1.0 nginx

# 네트워크
 docker run --network=my-network nginx

# 재시작 정책
 docker run --restart=unless-stopped nginx

🏗️ Dockerfile

기본 구조

# 베이스 이미지
FROM node:18-alpine

# 작업 디렉토리
WORKDIR /app

# 의존성 복사 및 설치
COPY package*.json ./
RUN npm ci --only=production

# 소스 복사
COPY . .

# 포트 노출
EXPOSE 3000

# 실행 명령
CMD ["node", "server.js"]

멀티 스테이지 빌드

# 빌드 스테이지
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# 실행 스테이지
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Dockerfile 명령어

명령어설명예시
FROM베이스 이미지FROM node:18
WORKDIR작업 디렉토리WORKDIR /app
COPY파일 복사COPY . .
ADD파일 복사 (압축 해제)ADD app.tar.gz /app
RUN명령 실행RUN npm install
ENV환경변수ENV NODE_ENV=production
EXPOSE포트 노출EXPOSE 3000
CMD기본 실행CMD ["node", "app.js"]
ENTRYPOINT고정 실행ENTRYPOINT ["node"]
VOLUME볼륨VOLUME ["/data"]
USER사용자USER node
HEALTHCHECK헬스체크HEALTHCHECK CMD curl -f http://localhost

📦 이미지 관리

이미지 빌드

# 기본 빌드
 docker build -t myapp:latest .

# 태그 지정
 docker build -t myapp:v1.0.0 .
 docker build -t myregistry.com/myapp:v1.0.0 .

# 특정 Dockerfile
 docker build -f Dockerfile.prod -t myapp:prod .

# 빌드 아규먼트
 docker build --build-arg NODE_ENV=production -t myapp:prod .

레지스트리

# Docker Hub 로그인
 docker login

# 이미지 푸시
 docker push myusername/myapp:v1.0.0

# 비공개 레지스트리
 docker login myregistry.com
 docker push myregistry.com/myapp:v1.0.0

# 이미지 풀
 docker pull myregistry.com/myapp:v1.0.0

🐛 문제 해결

디버깅

# 컨테이너 정보
 docker inspect my-container

# 프로세스 확인
 docker top my-container

# 리소스 사용량
 docker stats

# 내부 파일 확인
 docker cp my-container:/etc/nginx/nginx.conf ./nginx.conf

# 네트워크 확인
 docker network ls
 docker network inspect bridge

정리

# 중지된 컨테이너 삭제
 docker container prune

# 사용 안 하는 이미지 삭제
 docker image prune

# 사용 안 하는 볼륨 삭제
 docker volume prune

# 사용 안 하는 네트워크 삭제
 docker network prune

# 전체 정리
 docker system prune -a

📋 체크리스트

  • Docker 기본 명령어
  • 이미지 검색/다운로드/삭제
  • 컨테이너 실행/중지/삭제
  • Dockerfile 작성
  • 멀티 스테이지 빌드
  • 볼륨 마운트
  • 포트 매핑
  • 환경변수 설정
  • 이미지 빌드/푸시/풀
  • 문제 해결

🔗 관련 노트

  • 01-04-도커-Compose — 다중 컨테이너
  • 01-01-K8s-아키텍처-이해 — 컨테이너 오케스트레이션
  • 02-06-보안-스캐닝 — 컨테이너 보안

마지막 업데이트: 2026-06-01