Docker와 컨테이너의 모든 것: 기초부터 실전까지
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와 컨테이너 기술을 익히면, 개발부터 배포까지 효율적인 환경을 구축할 수 있습니다. 실습을 통해 직접 경험해보세요.
- 참고자료: Docker 공식문서, Docker Hub