— DevOps Lecture 2026 · Introduction to Docker

🐳 Docker 기초

컨테이너 기반 가상화 플랫폼 Docker의 핵심 개념부터 실전 활용까지. Build once, Run anywhere.

2026 DevOps
24 슬라이드
Docker 기초
01 — Definition

🐳Docker의 정의

Docker란?

Docker는 애플리케이션을 컨테이너라는 격리된 환경에 패키징하여
어디서나 실행할 수 있게 해주는 오픈소스 플랫폼입니다.

Solomon Hykes가 개발했으며,
현대 소프트웨어 개발과 배포의 핵심 도구가 되었습니다.

💡 핵심 개념

Docker는 "Build once, Run anywhere" 철학을 실현합니다.
한 번 만든 컨테이너는 개발 환경, 테스트 환경, 프로덕션 환경 어디서나 동일하게 작동합니다.

📺 (YouTube) The future of Linux Containers

02 — Why Docker

🤔왜 Docker를 사용할까요?

1. 환경 일관성 보장

  • "내 컴퓨터에서는 되는데?" 문제를 해결합니다.
  • 개발, 스테이징, 프로덕션 환경이 완전히 동일합니다.
  • 팀원 간 환경 차이로 인한 버그를 방지합니다.

2. 빠른 배포와 확장

  • 가상 머신보다 훨씬 가볍고 빠르게 시작됩니다. (수 초 내)
  • 마이크로서비스 아키텍처(MSA)에 최적화되어 있습니다.
  • 필요에 따라 컨테이너를 즉시 추가/제거할 수 있습니다.

3. 리소스 효율성

  • 호스트 OS 커널을 공유하여 오버헤드가 적습니다.
  • 동일 하드웨어에서 더 많은 앱을 실행할 수 있습니다.

4. 격리성과 보안

  • 각 컨테이너는 독립적인 환경에서 실행됩니다.
  • 의존성 충돌 문제를 원천적으로 해결합니다.

5. 버전 관리와 롤백

  • Docker 이미지를 버전별로 관리할 수 있습니다.
  • CI/CD 파이프라인과 완벽하게 통합됩니다.

📚 용어 정리 : 호스트 OS와 커널

1. 호스트 OS (Host OS)

물리적인 하드웨어에 직접 설치되어, 가상 머신들에게 자원을 배분하고 관리하는 운영체제입니다.

  • 자원 추상화: CPU, 메모리, 스토리지 등 물리 하드웨어를 가상 자원으로 변환합니다.
  • 하이퍼바이저 실행: VMware, VirtualBox 같은 하이퍼바이저가 구동되는 기반이 됩니다.

2. 커널 (Kernel)

시스템의 가장 낮은 수준에서 프로세스 관리, 메모리 관리, 파일 시스템 관리를 수행합니다.

  • VM: 집을 땅부터 새로 짓는 것 → 무겁고 느림
  • 컨테이너: 건물의 기초(커널)를 공유하고 방(컨테이너)만 나누어 쓰는 것 → 가볍고 빠름
03 — Necessity

🏛️Docker의 필요성

😰 기존 개발 환경의 문제점

1. 복잡한 환경 설정

OS, 라이브러리, 의존성 설치...

2. 내 컴퓨터에선 성공

"Works on my machine"

3. 다른 컴퓨터에선 😭

환경 불일치로 인한 오류 발생

💡 핵심 요약

  • Docker는 단순한 소스 코드뿐만 아니라 실행 환경(OS 설정, 라이브러리 등)까지 통째로 패키징하여 배포합니다.
  • 이를 통해 "개발 환경(내 컴퓨터)에서는 잘 되는데, 다른 쪽에서는 안 되는" 불일치 문제를 원천적으로 해결합니다.
04 — Container

📦컨테이너란?

컨테이너의 개념

컨테이너는 애플리케이션과 그 실행에 필요한 모든 것(코드, 런타임, 시스템 도구, 라이브러리, 설정)을 포함하는 표준화된 소프트웨어 단위입니다.

컨테이너의 핵심 특징

1. 격리성 (Isolation)

각 컨테이너는 자체 파일 시스템, 프로세스, 네트워크를 가지며 다른 컨테이너와 완전히 격리됩니다.

2. 이식성 (Portability)

한 번 생성된 컨테이너 이미지는 Docker가 설치된 어느 환경에서나 실행 가능합니다.

3. 경량성 (Lightweight)

