개발자를 위한 Docker: 이미지, 컨테이너, Compose
개발자라면 환경 불일치로 인한 좌절을 겪어봤을 것입니다: "내 컴퓨터에서는 되는데!" Docker는 애플리케이션을 컨테이너로 패키징하여 이 문제를 해결합니다. 이 가이드는 Docker 이미지, 컨테이너, Compose를 설명하여 일관되게 애플리케이션을 빌드, 배포, 실행할 수 있도록 도와줍니다.
Docker란 무엇인가?
Docker는 컨테이너에서 애플리케이션을 개발, 배포, 실행하기 위한 플랫폼입니다. 컨테이너는 소프트웨어 실행에 필요한 모든 것(코드, 런타임, 시스템 도구, 라이브러리, 설정)을 포함하는 경량의 독립 실행형 패키지입니다.
이미지 vs. 컨테이너
이미지는 컨테이너 생성을 위한 지침이 담긴 읽기 전용 템플릿입니다. 컨테이너는 이미지의 실행 가능한 인스턴스입니다. 동일한 이미지에서 여러 컨테이너를 생성할 수 있으며, 각각 서로 격리됩니다.
이미지 작업하기
이미지는 지침이 담긴 텍스트 파일인 Dockerfile에서 빌드됩니다. 다음은 간단한 Node.js 예제입니다:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
다음 명령으로 이미지를 빌드합니다:
docker build -t my-app .
이미지 목록: docker images
컨테이너 실행하기
이미지에서 컨테이너를 시작합니다:
docker run -d -p 3000:3000 --name my-container my-app
이 명령은 컨테이너를 분리 모드(-d)로 실행하고, 포트 3000을 매핑하며, 이름을 my-container로 지정합니다.
실행 중인 컨테이너 목록: docker ps
컨테이너 중지: docker stop my-container
컨테이너 제거: docker rm my-container
Docker Compose를 사용하는 이유
애플리케이션이 여러 서비스(데이터베이스, 캐시 등)에 의존하는 경우 개별 컨테이너를 관리하는 것이 번거로워집니다. Docker Compose를 사용하면 YAML 파일로 다중 컨테이너 애플리케이션을 정의하고 실행할 수 있습니다.
Compose 파일 예제
docker-compose.yml을 생성합니다:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_PASSWORD: example
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
모든 서비스 시작: docker compose up -d
중지 및 제거: docker compose down
개발자를 위한 모범 사례
- .dockerignore 사용: 불필요한 파일(node_modules, .git)을 제외하여 빌드 속도를 높입니다.
- 멀티 스테이지 빌드: 빌드와 런타임 단계를 분리하여 프로덕션 이미지를 작게 유지합니다.
- 캐싱 활용: Dockerfile 지침을 변경 빈도가 낮은 것부터 높은 것 순으로 배치합니다.
- 이미지 태그를 적절히 지정: 프로덕션에서는
latest사용을 피하고 시맨틱 버전 관리를 사용하세요. - 취약점 스캔:
docker scan을 사용하여 이미지의 알려진 문제를 확인하세요.
자주 사용하는 명령어 치트 시트
| 명령어 | 설명 |
|---|---|
docker build -t name . | Dockerfile에서 이미지 빌드 |
docker run -p host:container image | 컨테이너 실행 및 포트 매핑 |
docker ps -a | 모든 컨테이너 목록 |
docker exec -it container bash | 실행 중인 컨테이너 내부에서 셸 열기 |
docker compose up | Compose 파일에 정의된 서비스 시작 |
docker compose logs -f | 모든 서비스의 로그 실시간 확인 |
FAQ
이미지와 컨테이너의 차이점은 무엇인가요?
이미지는 정적 템플릿이고, 컨테이너는 해당 이미지의 실행 인스턴스입니다. 하나의 이미지에서 여러 컨테이너를 생성할 수 있습니다.
Docker Compose는 언제 사용해야 하나요?
애플리케이션이 함께 실행해야 하는 여러 서비스(예: 웹 서버, 데이터베이스, 캐시)를 필요로 할 때 Compose를 사용하세요. 개발 및 테스트를 위한 오케스트레이션을 단순화합니다.
Docker에서 데이터를 어떻게 유지하나요?
볼륨이나 바인드 마운트를 사용하세요. 볼륨은 Docker가 관리하고 전용 영역에 저장되며, 바인드 마운트는 호스트 디렉터리에 연결됩니다. 둘 다 컨테이너 재시작 후에도 유지됩니다.
Docker 워크플로를 간소화할 준비가 되셨나요? 컨테이너 로그를 빠르게 디버깅하려면 Nginx Log Analyzer를 사용해 보세요.