01 Docker 기초
CKA 공부를 시작하면서 기초적인 Docker에 대한 내용을 한번 정리 해보았습니다.
Docker 등장 배경 — Before Docker
개발(Dev) / 테스트(Test) / 운영(Prod) 환경이 각각 독립된 VM으로 운영되던 시절의 문제:
문제 내용
| 의존성 불일치 | Dev는 Python 3.4, Prod는 Python 3.1 → 배포하면 깨짐 |
| 비효율적 자원 사용 | VM마다 OS 따로 설치 → 스토리지 낭비, 라이선스 비용 |
| 복잡하고 오류 잦은 배포 | 팀마다 수동 설치, 포트/라이브러리 설정이 제각각 |
| 격리 부재 | 같은 VM에 앱 여러 개 → 포트 충돌, 라이브러리 충돌 |
"내 컴퓨터에서는 되는데요" — Docker 이전의 고질적 문제
Docker란?
컨테이너화(Containerization) 플랫폼 — 애플리케이션을 모든 의존성과 함께 패키징해 어디서든 동일하게 실행되도록 함.
배송 컨테이너 비유
배송 컨테이너 Docker
| 규격 표준화 | Dockerfile로 구조 표준화 |
| 어디든 운반 가능 | Docker Engine만 있으면 어디서든 실행 |
| 내용물 격리 | 컨테이너별 독립 환경 |
| 필요한 만큼 추가 | 컨테이너 수평 확장 |
Docker가 해결하는 것
- 표준화: Dockerfile이라는 통일된 형식
- 이식성: Docker Engine만 있으면 Mac, Linux, Windows 어디든 동일 동작
- 격리: 컨테이너마다 독립 환경 → 충돌 없음
- 효율: 컨테이너는 Host OS 커널 공유 → VM보다 가볍고 빠른 부팅
VM vs Docker 아키텍처
VM 구조 Docker 구조
───────────────────── ─────────────────────
물리 서버 물리 서버
└── Hypervisor └── Hypervisor (선택)
├── OS + App 1 └── VM (Linux OS)
├── OS + App 2 └── Docker Engine
└── OS + App 3 ├── Container 1
├── Container 2
└── Container 3
- VM: OS를 각각 설치 → 무겁고 느림
- Docker: Host 커널 공유 → 가볍고 빠른 부팅
- 실제로는 VM 위에 Docker Engine 설치해서 사용하는 게 일반적
핵심 개념 3가지
Docker Image
- Dockerfile로 만들어진 빌드 결과물
- 코드 + 모든 의존성(라이브러리, 설정 파일 등) 포함
- 불변(Immutable) — 한번 만들면 내용이 변하지 않음
- 생성 명령어: docker build
Docker Container
- Image의 실행 인스턴스
- Image = 설계도, Container = 실제로 돌아가는 것
- 실행 명령어: docker run
Docker Registry
- Image를 저장하고 배포하는 저장소
- docker push로 업로드, docker pull로 다운로드
종류 예시
| 공개 Registry | Docker Hub, Ubuntu 이미지 등 |
| 비공개 Registry | AWS ECR, Azure ACR, JFrog Artifactory, Nexus |
Docker Engine 구성
Docker CLI → REST API → Docker Daemon
(대시보드) (배선) (엔진/두뇌)
구성요소 역할
| Docker CLI | 사용자가 명령을 입력하는 인터페이스 (docker build, docker run 등) |
| REST API | CLI 명령을 Daemon이 이해하는 HTTP 형식으로 변환 |
| Docker Daemon | 실제로 이미지 빌드, 컨테이너 실행 등을 수행하는 핵심 프로세스 |
Docker 워크플로우
개발자
1. 코드 작성 + Dockerfile 작성 (버전 관리 시스템에 저장)
2. docker build → Docker Image 생성 (로컬 저장)
3. docker push → Docker Registry에 업로드
4. docker run → 로컬 VM에서 컨테이너 실행 (개발 검증)
DevOps 팀
5. docker pull → Registry에서 Image 다운로드
6. docker run → 테스트/운영 환경에서 동일하게 실행
Dev에서 동작하면 Test, Prod에서도 동일하게 동작 → "내 컴퓨터에서는 되는데요" 문제 해결
의존성(Dependency)이란?
애플리케이션이 실행되기 위해 필요한 모든 것:
- Docker Engine (컨테이너 실행 환경)
- 런타임 (Java 9, Python 3.4 등)
- 라이브러리
- 설정 파일 (DB 연결 정보 등)
→ Docker Image 안에 이 모든 것을 함께 패키징
Dockerfile 예시 (최소)
FROM ubuntu:latest # 베이스 이미지 지정
CMD ["echo", "hello docker"] # 컨테이너 실행 시 실행할 명령
현대 DevOps에서의 역할 분담
역할 주요 책임
| Developer | 코드 작성 + Dockerfile 작성 (99% 케이스) |
| DevOps Engineer | Dockerfile 검토, Registry 관리, 배포 자동화 (CI/CD) |
https://www.youtube.com/watch?v=r3QWVLeA5qM&list=PLmPit9IIdzwRjqD-l_sZBDdPlcSfKqpAt&index=2
'Network' 카테고리의 다른 글
| AWS VPC 물리서버 기준 통신 원리 (0) | 2026.06.01 |
|---|---|
| 진짜 공격인 줄 알았는데 우리가 만든 장애였다 (0) | 2026.04.02 |
| AWS SAA-CO3 합격 후기 (0) | 2026.03.07 |
| Terraform으로 EC2 관리하면서 겪은 AMI 필터링과 SSM 연결 이슈 (0) | 2026.02.25 |
| Kind 클러스터에서 SandboxChanged 에러 해결하기: systemd와 containerd의 갈등 해소 (1) | 2026.01.20 |