도커는 애플리케이션을 "컨테이너(Container)"라는 표준화된 단위로 패키징하여, 어떤 환경에서든 빠르고 안정적으로 실행할 수 있게 해주는 플랫폼입니다.
핵심 해결 문제: "제 컴퓨터에서는 잘 되는데, 서버에서는 왜 안되죠?" 라는 고질적인 문제를 해결합니다. 애플리케이션과 그 실행에 필요한 모든 환경(라이브러리, 종속성, 설정 파일 등)을 하나의 컨테이너에 담아 통째로 전달하기 때문입니다.

| 구분 | 이미지 (Image) | 컨테이너 (Container) |
|---|---|---|
| 개념 | 설계도, 템플릿 | 설계도로 지은 집, 실제 제품 |
| 상태 | 정적 (Read-Only) | 동적 (Running) |
| 역할 | 컨테이너를 생성하기 위한 실행 가능한 패키지. 코드, 런타임, 라이브러리, 환경 변수 등 모든 것을 포함. | 이미지를 기반으로 실행된 인스턴스. 격리된 공간에서 실제 애플리케이션이 동작함. |
| 관계 | 하나의 이미지로 여러 개의 컨테이너를 생성할 수 있음. | 이미지가 없으면 컨테이너를 생성할 수 없음. |
도커파일(Dockerfile)은 나만의 커스텀 이미지를 만들기 위한 설명서(Recipe)입니다. 이 파일은 이미지를 어떻게 빌드할지에 대한 명령어들이 순서대로 적혀있는 텍스트 파일입니다.
도커는 이 Dockerfile을 읽어서, 명령어들을 한 줄씩 실행하며 최종적으로 하나의 이미지를 생성합니다.
| 명령어 | 설명 | 예시 |
|---|---|---|
FROM | 생성할 이미지의 바탕이 될 베이스 이미지를 지정합니다. (필수) | FROM openjdk:17-jdk-slim |
WORKDIR | 컨테이너 내부에서 명령어를 실행할 작업 디렉토리를 설정합니다. | WORKDIR /app |
COPY | 호스트 컴퓨터의 파일이나 디렉토리를 이미지 안으로 복사합니다. | COPY build/libs/*.jar app.jar |
RUN | 이미지를 빌드하는 과정에서 실행할 명령어를 정의합니다. (e.g., 의존성 설치) | RUN apt-get update && apt-get install -y vim |
CMD | 컨테이너가 시작될 때 실행할 기본 명령어를 정의합니다. (Dockerfile에서 한 번만 사용) | CMD ["java", "-jar", "app.jar"] |
EXPOSE | 컨테이너가 외부에 노출할 포트를 지정합니다. (문서화 목적, 실제 포트 매핑은 아님) | EXPOSE 8080 |
# 1. 베이스 이미지로 OpenJDK 17 버전을 사용
FROM openjdk:17-jdk-slim
# 2. 작업 디렉토리를 /app으로 설정
WORKDIR /app
# 3. 호스트의 빌드된 JAR 파일을 이미지의 /app/app.jar로 복사
COPY build/libs/*.jar app.jar
# 4. 컨테이너가 8080 포트를 외부에 노출할 것임을 명시
EXPOSE 8080
# 5. 컨테이너가 시작될 때 'java -jar app.jar' 명령어를 실행
CMD ["java", "-jar", "app.jar"]