OS 커널을 공유하므로 VM보다 훨씬 가볍고 빠릅니다.

4. 불변성 (Immutability)

컨테이너 이미지는 변경 불가능하여 일관성이 보장됩니다.

05 — Container vs VM

⚔️컨테이너 vs 가상 머신 (VM)

가상 머신의 구조

  • 하드웨어 → 호스트 OS → 하이퍼바이저 → 게스트 OS → 애플리케이션
  • 각 VM마다 완전한 OS가 필요합니다 (GB 단위)
  • 부팅 시간이 분 단위로 소요됩니다.

컨테이너의 구조

  • 하드웨어 → 호스트 OS → Docker Engine → 컨테이너
  • 호스트 OS의 커널을 공유합니다.
  • 부팅 시간이 초 단위로 매우 빠릅니다.
  • 크기가 작습니다 (MB 단위).

⚡ 성능 비교

  • 시작 시간: VM은 수 분, 컨테이너는 수 초
  • 크기: VM은 수 GB, 컨테이너는 수십 MB~수백 MB
  • 성능: VM은 오버헤드 높음, 컨테이너는 거의 네이티브 수준
  • 밀도: 동일 서버에서 컨테이너를 훨씬 더 많이 실행 가능
06 — Monolithic to MSA

🏗️모놀리식에서 MSA로의 진화

1. 모놀리식

거대한 단일 애플리케이션
(수정/배포가 어려움)

2. 컨테이너 패키징

환경 일관성 확보

3. 마이크로서비스 (MSA)

기능 단위로 쪼개어 독립 배포

💡 핵심 요약

  • Docker 컨테이너 기술의 발전 덕분에, 애플리케이션을 레고 블록처럼 작은 단위로 나누어 관리하기 수월해졌습니다.
  • 이를 바탕으로, 오늘날의 많은 시스템들이 모놀리식에서 MSA(마이크로서비스 아키텍처)로 진화할 수 있게 되었습니다.
07 — Docker Hub

🌐Docker Hub

Docker Hub란?

🔗 Docker Hub는 Docker 이미지를 저장하고 공유할 수 있는 클라우드 기반 레지스트리 서비스입니다.

Docker Hub 홈

이미지 검색 (예: Python)

📚 용어 정리: 이미지 태그 (Tag)

  • latest: 가장 최신 버전 (기본값)
  • slim: 최소한의 패키지만 설치하여 크기를 줄인 버전
  • alpine: Alpine Linux 기반의 초경량 이미지 (5MB 내외)
  • bookworm / bullseye: Debian Linux의 버전 코드네임
  • windowsservercore: Windows 기반 컨테이너 이미지
08 — Commands

⌨️Docker 주요 명령어

기본 정보 확인

docker version # Docker 버전 확인 docker info # 시스템 정보 확인

이미지 관련

docker images # 다운로드된 이미지 목록 확인 docker pull [이미지명]:[태그] # 이미지 다운로드 docker rmi [이미지명]:[태그] # 이미지 삭제 docker build -t [이미지명]:[태그] [경로] # Dockerfile로 이미지 빌드

저장소(Hub) 관련

docker login # Docker Hub 로그인 docker push [이미지명]:[태그] # Docker Hub에 업로드 docker logout # 로그아웃

컨테이너 관련

docker ps # 실행 중인 컨테이너 목록 docker ps -a # 모든 컨테이너 목록 docker run [옵션] [이미지명] [명령어] # 컨테이너 실행 docker start [컨테이너명] # 정지된 컨테이너 시작 docker stop [컨테이너명] # 실행 중인 컨테이너 정지 docker rm [컨테이너명] # 컨테이너 삭제 docker exec -it [컨테이너명] [명령어] # 명령어 전달 docker logs [컨테이너명] # 컨테이너 로그 확인 docker stats [컨테이너명] # 리소스 사용량 실시간 확인
09 — System Info

🔍Docker 정보 확인

Docker가 정상적으로 설치되었는지 버전 및 시스템 정보를 확인합니다.

Docker version 확인

[devops@localhost ~]$ sudo docker version

📋 출력 결과 보기

