Docker 초보 가이드 – 컨테이너 개념부터 실전까지

“내 컴퓨터에서는 되는데 서버에서는 안 돼요” — 개발자가 가장 많이 하는 말입니다. Docker는 이 문제를 해결합니다. 앱을 실행에 필요한 모든 것(코드, 라이브러리, 설정)을 컨테이너라는 상자에 담아서, 어떤 환경에서든 동일하게 실행되도록 합니다. 이 글에서 Docker의 개념을 일상 비유로 쉽게 설명하고, 실제로 컨테이너를 실행해봅니다.

Docker를 택배에 비유하면

택배Docker
상품 (물건)내 애플리케이션 (코드)
포장 (박스+완충재)컨테이너 (코드+라이브러리+설정)
포장 규격Docker 이미지 (컨테이너 설계도)
택배 트럭Docker 엔진
어디서든 수령 가능어떤 서버에서든 동일하게 실행

물건을 상자에 잘 포장하면 택배가 어떤 트럭을 타든, 어디로 가든 물건은 안전합니다. Docker도 마찬가지로, 앱을 컨테이너에 담으면 개발 PC, 테스트 서버, 운영 서버 어디서든 동일하게 작동합니다.

핵심 개념 3가지

개념설명비유
이미지 (Image)컨테이너의 설계도/청사진레시피 (붕어빵 틀)
컨테이너 (Container)이미지를 실행한 인스턴스실제 붕어빵 (틀로 찍어낸 것)
Dockerfile이미지를 만드는 명령어 파일레시피 작성법

관계: Dockerfile → (빌드) → 이미지 → (실행) → 컨테이너

Docker vs 가상머신(VM)

Docker (컨테이너)가상머신 (VM)
OS호스트 OS 공유각각 별도 OS 설치
크기수십 MB수 GB
시작 시간수 초수 분
성능네이티브에 가까움오버헤드 있음
격리 수준프로세스 격리완전 격리
사용 사례마이크로서비스, CI/CD, 개발 환경다른 OS 필요 시

Docker 설치

OS방법
Ubuntu/Debiansudo apt install docker.io
MacDocker Desktop 다운로드 (docker.com)
WindowsDocker Desktop 다운로드 (WSL2 필요)
# 설치 확인
docker --version
# Docker version 24.0.x

# 권한 설정 (sudo 없이 사용)
sudo usermod -aG docker $USER
# 이후 로그아웃 후 재로그인

실습: 첫 번째 컨테이너 실행

# 1. Nginx 웹서버 컨테이너 실행
docker run -d -p 8080:80 --name my-web nginx

# 설명:
# -d          : 백그라운드 실행
# -p 8080:80  : 호스트 8080 포트 → 컨테이너 80 포트 연결
# --name      : 컨테이너 이름 지정
# nginx       : 사용할 이미지

# 2. 브라우저에서 확인
# http://localhost:8080 접속 → "Welcome to nginx!" 페이지

# 3. 실행 중인 컨테이너 확인
docker ps
# CONTAINER ID  IMAGE  STATUS  PORTS               NAMES
# abc123        nginx  Up      0.0.0.0:8080->80/tcp  my-web

# 4. 컨테이너 중지
docker stop my-web

# 5. 컨테이너 삭제
docker rm my-web

핵심 Docker 명령어

명령어설명예시
docker pull이미지 다운로드docker pull mysql:8.0
docker run컨테이너 생성+실행docker run -d -p 3306:3306 mysql
docker ps실행 중인 컨테이너docker ps -a (전체)
docker stop컨테이너 중지docker stop my-web
docker rm컨테이너 삭제docker rm my-web
docker images이미지 목록docker images
docker rmi이미지 삭제docker rmi nginx
docker logs로그 확인docker logs -f my-web
docker exec컨테이너 안에서 명령 실행docker exec -it my-web bash
docker buildDockerfile로 이미지 생성docker build -t myapp .

실습: Dockerfile로 나만의 이미지 만들기

간단한 Node.js 앱을 Docker로 실행하는 예시:

# 프로젝트 구조
my-app/
├── Dockerfile
├── package.json
└── app.js
# app.js
const http = require('http');
const server = http.createServer((req, res) => {
    res.end('Hello from Docker! 🐳');
});
server.listen(3000, () => console.log('Server running on port 3000'));
# Dockerfile
FROM node:20-alpine          # Node.js 20 이미지 기반
WORKDIR /app                 # 작업 디렉토리 설정
COPY package.json ./         # package.json 복사
RUN npm install              # 의존성 설치
COPY . .                     # 나머지 파일 복사
EXPOSE 3000                  # 3000번 포트 노출
CMD ["node", "app.js"]       # 실행 명령
# 이미지 빌드
docker build -t my-node-app .

# 컨테이너 실행
docker run -d -p 3000:3000 my-node-app

# 확인: http://localhost:3000 → "Hello from Docker! 🐳"

Docker가 쓰이는 실전 사례

사례설명
개발 환경 통일팀원 모두 같은 환경 (Node 20 + MySQL 8 + Redis)
CI/CDGitHub Actions에서 Docker로 테스트/배포 자동화
마이크로서비스각 서비스를 별도 컨테이너로 격리
로컬 DB 실행MySQL/PostgreSQL을 설치 없이 컨테이너로 실행

마무리

Docker의 핵심은 “Dockerfile 작성 → 이미지 빌드 → 컨테이너 실행” 3단계입니다. 오늘 할 일: Docker 설치 → docker run -d -p 8080:80 nginx 실행 → 브라우저에서 확인. 5분이면 첫 번째 컨테이너가 실행됩니다. “내 컴에서는 되는데”가 사라지는 순간을 경험해보세요.

Leave a Comment