도커(Docker)란?
도커(Docker)는 컨테이너(Container) 기반 가상화 기술을 제공하는 오픈소스 플랫폼.
애플리케이션과 해당 실행 환경을 컨테이너라는 단위로 패키징하여 어디서든 일관되게 실행할 수 있도록 해줌.
1. 도커의 핵심 개념
✅ 컨테이너(Container)
- 애플리케이션과 실행 환경을 격리된 공간에서 실행할 수 있도록 하는 경량 가상화 기술
- 호스트 OS 위에서 실행되며, OS 커널을 공유하므로 기존 가상 머신(VM)보다 가볍고 빠름
✅ 이미지(Image)
- 컨테이너 실행에 필요한 코드, 라이브러리, 설정 등을 포함한 불변(Immutable) 파일 시스템
- 컨테이너를 실행하기 위한 템플릿 역할
✅ 도커 허브(Docker Hub)
- 공식 및 사용자 생성 도커 이미지를 공유할 수 있는 클라우드 기반의 저장소
✅ 도커 파일(Dockerfile)
- 도커 이미지를 생성하기 위한 스크립트 파일
- FROM, RUN, CMD, COPY 등의 명령어로 이미지 빌드를 정의
✅ 도커 컴포즈(Docker Compose)
- 여러 개의 컨테이너를 정의하고 관리할 수 있도록 돕는 도구
- docker-compose.yml 파일을 통해 여러 컨테이너를 한 번에 실행 가능
✅ 도커 볼륨(Volumes)
- 컨테이너 간 데이터 공유 및 영속적 데이터 저장을 위한 기능
- 컨테이너 삭제 시에도 데이터를 유지할 수 있음
※도커 컨테이너는 애플리케이션과 실행 환경을 하나의 단위로 패키징하여 독립적으로 실행할 수 있는 가상화 기술.
1. 도커 컨테이너의 주요 특징
✅ 1) 경량성(Lightweight)
- 기존 VM처럼 OS 전체를 포함하지 않고, 애플리케이션 실행에 필요한 파일과 라이브러리만 포함.
- OS 커널을 공유하기 때문에 리소스 사용량이 적고 실행 속도가 빠름.
- 일반적인 VM은 몇 GB의 공간이 필요하지만, 컨테이너는 MB 단위로 실행 가능.
✅ 2) 이식성(Portability)
- 컨테이너는 운영체제와 독립적으로 동작하므로,
어디서든 동일한 환경에서 실행 가능 (로컬, 서버, 클라우드 등).
✅ 3) 독립성(Isolation)
- 각 컨테이너는 서로 독립적으로 실행되며, 다른 컨테이너와 충돌하지 않음.
- 호스트 OS에 영향을 주지 않고, 자체적인 라이브러리와 실행 환경을 가질 수 있음.
✅ 4) 빠른 실행 & 배포
- VM은 부팅할 때 OS를 로딩해야 하지만, 컨테이너는 바로 실행 가능.
- 이미지를 기반으로 컨테이너를 실행하면, 수초 내로 서비스 실행 가능.
3. 도커 컨테이너의 구성 요소
컨테이너는 기본적으로 이미지를 기반으로 실행됨.
도커 컨테이너를 만들기 위해 필요한 개념들
1) 이미지(Image)
- 컨테이너 실행에 필요한 코드, 라이브러리, 설정 등을 포함한 불변(Immutable) 파일 시스템.
- Dockerfile을 사용하여 이미지를 만들 수 있음.
- 컨테이너는 이미지를 기반으로 실행됨.
- 예: nginx:latest, mysql:8.0, ubuntu:22.04
2) 컨테이너(Container)
- 도커 이미지를 실행한 상태.
- 실행 중인 프로세스가 격리된 환경에서 동작하도록 도와줌.
- 컨테이너는 독립적으로 실행되지만, 필요하면 네트워크, 볼륨 등을 통해 다른 컨테이너와 연결 가능.
3) 컨테이너 네트워크(Network)
- 컨테이너 간 통신을 위한 가상 네트워크 환경을 제공.
- 여러 컨테이너가 같은 네트워크에서 통신할 수 있음.
4) 컨테이너 볼륨(Volumes)
- 컨테이너 내부의 데이터를 영구적으로 저장하기 위한 스토리지.
- 컨테이너가 삭제되어도 데이터를 유지할 수 있음.
2. 도커 vs 가상 머신(VM)
구분 | 도커(컨테이너) | 가상 머신(VM) |
실행 방식 | 호스트 OS의 커널을 공유 | 별도의 OS를 포함한 전체 가상 환경 |
속도 | 빠름 (몇 초 내 실행) | 느림 (부팅 및 OS 로딩 필요) |
리소스 사용 | 가벼움 (MB 단위) | 무거움 (GB 단위) |
격리 수준 | 프로세스 단위 격리 | OS 단위 격리 |
1. 도커와 가상 머신의 차이
도커는 컨테이너 기술을 사용하고, 가상 머신(VM)은 하이퍼바이저 기술을 사용
- 도커는 가상 머신보다 가볍고 빠르지만, 완전한 OS를 제공하지 않음.
- VM은 도커보다 무겁지만, 독립적인 OS 환경이 필요할 때 유용함.
2. 언제 도커를 사용하고, 언제 VM을 사용할까?
✅ 도커가 유리한 경우
- 개발 및 테스트 환경 통합 → 같은 환경을 어디서든 쉽게 재현 가능
- 마이크로서비스 아키텍처(MSA) → 여러 서비스를 각각의 컨테이너로 분리
- 배포 자동화 (CI/CD) → 빠르게 애플리케이션을 빌드하고 배포 가능
- 리소스가 제한적인 환경 → 가벼워서 서버 자원을 아낄 수 있음
✅ VM이 유리한 경우
- 다른 OS가 필요한 경우 → 예: 리눅스와 윈도우를 함께 운영
- 완전한 격리 환경이 필요할 때 → 높은 보안이 중요한 금융 시스템
- 도커를 실행할 환경 자체가 필요할 때 → 도커는 리눅스 기반이라, 윈도우나 Mac에서 실행하려면 VM을 사용할 수도 있음
3. 실제 개발 환경에서는?
- 로컬 개발에서는 도커를 주로 사용
- 서버 운영에서는 도커로 컨테이너를 배포하거나, 쿠버네티스(Kubernetes)와 함께 사용
- 클라우드 환경에서는 VM 위에서 도커를 실행하는 경우도 많음
결론
✔ 가상 머신을 완전히 대체하는 건 아니지만, 대부분의 개발 및 배포 환경에서는 VM 대신 도커를 쓰는 것이 일반적.
✔ 하지만 완전한 OS 환경이 필요하면 VM을 사용해야 함.
✔ 실제 운영 환경에서는 VM 위에서 도커를 돌리는 경우도 많음 (ex: 클라우드 서비스)
3. 도커의 주요 명령어
# 도커 버전 확인
docker -v
# 도커 이미지 목록 조회
docker images
# 도커 컨테이너 목록 조회
docker ps -a
# 도커 컨테이너 실행 (백그라운드 실행)
docker run -d -p 8080:80 --name my-container nginx
# 실행 중인 컨테이너 정지
docker stop my-container
# 컨테이너 삭제
docker rm my-container
# 도커 이미지 삭제
docker rmi nginx
# 도커 컴포즈 실행
docker-compose up -d
4. 도커의 활용 사례
- 개발 환경 통합: 팀원 간 동일한 개발 환경 제공
- 마이크로서비스 아키텍처(MSA): 서비스별 컨테이너 운영
- CI/CD 파이프라인: 자동화된 배포 및 테스트 환경 구성
- 클라우드 환경에서 확장성 제공: AWS, GCP, Azure 등과 연동
5. 도커 사용 시 고려할 점
- 보안: 컨테이너 간 격리 수준이 VM보다 낮으므로 보안 설정 필요
- 데이터 관리: 컨테이너 삭제 시 데이터 손실을 방지하기 위해 볼륨 사용 필수(보통은 이미지를 삭제함, 컨테이너 삭제시 컨테이터 자제가 사라짐)
- 네트워크 구성: 여러 컨테이너 간 네트워크 연결을 고려해야 함
6. 도커와 쿠버네티스(Kubernetes)
- 도커는 컨테이너 실행 및 관리에 집중
- 쿠버네티스는 컨테이너 오케스트레이션(배포, 스케일링, 로드 밸런싱 등)을 자동화
결론
도커는 백엔드 개발에서 일관된 개발 환경 제공, 배포 자동화, 확장성 등의 장점이 있어 필수적으로 학습해야 하는 기술이다. 특히, 도커를 MySQL, Redis, Nginx 등의 서비스와 함께 사용하여 로컬 개발 환경을 구축하는 것이 기본적인 활용 방법이다.