Client: Docker Engine - Community Version: 29.2.1 API version: 1.53 Go version: go1.25.6 Git commit: a5c7197 Built: Mon Feb 2 17:20:19 2026 OS/Arch: linux/amd64 Server: Docker Engine - Community Engine: Version: 29.2.1 API version: 1.53 (minimum version 1.44) containerd: Version: v2.2.1 runc: Version: 1.3.4
  • Client: Docker CLI(명령줄 도구)의 버전 정보입니다.
  • Server (Engine): Docker 데몬(서버)의 버전 정보입니다.
  • containerd: 컨테이너 런타임의 버전입니다.
  • runc: OCI 컨테이너를 생성/실행하는 저수준 런타임입니다.

Docker info 확인

[devops@localhost ~]$ sudo docker info

📋 출력 결과 보기

Server: Containers: 1 Running: 0 Paused: 0 Stopped: 1 Images: 1 Server Version: 29.2.1 Storage Driver: overlayfs Cgroup Driver: systemd Cgroup Version: 2 Kernel Version: 6.12.0-124.38.1.el10_1.x86_64 Operating System: Red Hat Enterprise Linux 10.1 (Coughlan) OSType: linux Architecture: x86_64 CPUs: 4 Total Memory: 3.567GiB
  • Containers / Images: 시스템의 컨테이너/이미지 수입니다.
  • Storage Driver: 시스템의 이미지 저장 드라이버입니다.
  • Cgroup Driver / Version: 시스템의 cgroup 설정입니다.
  • Operating System: Docker가 실행 중인 호스트 OS 정보입니다.
10 — Hands-on

🏃컨테이너 실행 실습

Docker 이미지 다운로드 및 확인

[devops@localhost ~]$ docker pull ubuntu:24.04 [devops@localhost ~]$ docker images IMAGE ID DISK USAGE CONTENT SIZE EXTRA ubuntu:24.04 d1e2e92c075e 117MB 31.7MB

컨테이너 실행 및 내부 탐색

[devops@localhost ~]$ docker run -it ubuntu:24.04 /bin/bash root@31626aafe092:/# ls -l total 0 lrwxrwxrwx. 1 root root 7 Apr 22 2024 bin -> usr/bin drwxr-xr-x. 2 root root 6 Apr 22 2024 boot ... root@31626aafe092:/# ifconfig bash: ifconfig: command not found root@31626aafe092:/# exit exit

💡 실습 포인트

  • docker pull ubuntu:24.04: Docker Hub에서 Ubuntu 24.04 이미지를 다운로드합니다.
  • docker run -it ubuntu:24.04 /bin/bash: 컨테이너를 생성하고 대화형 쉘로 접속합니다.
    • -i: 표준 입력(stdin)을 열어둡니다.
    • -t: 가상 터미널을 할당합니다.
  • ifconfig: 컨테이너는 최소한의 패키지만 포함하므로 추가 도구는 설치되어 있지 않습니다.
  • exit: 컨테이너 쉘을 종료하고 호스트로 돌아옵니다.
11 — Build

🏗️이미지 생성 및 빌드

실제 예제 프로젝트 flask-app을 기반으로 Docker 이미지를 만드는 과정을 살펴봅니다.

📁 프로젝트 구조

flask-app ├── app.py ← Flask 애플리케이션 코드 ├── requirements.txt ← Python 패키지 목록 └── Dockerfile ← 이미지 빌드 설정 파일

📄 app.py

from flask import Flask, jsonify app = Flask(__name__) @app.route("/") def read_root(): return jsonify({"message": "Hello, Flask!"}) @app.route("/health") def health_check(): return jsonify({"status": "healthy"}) if __name__ == "__main__": app.run(host="0.0.0.0", port=5000)

🔨 이미지 빌드

[devops@localhost flask-app]$ docker build -t flask-image:1.0 .

💡 빌드 과정 이해

  • docker build는 Dockerfile의 명령어를 한 줄씩 읽으며, 각 명령어마다 레이어(Layer)를 생성합니다.
  • -t flask-image:1.0은 이미지 이름과 태그를 지정합니다.
  • . 은 현재 디렉토리를 빌드 컨텍스트로 지정합니다.
12 — Manage

🔎이미지 관리 및 조회

이미지 목록 확인

[devops@localhost flask-app]$ docker images

📋 출력 결과 보기

REPOSITORY TAG IMAGE ID CREATED SIZE localhost/flask-image 1.0 63f16af12933 About a minute ago 145 MB

이미지 상세 정보 확인

[devops@localhost flask-app]$ docker inspect 63f16af12933

이미지의 설정, 레이어, 환경 변수 등을 JSON 형식으로 상세 출력합니다.

이미지 레이어 히스토리 확인

