Docker란 무엇인가- 쉽게 이해하는 컨테이너 기술

Docker란 무엇인가? 쉽게 이해하는 컨테이너 기술

홈서버를 본격적으로 운영하려면 여러 프로그램들을 설치하고, 연결하고, 설정해야 한다.

예를 들어 웹서버(Nginx), 데이터베이스(MySQL), 워드프레스 등… 이걸 전부 수동으로 설치하려면 설정할 게 너무 많고, 잘못되면 하나 때문에 전체 시스템을 다시 깔아야 할 수도 있다.

그래서 등장한 게 바로 Docker(도커)다.

🐳 Docker란?

Docker는 컨테이너(Container) 기술 기반의 가상화 도구다. 쉽게 말해, 작고 가벼운 가상 머신이라고 보면 된다.

기존의 가상 머신(VM)은 운영체제를 통째로 띄우기 때문에 무겁고 느리지만, Docker는 내 서버의 OS 위에서 바로 실행되기 때문에 빠르고 가볍다.

👉 Docker는 프로그램을 ‘컨테이너’라는 독립된 공간에 담아 설치와 실행을 한 번에 할 수 있게 해주는 도구다.

🤔 왜 Docker가 필요할까? – 실제 사례로 이해하기

시나리오 1: 전통적인 방식 (Docker 없이)

워드프레스를 설치하려면 일반적으로는:

  1. 웹서버 설치
    sudo apt install nginx
    sudo nano /etc/nginx/sites-available/default
    # 설정 파일 수정...
    
  2. PHP 설치 및 설정
    sudo apt install php-fpm php-mysql
    sudo nano /etc/php/8.1/fpm/php.ini
    # PHP 설정...
    
  3. 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';
    
  4. 워드프레스 다운로드 및 설정
    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 연결 정보 입력...
    
  5. 권한 설정, 방화벽 설정, 서비스 재시작…

소요 시간: 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~10GB500MB~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 방식
워드프레스 + MySQL3GB RAM500MB RAM
Nginx 웹서버1GB RAM50MB 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

무슨 일이 일어나는가?

  1. 로컬에 hello-world 이미지 있는지 확인
  2. 없으면 Docker Hub에서 자동 다운로드
  3. 컨테이너 생성 및 실행
  4. 메시지 출력 후 자동 종료

예제 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로 워드프레스를 설치하는 실습으로 이어질 예정이다.

이제부터 본격적으로 내 서버를 원하는 대로 꾸밀 수 있게 된다. 🚀

댓글 남기기

댓글 남기기

광고 차단 알림

광고 클릭 제한을 초과하여 광고가 차단되었습니다.

단시간에 반복적인 광고 클릭은 시스템에 의해 감지되며, IP가 수집되어 사이트 관리자가 확인 가능합니다.