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