[devops@localhost flask-app]$ docker history flask-image:1.0

📋 출력 결과 보기

ID CREATED CREATED BY SIZE 9390163bea97 2 minutes ago /bin/sh -c #(nop) CMD ["python", "app.py"] 0B <missing> 2 minutes ago /bin/sh -c #(nop) EXPOSE 5000 0B <missing> 2 minutes ago /bin/sh -c #(nop) WORKDIR /project 0B a0b2bb52a6d8 2 minutes ago /bin/sh -c pip install --no-cache-dir -r r... 16.3MB 9f8101a81d5a 2 minutes ago /bin/sh -c #(nop) COPY file:395a... 2.05kB

💡 각 명령어마다 레이어가 생성되는 것을 볼 수 있습니다.

13 — Distribute

🌐이미지 배포 및 가져오기

이미지 다운로드

docker pull [이미지명] # 예시: docker pull nginx:latest

이미지 업로드

docker push [이미지명] # 예시: docker push myuser/my-app:v1

이미지 검색

docker search [키워드] # 예시: docker search python

💡 배포 워크플로우

  • 1단계: docker login으로 Docker Hub에 로그인합니다.
  • 2단계: docker tag로 이미지에 저장소 이름을 붙입니다.
  • 3단계: docker push로 이미지를 업로드합니다.
  • 4단계: 다른 서버에서 docker pull로 다운로드하여 사용합니다.
14 — Cleanup

🧹이미지 삭제 및 정리

이미지 삭제 실습

[devops@localhost flask-app]$ docker rmi flask-image:1.0

📋 출력 결과 보기

Untagged: localhost/flask-image:1.0 Deleted: 30f5e5232718146b86a... Deleted: 3d17551f57e2a8fe0fd...

⚠️ 각 레이어가 하나씩 삭제되는 것을 확인할 수 있습니다.

미사용 이미지 일괄 정리

docker image prune # 모든 미사용 이미지 삭제 (태그 있는 것 포함) docker image prune -a

전체 정리 (System Prune)

docker system prune # 볼륨까지 포함하여 전체 정리 docker system prune --volumes

⚠️ 주의사항

  • docker rmi: 해당 이미지를 사용하는 컨테이너가 있으면 삭제할 수 없습니다.
  • docker image prune -a: 사용하지 않는 모든 이미지를 삭제하므로 주의가 필요합니다.
15 — Dockerfile

📄Dockerfile 이해하기

Dockerfile은 Docker 이미지를 만들기 위한 설정 파일입니다. 실제 Dockerfile을 통해 각 명령어 배치를 알아봅니다.

📄 ./flask-app/Dockerfile

# 1. 베이스 이미지 지정 FROM python:3.11-slim # 2. requirements 종속성 복사 COPY requirements.txt . # 3. 패키지 설치 RUN pip install --no-cache-dir -r requirements.txt # 4. 소스 코드 복사 및 작업 공간 지정 COPY . /project WORKDIR /project # 5. 포트 명시 및 실행 명령 EXPOSE 5000 CMD ["python", "app.py"]

💡 순서가 중요한 이유 — 캐시

  • requirements.txt를 제일 먼저 복사하면, 코드만 수정했을 때 패키지 설치 단계를 캐시로 재사용할 수 있어 빌드가 무척 빨라집니다.
  • Dockerfile은 위에서 아래로 순서대로 실행됩니다.
  • 파일 이름은 반드시 Dockerfile(대소문자 주의)이어야 합니다.
16 — Dockerfile Commands

📝주요 Dockerfile 명령어

FROM / COPY / RUN

FROM ubuntu:20.04 FROM node:18-alpine WORKDIR /app COPY package.json /app/ COPY . /app RUN apt-get update RUN pip install -r requirements.txt

CMD vs ENTRYPOINT

# CMD: 기본 실행 명령 (덮어쓰기 가능) CMD ["node", "server.js"] # ENTRYPOINT: 고정 실행 명령 ENTRYPOINT ["python", "app.py"]

ENV / EXPOSE

ENV NODE_ENV=production ENV PORT=3000 EXPOSE 3000

💡 차이점

  • COPY vs ADD: COPY는 로컬 파일만 복사하고, ADD는 압축해제 및 원격 URL을 지원합니다. 가급적 COPY 사용.
  • CMD: 컨테이너 실행 시 docker run ... [명령] 으로 변경 가능합니다.
17 — Dockerfile Reference

