Tool/Docker

Docker 기본 개념 및 사용법-01

neorc 2026. 2. 26. 14:25

1. Docker 핵심 아키텍처

Docker는 애플리케이션 실행에 필요한 환경을 **이미지(Image)**라는 단위로 패키징하고, 이를 **컨테이너(Container)**라는 격리된 프로세스로 실행합니다.

  • Image (이미지): 애플리케이션 실행을 위한 읽기 전용 템플릿입니다. 소스 코드, 라이브러리, 종속성, 도구 등이 포함된 '클래스(Class)'와 같습니다.
  • Container (컨테이너): 이미지를 실행한 상태입니다. 이미지의 '인스턴스(Instance)'이며, 격리된 파일 시스템과 네트워크를 가집니다.
  • Dockerfile: 이미지를 생성하는 명세서입니다. FROM, RUN, COPY 등의 명령어로 빌드 과정을 코드로 정의합니다.
  • Docker Compose: 여러 컨테이너(예: Web + DB)를 정의하고 실행하는 오케스트레이션 도구입니다.

2. 엔지니어의 Docker 워크플로우 (Build - Ship - Run)

가장 많이 사용하게 될 흐름은 다음과 같습니다.

A. 이미지 가져오기 및 실행 (Run)

가장 기본적인 사용법입니다. Docker Hub 등 레지스트리에서 이미지를 받아 실행합니다.

 

# Nginx 웹 서버 실행 예시
docker run -d -p 8080:80 --name my-webserver nginx:latest
  • -d: 백그라운드 실행
  • -p 8080:80: 호스트의 8080 포트를 컨테이너의 80 포트와 연결
  • --name: 컨테이너 이름 지정

B. 나만의 이미지 만들기 (Build)

프로젝트 루트에 Dockerfile을 작성하여 커스텀 이미지를 빌드합니다.

Dockerfile 예시 (Node.js):

 

# 1. 베이스 이미지 선택
FROM node:18-alpine

# 2. 작업 디렉토리 설정
WORKDIR /app

# 3. 의존성 파일 복사 및 설치 (캐싱 활용을 위해 소스보다 먼저)
COPY package*.json ./
RUN npm install

# 4. 소스 코드 복사
COPY . .

# 5. 실행 명령어 정의
CMD ["npm", "start"]

빌드 및 실행:

docker build -t my-app:v1 .  # 현재 디렉토리(.)의 Dockerfile로 빌드
docker run my-app:v1

C. 멀티 컨테이너 관리 (Compose)

실무에서는 docker run 명령어를 일일이 치기보다 docker-compose.yml 파일로 인프라를 코드화(IaC)하여 관리합니다.

docker-compose.yml 예시:

version: '3.8'
services:
  web:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - db
  db:
    image: postgres:14
    volumes:
      - db_data:/var/lib/postgresql/data # 데이터 영속성 보장

volumes:
  db_data:

실행:

docker-compose up -d  # 서비스 전체 실행
docker-compose down   # 서비스 전체 중단 및 삭제

3. 필수 명령어 치트시트

이미지 관리

  • docker images: 다운로드된 이미지 목록 확인
  • docker rmi [이미지ID]: 이미지 삭제
  • docker build -t [이름] .: 이미지 빌드

컨테이너 라이프사이클

  • docker ps: 실행 중인 컨테이너 목록
  • docker ps -a: 중지된 컨테이너 포함 전체 목록
  • docker stop [ID]: 컨테이너 우아한 종료 (SIGTERM)
  • docker kill [ID]: 컨테이너 강제 종료 (SIGKILL)
  • docker rm [ID]: 컨테이너 삭제 (실행 중이면 -f 필요)

디버깅 및 로그

  • docker logs -f [ID]: 로그 실시간 확인 (엔지니어 필수 명령어)
  • docker exec -it [ID] /bin/bash: 실행 중인 컨테이너 내부로 쉘 접속
  • docker inspect [ID]: 컨테이너 상세 정보(IP, 볼륨 마운트 등) 확인

4. 엔지니어를 위한 Best Practices

  1. 가벼운 베이스 이미지 사용: ubuntu 대신 alpine과 같은 최소 이미지를 사용하여 빌드 속도와 보안성을 높이세요.
  2. 멀티 스테이지 빌드 (Multi-stage Build): 빌드 도구(예: JDK, Node 등)는 최종 이미지에서 제거하여 용량을 줄이세요.
  3. 레이어 캐싱 활용: 변경이 잦은 소스 코드(COPY . .)는 package.json 설치(RUN npm install)보다 나중에 배치해야 빌드 속도가 빨라집니다.
  4. .dockerignore 사용: .git, node_modules 등 불필요한 파일이 빌드 컨텍스트에 포함되지 않도록 설정하세요.
  5. 볼륨 사용: 데이터베이스 데이터나 로그 파일은 반드시 Volume을 사용하여 컨테이너가 삭제되어도 데이터가 유실되지 않도록 하세요.

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

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