1. Docker란?
도커는 컨테이너 기반 오픈소스 가상화 플랫폼입니다.
애플리케이션과 그 실행 환경(OS, 라이브러리, 설정 등)을 하나의 패키지(컨테이너) 로 묶어
어디서나 동일하게 실행할 수 있게 해주는 기술입니다.
이로써 개발 환경과 운영 환경의 불일치를 자연스럽게 해소하며, 배포 과정을 자동화·표준화할 수 있습니다.
2. 기존 가상화와 Docker의 차이
기존의 가상화(VM)는 하이퍼바이저 위에 OS 전체를 실행하는 구조입니다.
반면 도커는 호스트 OS 커널을 공유하면서 프로세스 수준에서만 격리합니다.
이 덕분에 도커는 부팅이 빠르고, 자원 효율이 높으며, 경량화된 실행이 가능합니다.
| 구분 | 전통 가상화 (VM) | Docker (컨테이너) |
| 구조 | 게스트 OS 전체 실행 | 프로세스 단위 격리 (cgroups + namespace) |
| 성능 | 무겁고 부팅 느림 | 가볍고 빠름 |
| 자원 사용 | OS 포함 → 리소스 낭비 | 커널 공유 → 자원 효율적 |
| 배포 속도 | 수 분 이상 | 수 초 이내 |
| 격리 수준 | OS 단위 | 프로세스 단위 |
도커는 OS 전체를 복제하지 않고 필요한 프로세스만 격리(cgroups, namespace) 하기 때문에 성능 손실이 거의 없습니다.
3. 컨테이너의 개념
컨테이너는 독립된 공간에서 실행되는 프로세스 단위의 실행 환경입니다.
호스트 커널을 공유하지만, 각 컨테이너는 파일 시스템, 네트워크, 프로세스 공간을 분리해 독립적으로 동작합니다.
- 생성과 삭제가 빠르고, 무상태(stateless) 환경에 적합합니다.
- 실행 중인 컨테이너는 이미지 기반으로 생성되어 필요할 때마다 손쉽게 재생성 가능합니다.
발전 흐름
VirtualBox / VMware (전체 가상화)
↓
KVM / Xen (반가상화)
↓
LXC (리눅스 컨테이너)
↓
Docker (LXC + 관리도구 + 배포 표준화)
도커는 LXC 기반에서 발전해 자체 런타임(runc)을 도입했고
OCI(Open Container Initiative) 표준을 통해 컨테이너 생태계를 주도하고 있습니다.
4. 이미지(Image)
이미지는 컨테이너 실행을 위한 불변 템플릿입니다.
필요한 라이브러리, 설정, 실행 파일을 포함하며 읽기 전용으로 구성됩니다.
- 컨테이너는 이미지를 실행한 상태입니다.
- 변경 사항은 컨테이너의 읽기/쓰기(RW) 레이어에만 저장되며, 이미지 자체는 변하지 않습니다.
- 여러 컨테이너가 동일한 이미지를 공유할 수 있습니다.
| 구분 | 예시 | 설명 |
| Public Registry | docker.io/library/ubuntu:20.04 | 공개 저장소 (Docker Hub) |
| Private Registry | my.repo.local:5000/app:v1.0 | 사내 전용 저장소 |
| Tag | :v1, :latest, :20250118 | 이미지 버전 관리 |
5. 레이어 구조
이미지는 여러 개의 읽기 전용 레이어로 구성되어 있으며
변경이 발생할 때마다 새로운 레이어가 추가됩니다.
Docker는 UnionFS(유니온 파일시스템) 를 통해 여러 레이어를 하나로 합쳐 보여줍니다.
Ubuntu Base (Layer A)
↓
Nginx 설치 (Layer B)
↓
App 복사 (Layer C)
↓
컨테이너 실행 시 → R/W Layer 추가
이 구조 덕분에 캐시가 효율적으로 작동하여 빌드 속도가 빨라지고 저장 공간도 절약됩니다.
또한 여러 컨테이너가 동일한 하위 레이어를 공유하므로 디스크 낭비가 없습니다.
6. Dockerfile
Dockerfile은 이미지를 빌드하기 위한 명세서(DSL) 파일입니다.
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y nginx
COPY ./app /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
- -t: 이미지 이름 및 태그 지정
- . : 현재 디렉터리의 Dockerfile 사용
도커는 빌드 과정에서 명령별 레이어 캐시를 생성하며 변경된 부분 이후만 재빌드합니다.
이는 빠른 빌드와 효율적인 업데이트를 가능하게 합니다.
7. Docker 핵심 개념 정리
| 개념 | 설명 |
| 이미지(Image) | 실행에 필요한 설정·라이브러리 포함 불변 템플릿 |
| 컨테이너(Container) | 이미지를 실행한 실제 프로세스 |
| 레이어(Layer) | 이미지 구성 단위 (변경 시 새로운 레이어 추가) |
| 볼륨(Volume) | 컨테이너 외부의 지속 저장소 |
8. 주요 명령어 정리
컨테이너 관리
| 명령어 | 설명 |
| docker run [옵션] 이미지 | 새 컨테이너 실행 |
| docker ps -a | 실행 및 종료된 컨테이너 조회 |
| docker stop [이름] | 컨테이너 정지 |
| docker rm [이름] | 컨테이너 삭제 |
| docker exec -it [이름] bash | 컨테이너 내부 접속 |
| docker logs [이름] | 로그 확인 |
실행 옵션
| 옵션 | 설명 |
| -d | 백그라운드 실행 |
| -p 8080:80 | 포트 포워딩 |
| -v ./data:/var/lib/mysql | 볼륨 마운트 |
| -e KEY=VALUE | 환경 변수 설정 |
| --name myapp | 컨테이너 이름 지정 |
9. Docker Compose
여러 컨테이너(웹 서버, DB 등)를 하나의 서비스 단위로 관리하는 도구입니다.
`docker-compose.yml` 파일 하나로 전체 애플리케이션을 구성할 수 있습니다.
version: "3"
services:
app:
image: myapp:v1
ports:
- "8080:8080"
depends_on:
- db
db:
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=1234
- MYSQL_DATABASE=mydb
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
주요 명령어
| 명령어 | 설명 |
| docker compose up -d | 모든 컨테이너 백그라운드 실행 |
| docker compose down | 컨테이너 및 네트워크 종료 |
| docker compose ps | 상태 확인 |
| docker compose logs | 로그 조회 |
주의할 점
- .env 파일로 환경 변수 분리
- 데이터는 반드시 볼륨에 저장
- 서비스 간 통신은 http://db:3306처럼 서비스명 기반 접근
10. Docker Registry (이미지 저장소)
도커 이미지는 중앙 저장소(Registry)에 push/pull하여 공유 및 배포합니다.
# 로그인
docker login
# 빌드 및 태그
docker build -t myapp:v1 .
docker tag myapp:v1 myname/myapp:v1
# 업로드
docker push myname/myapp:v1
# 다른 서버에서 다운로드
docker pull myname/myapp:v1
이미지는 [Registry]/[사용자]/[이미지명]:[태그] 형식으로 관리되며
보안을 위해 HTTPS 전송 및 인증 토큰 기반 접근이 필수입니다.
11. 배포 및 업데이트 전략
기본 배포 순서
docker build -t myapp:v2 .
docker push myname/myapp:v2
docker stop myapp
docker rm myapp
docker pull myname/myapp:v2
docker run -d -p 8080:80 --name myapp myname/myapp:v2
- 컨테이너 삭제 시 데이터가 사라지므로, 볼륨 또는 외부 스토리지(S3 등) 사용이 필수입니다.
- 동일 서버 내에서 버전 교체가 빠르며, 롤백 시 이전 이미지로 재실행만 하면 됩니다.
12. 무중단 배포
도커 단독으로는 교체 시 서비스가 잠시 중단이 필연적입니다.
이를 해결하기 위해 Nginx 로드밸런서 또는 오케스트레이션 도구(Kubernetes, Docker Swarm) 를 사용합니다.
예시 시나리오
- v1 컨테이너가 서비스 중
- v2 컨테이너를 새로 실행
- Nginx가 트래픽을 점진적으로 v2로 전환
- 모든 요청이 v2로 이동하면 v1 종료
이 방식으로 트래픽 손실 없이 서비스 업데이트가 가능합니다.
마무리
도커는 이미지 → 컨테이너 → 레이어 → 레지스트리 → 배포로 이어지는 일관된 구조를 제공합니다.
가벼운 격리, 빠른 실행, 일관된 배포는 현대 개발 환경의 필수 요소입니다.
특히 CI/CD 파이프라인과 결합하면 빌드, 테스트, 배포의 모든 단계를 자동화할 수 있습니다.
'프로젝트 > 웹 성능 테스트' 카테고리의 다른 글
| DB 마이그레이션 (0) | 2025.10.25 |
|---|---|
| Git Flow 전략 (1) | 2025.10.24 |
| Docker 적용: 실습 (0) | 2025.10.12 |
| Docker 적용: 이론 (0) | 2025.10.12 |
| GHCR로 백엔드 도커 이미지 자동 빌드 & 푸시 (2) | 2025.09.07 |