📄Dockerfile 작성하기

명령어 설명
FROM베이스 이미지 지정 (예: FROM python:3.9)
LABEL이미지 메타데이터(작성자, 버전 등) 추가
RUN이미지 빌드 시 실행할 리눅스 명령어 (패키지 설치 등)
WORKDIR작업 디렉토리 설정 (cd와 유사)
COPY / ADD호스트의 파일을 컨테이너로 복사 (ADD는 URL/압축해제 지원)
ENV환경 변수 설정 (실행 시에도 유지됨)
ARG빌드 시점에만 유효한 변수 정의
EXPOSE컨테이너가 사용할 포트 명시 (문서화 용도)
CMD컨테이너 시작 시 실행할 기본 명령어 (오버라이드 가능)
ENTRYPOINT컨테이너 시작 시 무조건 실행되는 명령어

* 레이어를 추가하는 명령어: FROM, RUN, COPY, ADD

18 — Build Process

🔨이미지 빌드하기

flask-app 빌드 실습

# 현재 디렉토리 기준 빌드 [devops@localhost flask-app]$ docker build -t flask-image:1.0 . # 배포용 태그 추가 발급 [devops@localhost flask-app]$ docker build -t flask-image:latest .

캐시 없이 처음부터 빌드

[devops@localhost flask-app]$ docker build --no-cache -t flask-image:1.0 .

🐍 빌드 최적화 팁 (Python)

# ❌ 비효율적 — 소스코드 변경 시마다 패키지 전부 재설치 COPY . /project RUN pip install -r requirements.txt # ✅ 효율적 — requirements 먼저 복사 (변경 없으면 캐시 재사용) COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . /project

💡 빌드 옵션 정리

  • -t [이름]:[태그]: 이미지 태그 지정
  • -f [파일명]: 기본 Dockerfile이 아닌 다른 파일 사용
  • . (마지막 점): 빌드 경로를 현재 폴더로 지정
19 — Run

🚀컨테이너 실행하기

flask-app 컨테이너 실행

[devops@localhost flask-app]$ docker run -d -p 5000:5000 --name=flask-container flask-image:1.0

로그 확인

[devops@localhost flask-app]$ docker logs flask-container

📋 출력 결과 보기

* Serving Flask app 'app' * Running on http://127.0.0.1:5000

API 접속 확인

[devops@localhost flask-app]$ curl 127.0.0.1:5000 {"message":"Hello, Flask!"}

컨테이너 중지 및 삭제

[devops@localhost flask-app]$ docker stop flask-container [devops@localhost flask-app]$ docker rm flask-container

💡 주요 옵션 정리

  • -d: 백그라운드 환경에서 컨테이너 실행
  • -p 5000:5000: 호스트포트:컨테이너포트 연결 설정
  • --name: 컨테이너 이름 지정
  • 종료 시 stop 명령 후 rm 명령으로 깔끔히 정리합니다.
20 — Dockerfile Examples

📝Dockerfile 예제

Python (FastAPI) — ./fast-api-app

FROM python:3.11-slim COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . /project WORKDIR /project EXPOSE 8000 CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]

📄 requirements.txt: fastapi==0.115.0, uvicorn==0.30.0

21 — Summary

📌핵심 정리

1️⃣ Docker란 무엇인가?

  • 컨테이너 기반 가상화 플랫폼
  • "Build once, Run anywhere" 철학
  • 환경 일관성, 빠른 배포, 리소스 효율성 제공

2️⃣ 컨테이너

  • 애플리케이션과 의존성을 포함하는 표준화된 단위
  • VM보다 가볍고 빠름 (초 단위 시작, MB 단위 크기)
  • 격리성, 이식성, 불변성 보장

3️⃣ 주요 명령어

# 이미지 docker pull, docker images, docker rmi # 컨테이너 docker run, docker ps, docker stop, docker rm docker exec, docker logs # 시스템 docker system prune

4️⃣ Docker Build & Run

# Dockerfile 핵심 명령어 FROM, WORKDIR, COPY, RUN, EXPOSE, CMD # 빌드 및 실행 docker build -t app:tag . docker run -d -p 8080:3000 app:tag

🎉 수고하셨습니다!

Docker 강의를 완료하셨습니다! 이제 Docker의 기본 개념과 핵심 기능을 이해하고 있습니다. 실습을 통해 경험을 쌓고, Kubernetes로 나아가세요!

이동  ·  T 테마
×
×