Docker란 무엇인가? 쉽게 이해하는 컨테이너 기술
홈서버를 본격적으로 운영하려면 여러 프로그램들을 설치하고, 연결하고, 설정해야 한다.
예를 들어 웹서버(Nginx), 데이터베이스(MySQL), 워드프레스 등… 이걸 전부 수동으로 설치하려면 설정할 게 너무 많고, 잘못되면 하나 때문에 전체 시스템을 다시 깔아야 할 수도 있다.
그래서 등장한 게 바로 Docker(도커)다.
🐳 Docker란?
Docker는 컨테이너(Container) 기술 기반의 가상화 도구다. 쉽게 말해, 작고 가벼운 가상 머신이라고 보면 된다.
기존의 가상 머신(VM)은 운영체제를 통째로 띄우기 때문에 무겁고 느리지만, Docker는 내 서버의 OS 위에서 바로 실행되기 때문에 빠르고 가볍다.
👉 Docker는 프로그램을 ‘컨테이너’라는 독립된 공간에 담아 설치와 실행을 한 번에 할 수 있게 해주는 도구다.
🤔 왜 Docker가 필요할까? – 실제 사례로 이해하기
시나리오 1: 전통적인 방식 (Docker 없이)
워드프레스를 설치하려면 일반적으로는:
- 웹서버 설치
sudo apt install nginx sudo nano /etc/nginx/sites-available/default # 설정 파일 수정... - PHP 설치 및 설정
sudo apt install php-fpm php-mysql sudo nano /etc/php/8.1/fpm/php.ini # PHP 설정... - MySQL 설치 및 DB 생성
sudo apt install mysql-server sudo mysql_secure_installation mysql -u root -p CREATE DATABASE wordpress; CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost'; - 워드프레스 다운로드 및 설정
cd /var/www/html wget https://wordpress.org/latest.tar.gz tar -xzvf latest.tar.gz sudo chown -R www-data:www-data wordpress sudo nano wordpress/wp-config.php # DB 연결 정보 입력... - 권한 설정, 방화벽 설정, 서비스 재시작…
소요 시간: 1~2시간 (처음이면 더 오래 걸림)
문제점:
- 한 단계라도 실수하면 전체가 작동 안 함
- 다른 서버에 똑같이 설치하려면 전 과정 반복
- PHP 버전 업데이트 시 워드프레스 호환성 문제 발생 가능
- 삭제할 때도 일일이 수동으로 정리
시나리오 2: Docker 방식
# docker-compose.yml 파일 하나만 만들고
docker-compose up -d
소요 시간: 5분
장점:
- 모든 구성 자동 설정
- 다른 서버에 복사만 하면 똑같이 작동
- 버전 호환성 문제 없음 (컨테이너 내부에 전부 포함)
- 삭제도 한 줄:
docker-compose down
이게 Docker의 위력이다.
📦 Docker vs 가상머신 (VM) – 무엇이 다를까?
비교표
| 구분 | 가상머신 (VM) | Docker 컨테이너 |
|---|---|---|
| 가상화 방식 | 하드웨어 가상화 | OS 수준 가상화 |
| OS 포함 여부 | 각 VM마다 별도 OS 필요 | 호스트 OS 공유 |
| 크기 | GB 단위 (수 GB~수십 GB) | MB 단위 (수십 MB~수백 MB) |
| 시작 속도 | 느림 (수십 초~분) | 빠름 (1~2초) |
| 리소스 사용 | 많음 (고정 할당) | 적음 (필요한 만큼만) |
| 이식성 | 낮음 | 높음 (어디서나 실행) |
| 용도 | 완전히 다른 OS 필요 시 | 애플리케이션 배포 |
시각적 비교
가상머신 구조:
┌─────────────────────────────────────┐
│ Application 1 │
│ ┌──────────────────────────────┐ │
│ │ Guest OS (Ubuntu) │ │
│ └──────────────────────────────┘ │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ Application 2 │
│ ┌──────────────────────────────┐ │
│ │ Guest OS (CentOS) │ │
│ └──────────────────────────────┘ │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ Hypervisor │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ Host OS (Ubuntu) │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ Hardware │
└─────────────────────────────────────┘
Docker 구조:
┌──────────┐ ┌──────────┐ ┌──────────┐
│Container1│ │Container2│ │Container3│
│WordPress │ │ MySQL │ │ Nginx │
└──────────┘ └──────────┘ └──────────┘
┌─────────────────────────────────────┐
│ Docker Engine │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ Host OS (Ubuntu) │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ Hardware │
└─────────────────────────────────────┘
실제 성능 비교 (8GB RAM 서버 기준)
| 시나리오 | VM 방식 | Docker 방식 |
|---|---|---|
| 워드프레스 1개 실행 | VM 1개 (2GB 할당) | 컨테이너 2개 (500MB 사용) |
| 시작 시간 | 30~60초 | 2~3초 |
| 디스크 사용 | 5~10GB | 500MB~1GB |
| 8GB에서 실행 가능 수 | 3~4개 | 10~15개 |
💡 Docker의 핵심 개념 5가지
1. 이미지 (Image)
정의: 컨테이너를 만들기 위한 ‘설치 패키지’ 또는 ‘템플릿’
예시:
wordpress:latest– 워드프레스 이미지mysql:8.0– MySQL 8.0 이미지nginx:alpine– 경량 Nginx 이미지
특징:
- 읽기 전용 (변경 불가)
- 여러 컨테이너가 하나의 이미지 공유 가능
- Docker Hub에서 다운로드 가능
# 이미지 검색
docker search wordpress
# 이미지 다운로드
docker pull wordpress:latest
# 다운받은 이미지 목록
docker images
2. 컨테이너 (Container)
정의: 이미지를 실행한 ‘프로세스’, 실제 작동하는 환경
특징:
- 이미지로부터 생성됨
- 독립적인 실행 환경 (파일시스템, 네트워크 등)
- 시작/중지/삭제 가능
- 여러 개 동시 실행 가능
# 컨테이너 생성 및 실행
docker run -d --name my-wordpress wordpress
# 실행 중인 컨테이너 확인
docker ps
# 모든 컨테이너 확인 (중지된 것 포함)
docker ps -a
# 컨테이너 중지
docker stop my-wordpress
# 컨테이너 시작
docker start my-wordpress
# 컨테이너 삭제
docker rm my-wordpress
3. Dockerfile
정의: 나만의 이미지를 만드는 ‘설계도’
예시:
# 간단한 Dockerfile 예시
FROM ubuntu:22.04
RUN apt update && apt install -y nginx
COPY index.html /var/www/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
# 이미지 빌드
docker build -t my-nginx .
# 실행
docker run -d -p 80:80 my-nginx
4. Docker Compose
정의: 여러 컨테이너를 한 번에 정의하고 실행하는 도구
왜 필요한가?
- 워드프레스는 웹서버 + 데이터베이스 필요
- 각각 따로 실행하면 복잡함
- docker-compose로 한 번에 관리
예시:
# docker-compose.yml
version: '3.8'
services:
wordpress:
image: wordpress:latest
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: wppassword
WORDPRESS_DB_NAME: wordpress
volumes:
- wordpress_data:/var/www/html
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: wppassword
volumes:
- db_data:/var/lib/mysql
volumes:
wordpress_data:
db_data:
# 한 줄로 전체 실행
docker-compose up -d
# 전체 중지 및 삭제
docker-compose down
5. 볼륨 (Volume)
정의: 컨테이너의 데이터를 영구 저장하는 공간
왜 필요한가?
- 컨테이너 삭제 시 내부 데이터도 삭제됨
- 볼륨에 저장하면 컨테이너 삭제 후에도 데이터 유지
- 호스트와 컨테이너 간 파일 공유 가능
# 볼륨 생성
docker volume create my-data
# 볼륨 연결해서 실행
docker run -d -v my-data:/var/lib/mysql mysql
# 호스트 디렉토리 마운트
docker run -d -v /home/user/data:/var/www/html wordpress
# 볼륨 목록
docker volume ls
# 볼륨 삭제
docker volume rm my-data
🎯 Docker를 써야 하는 실제 이유
1. 환경 일관성 보장
“내 컴퓨터에서는 되는데요?” 문제 해결
- 개발 환경과 실제 서버 환경 동일하게 유지
- 다른 서버로 이전 시 그대로 작동 보장
- 팀원 간 환경 통일
2. 빠른 배포 및 복구
전통 방식:
서버 설정 → 소프트웨어 설치 → 설정 파일 수정 → 테스트 → 문제 발생 시 처음부터
소요 시간: 1~2시간
Docker 방식:
docker-compose up -d
소요 시간: 2~3분
3. 리소스 효율성
실제 측정 (홈서버 8GB RAM 기준):
| 서비스 | VM 방식 | Docker 방식 |
|---|---|---|
| 워드프레스 + MySQL | 3GB RAM | 500MB RAM |
| Nginx 웹서버 | 1GB RAM | 50MB RAM |
| 총 5개 서비스 | 7~8GB (한계) | 2~3GB (여유) |
4. 격리성 (Isolation)
- 한 컨테이너에서 문제 발생해도 다른 컨테이너에 영향 없음
- 테스트용 환경 쉽게 구축 가능
- 버전 충돌 걱정 없음 (PHP 7.4와 8.1 동시 사용 가능)
5. 커뮤니티와 생태계
- Docker Hub에 공식 이미지 다수 (50만+ 이미지)
- 대부분의 소프트웨어가 Docker 이미지 제공
- 풍부한 예제와 문서
🧪 Docker 기본 명령어 실전 예제
예제 1: Hello World 컨테이너 실행
# 가장 간단한 테스트
docker run hello-world
무슨 일이 일어나는가?
- 로컬에 hello-world 이미지 있는지 확인
- 없으면 Docker Hub에서 자동 다운로드
- 컨테이너 생성 및 실행
- 메시지 출력 후 자동 종료
예제 2: Nginx 웹서버 실행
# Nginx 컨테이너 실행
docker run -d -p 8080:80 --name my-nginx nginx
# 브라우저에서 http://localhost:8080 접속
# "Welcome to nginx!" 페이지 확인
옵션 설명:
-d: 백그라운드 실행 (detached mode)-p 8080:80: 호스트 8080 포트를 컨테이너 80 포트로 연결--name my-nginx: 컨테이너 이름 지정
예제 3: 사용자 정의 웹페이지 서빙
# index.html 파일 생성
echo "My Home Server
" > index.html
# 볼륨 마운트로 실행
docker run -d -p 8080:80 -v $(pwd):/usr/share/nginx/html --name custom-nginx nginx
# 브라우저에서 확인 → "My Home Server" 표시됨
예제 4: 컨테이너 내부 접속하기
# 실행 중인 컨테이너 내부로 들어가기
docker exec -it my-nginx bash
# 컨테이너 내부에서 명령어 실행
root@container:/# ls /usr/share/nginx/html
root@container:/# cat /etc/nginx/nginx.conf
root@container:/# exit
예제 5: 컨테이너 로그 확인
# 로그 보기
docker logs my-nginx
# 실시간 로그 보기 (-f: follow)
docker logs -f my-nginx
# 최근 100줄만 보기
docker logs --tail 100 my-nginx
📊 Docker 리소스 사용량 모니터링
# 실행 중인 컨테이너 리소스 사용량
docker stats
# 특정 컨테이너만 보기
docker stats my-nginx
# 디스크 사용량 확인
docker system df
# 상세 정보
docker system df -v
출력 예시:
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O
abc123def456 my-nginx 0.05% 2.5MiB / 7.7GiB 0.03% 1.2kB / 0B
def789ghi012 wordpress 0.15% 150MiB / 7.7GiB 1.90% 15kB / 8kB
🧹 Docker 정리 명령어
# 중지된 컨테이너 전체 삭제
docker container prune
# 사용하지 않는 이미지 삭제
docker image prune
# 사용하지 않는 볼륨 삭제
docker volume prune
# 사용하지 않는 네트워크 삭제
docker network prune
# 전체 정리 (한 번에)
docker system prune -a
# 강제 정리 (확인 없이)
docker system prune -a -f
⚠️ Docker 사용 시 주의사항
1. 데이터 영속성
컨테이너 삭제 = 내부 데이터 삭제
❌ 잘못된 사용:
docker run -d mysql
# 데이터베이스 생성, 데이터 입력
docker rm -f mysql
# → 모든 데이터 날아감!
✅ 올바른 사용:
docker run -d -v mysql_data:/var/lib/mysql mysql
# 데이터는 mysql_data 볼륨에 저장
docker rm -f mysql
# → 컨테이너는 삭제되지만 데이터는 남음
2. 포트 충돌
같은 포트를 여러 컨테이너가 사용할 수 없음
# 첫 번째 컨테이너
docker run -d -p 80:80 nginx
# 두 번째 컨테이너 (에러 발생!)
docker run -d -p 80:80 apache
# Error: port is already allocated
# 해결: 다른 포트 사용
docker run -d -p 8080:80 apache
3. 리소스 제한
제한 없이 실행 시 시스템 리소스 전부 사용 가능
# 메모리 제한
docker run -d -m 512m mysql
# CPU 제한 (0.5 = 50%)
docker run -d --cpus="0.5" nginx
# docker-compose에서
services:
mysql:
image: mysql
deploy:
resources:
limits:
memory: 512M
cpus: '0.5'
4. 보안
- 공식 이미지 사용 권장 (Docker Hub Verified)
- latest 태그보다 특정 버전 사용 추천
- 불필요한 포트 노출 금지
- 중요 정보는 환경변수가 아닌 secrets 사용
📝 정리하며
이번 글에서는 Docker의 개념과 실전 활용법을 다뤘다. 핵심만 요약하면:
Docker 핵심 개념
- 이미지: 프로그램 설치 패키지
- 컨테이너: 실행 중인 프로그램 환경
- 볼륨: 데이터 영구 저장 공간
- Docker Compose: 여러 컨테이너 한 번에 관리
Docker의 장점
- 설치와 배포가 간편함 (명령어 몇 줄)
- 가볍고 빠름 (VM 대비 10배 이상 효율적)
- 환경 일관성 보장
- 문제 발생 시 빠른 복구
- 여러 앱 독립적 관리
주의사항
- 데이터는 반드시 볼륨에 저장
- 포트 충돌 주의
- 리소스 제한 설정 권장
- 공식 이미지 사용 및 보안 주의
다음 글에서는 우분투에 Docker를 실제로 설치하고, Docker Compose로 워드프레스를 설치하는 실습으로 이어질 예정이다.
이제부터 본격적으로 내 서버를 원하는 대로 꾸밀 수 있게 된다. 🚀
댓글 남기기