1. 컨테이너란 무엇인가?

컨테이너의 정의와 필요성

컨테이너는 애플리케이션과 그 실행 환경(라이브러리, 설정 등)을 하나로 묶어 어디서든 동일하게 실행할 수 있도록 해주는 기술입니다. 기존의 가상머신(VM)과 달리, 컨테이너는 운영체제 커널을 공유해 훨씬 가볍고 빠릅니다. 격리된 환경에서 실행되어 충돌이 적고, 자원 효율성이 뛰어납니다.

가상화와 컨테이너의 차이
  • VM: 하이퍼바이저 위에 OS 전체를 올려 무겁고 느림
  • 컨테이너: 호스트 OS 커널을 공유, 프로세스 단위로 격리, 빠르고 경량

2. Docker란 무엇인가?

Docker의 개념, 구조, 핵심 용어

Docker는 가장 널리 쓰이는 컨테이너 플랫폼입니다. 주요 용어는 다음과 같습니다.

  • 이미지(Image): 실행에 필요한 파일과 설정의 집합(컨테이너의 설계도)
  • 컨테이너(Container): 이미지를 실행한 인스턴스
  • 레지스트리(Registry): 이미지를 저장/배포하는 저장소(Docker Hub 등)
  • Dockerfile: 이미지를 자동으로 빌드하기 위한 스크립트 파일

3. Docker 설치 및 환경 구성

Windows/Mac/Linux 설치법, 기본 명령어
  • 공식 다운로드
  • 설치 후 터미널에서 docker version으로 정상 설치 확인
  • 첫 컨테이너 실행: docker run hello-world
실전 환경 세팅 팁
  • Docker Desktop 설치(Windows/Mac)
  • 리눅스는 패키지 매니저(apt, yum 등)로 설치
  • 권한 문제 시 sudo 사용

4. Docker 이미지와 컨테이너 실습

이미지 빌드, 컨테이너 실행, 볼륨, 네트워크, 포트 매핑 등
# 예시 Dockerfile
FROM openjdk:17
COPY . /app
WORKDIR /app
CMD ["java", "-jar", "app.jar"]
  • 빌드: docker build -t myapp .
  • 실행: docker run -d -p 8080:8080 myapp
  • 볼륨: docker run -v /host/data:/container/data myapp
  • 네트워크: docker network create mynet
코틀린 서버 예제 컨테이너화
// build.gradle.kts
plugins {
    kotlin("jvm") version "1.8.0"
    application
}

application {
    mainClass.set("MainKt")
}

dependencies {
    implementation(kotlin("stdlib"))
    implementation("io.ktor:ktor-server-netty:2.0.0")
}

// Main.kt
fun main() {
    embeddedServer(Netty, port = 8080) {
        routing {
            get("/") { call.respondText("Hello Docker!") }
        }
    }.start(wait = true)
}

5. 실전: Docker Compose와 멀티 컨테이너

Compose 파일 작성, 여러 서비스 연동, 실전 예시
version: '3.8'
services:
  db:
    image: postgres:13
    environment:
      POSTGRES_PASSWORD: example
  app:
    build: .
    ports:
      - "8080:8080"
    depends_on:
      - db
  • 실행: docker-compose up -d

6. 결론

Docker와 컨테이너 기술을 익히면, 개발부터 배포까지 효율적인 환경을 구축할 수 있습니다. 실습을 통해 직접 경험해보세요.